Commit b7c707d1 by Mark Mitchell Committed by Mark Mitchell

re PR c++/13833 (Conversion problem in template function)

	PR c++/13833
	* call.c (build_over_call): Do not convert arguments when
	processing a template.
	* pt.c (build_non_dependent_expr): Do not build a
	NON_DEPENDENT_EXPR for arithmetic constants.

	PR c++/13833
	* g++.dg/template/cond3.C: New test.

From-SVN: r76616
parent 9c3602e4
2004-01-25 Mark Mitchell <mark@codesourcery.com>
PR c++/13833
* call.c (build_over_call): Do not convert arguments when
processing a template.
* pt.c (build_non_dependent_expr): Do not build a
NON_DEPENDENT_EXPR for arithmetic constants.
2004-01-25 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/13810
......
......@@ -4306,6 +4306,21 @@ build_over_call (struct z_candidate *cand, int flags)
int i = 0;
int is_method = 0;
/* In a template, there is no need to perform all of the work that
is normally done. We are only interested in the type of the call
expression, i.e., the return type of the function. Any semantic
errors will be deferred until the template is instantiated. */
if (processing_template_decl)
{
tree expr;
tree return_type;
return_type = TREE_TYPE (TREE_TYPE (fn));
expr = build (CALL_EXPR, return_type, fn, args);
if (!VOID_TYPE_P (return_type))
require_complete_type (return_type);
return convert_from_reference (expr);
}
/* Give any warnings we noticed during overload resolution. */
if (cand->warnings)
for (val = cand->warnings; val; val = TREE_CHAIN (val))
......
......@@ -11993,6 +11993,10 @@ build_non_dependent_expr (tree expr)
cannot be used to initialize a "char *". */
if (TREE_CODE (expr) == STRING_CST)
return expr;
/* Preserve arithmetic constants, as an optimization -- there is no
reason to create a new node. */
if (TREE_CODE (expr) == INTEGER_CST || TREE_CODE (expr) == REAL_CST)
return expr;
if (TREE_CODE (expr) == COND_EXPR)
return build (COND_EXPR,
......
2004-01-25 Mark Mitchell <mark@codesourcery.com>
PR c++/13833
* g++.dg/template/cond3.C: New test.
2004-01-25 Giovanni Bajo <giovannibajo@gcc.gnu.org>
PR c++/13810
......
// PR c++/13833
struct X {
template <typename T>
X & operator << (const T &t);
X & operator<< (int& (*p) (int&));
};
X x;
template <int> void foo () {
x << (1 ? "ok" : "failed");
}
template void foo<1>();
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment