2
0
mirror of git://gcc.gnu.org/git/gcc.git synced 2025-04-10 09:00:38 +08:00

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
This commit is contained in:
Mark Mitchell 2004-01-26 03:13:49 +00:00 committed by Mark Mitchell
parent 9c3602e40f
commit b7c707d1d9
5 changed files with 47 additions and 0 deletions
gcc
cp
testsuite
ChangeLog
g++.dg/template

@ -1,3 +1,11 @@
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,

@ -1,3 +1,8 @@
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

@ -0,0 +1,15 @@
// 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>();