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:
parent
9c3602e40f
commit
b7c707d1d9
@ -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
|
||||
|
15
gcc/testsuite/g++.dg/template/cond3.C
Normal file
15
gcc/testsuite/g++.dg/template/cond3.C
Normal file
@ -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>();
|
Loading…
x
Reference in New Issue
Block a user