diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 9a4626415c8..16e3e181d22 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -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 diff --git a/gcc/testsuite/g++.dg/template/static28.C b/gcc/testsuite/g++.dg/template/static28.C new file mode 100644 index 00000000000..eb5ec5313e5 --- /dev/null +++ b/gcc/testsuite/g++.dg/template/static28.C @@ -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( 0)) + }; +}; +int main() +{ + N n; +}