On 11.09.2013 16:25, Jason Merrill wrote:
On 09/11/2013 10:42 AM, Jason Merrill wrote:
Sounds like the problem is that the compiler is trying to
instantiate a
function while cp_unevaluated_operand is set. But that shouldn't be
an
issue because push_to_top_level clears cp_unevaluated_operand. How
does
it come to be set when instantiating the local variable?
Ah, I see: it's because instantiate_decl doesn't push_to_top_level
for function-local templates. We still need to save/restore
cp_unevaluated_operand in that case, and let's also do
c_inhibit_evaluation_warnings.
Great, that fixes it. Hadn't noticed it didn't happen a namespace
scope.
Okay for the attached to go to trunk with suitable changelog?
diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c
index 22087fb..16e57b5 100644
--- a/gcc/cp/pt.c
+++ b/gcc/cp/pt.c
@@ -18947,6 +18947,8 @@ instantiate_decl (tree d, int defer_ok,
tree gen_tmpl;
bool pattern_defined;
location_t saved_loc = input_location;
+ int saved_unevaluated_operand = cp_unevaluated_operand;
+ int saved_inhibit_evaluation_warnings = c_inhibit_evaluation_warnings;
bool external_p;
tree fn_context;
bool nested;
@@ -19158,8 +19160,13 @@ instantiate_decl (tree d, int defer_ok,
nested = (current_function_decl != NULL_TREE);
if (!fn_context)
push_to_top_level ();
- else if (nested)
- push_function_context ();
+ else
+ {
+ if (nested)
+ push_function_context ();
+ cp_unevaluated_operand = 0;
+ c_inhibit_evaluation_warnings = 0;
+ }
/* Mark D as instantiated so that recursive calls to
instantiate_decl do not try to instantiate it again. */
@@ -19283,6 +19290,8 @@ instantiate_decl (tree d, int defer_ok,
out:
input_location = saved_loc;
+ cp_unevaluated_operand = saved_unevaluated_operand;
+ c_inhibit_evaluation_warnings = saved_inhibit_evaluation_warnings;
pop_deferring_access_checks ();
pop_tinst_level ();