re PR c++/29518 (rejects valid template argument, enums vs templates)
PR c++/29518 * pt.c (coerce_template_parms): Do not skip_evaluation while substituting template arguments. PR c++/29518 * g++.dg/template/static28.C: New test. From-SVN: r118767
This commit is contained in:
parent
f4c0a30368
commit
a2c5ed873e
2 changed files with 21 additions and 1 deletions
|
@ -4131,6 +4131,7 @@ coerce_template_parms (tree parms,
|
|||
tree inner_args;
|
||||
tree new_args;
|
||||
tree new_inner_args;
|
||||
bool saved_skip_evaluation;
|
||||
|
||||
inner_args = INNERMOST_TEMPLATE_ARGS (args);
|
||||
nargs = inner_args ? NUM_TMPL_ARGS (inner_args) : 0;
|
||||
|
@ -4155,6 +4156,10 @@ coerce_template_parms (tree parms,
|
|||
return error_mark_node;
|
||||
}
|
||||
|
||||
/* We need to evaluate the template arguments, even though this
|
||||
template-id may be nested within a "sizeof". */
|
||||
saved_skip_evaluation = skip_evaluation;
|
||||
skip_evaluation = false;
|
||||
new_inner_args = make_tree_vec (nparms);
|
||||
new_args = add_outermost_template_args (args, new_inner_args);
|
||||
for (i = 0; i < nparms; i++)
|
||||
|
@ -4196,6 +4201,7 @@ coerce_template_parms (tree parms,
|
|||
lost++;
|
||||
TREE_VEC_ELT (new_inner_args, i) = arg;
|
||||
}
|
||||
skip_evaluation = saved_skip_evaluation;
|
||||
|
||||
if (lost)
|
||||
return error_mark_node;
|
||||
|
@ -7261,7 +7267,6 @@ tsubst (tree t, tree args, tsubst_flags_t complain, tree in_decl)
|
|||
|
||||
max = tsubst_expr (omax, args, complain, in_decl,
|
||||
/*integral_constant_expression_p=*/false);
|
||||
max = fold_non_dependent_expr (max);
|
||||
max = fold_decl_constant_value (max);
|
||||
|
||||
if (TREE_CODE (max) != INTEGER_CST
|
||||
|
|
15
gcc/testsuite/g++.dg/template/static28.C
Normal file
15
gcc/testsuite/g++.dg/template/static28.C
Normal file
|
@ -0,0 +1,15 @@
|
|||
// PR c++/29518
|
||||
|
||||
template< bool C > int assertion_failed( int);
|
||||
template< class >
|
||||
struct N
|
||||
{
|
||||
static bool const okay = true;
|
||||
enum {
|
||||
t = sizeof( assertion_failed<okay>( 0))
|
||||
};
|
||||
};
|
||||
int main()
|
||||
{
|
||||
N<int> n;
|
||||
}
|
Loading…
Add table
Reference in a new issue