Here after resolving the address of a template-id inside decltype, we
end up instantiating the chosen specialization (from the call to
mark_used in resolve_nondeduced_context), even though only its type is
needed.
This patch sets cp_unevaluated_operand throughout finish_decltype_type,
so that in particular it's set during the call to
resolve_nondeduced_context within.
gcc/cp/ChangeLog:
PR c++/71879
* semantics.c (finish_decltype_type): Set up a cp_unevaluated
sentinel at the start of the function. Remove a now-redundant
manual adjustment of cp_unevaluated_operand.
gcc/testsuite/ChangeLog:
PR c++/71879
* g++.dg/cpp0x/decltype-71879.C: New test.
return error_mark_node;
}
+ /* decltype is an unevaluated context. */
+ cp_unevaluated u;
+
/* Depending on the resolution of DR 1172, we may later need to distinguish
instantiation-dependent but not type-dependent expressions so that, say,
A<decltype(sizeof(T))>::U doesn't require 'typename'. */
}
else if (processing_template_decl)
{
- ++cp_unevaluated_operand;
expr = instantiate_non_dependent_expr_sfinae (expr, complain);
- --cp_unevaluated_operand;
if (expr == error_mark_node)
return error_mark_node;
}
--- /dev/null
+// PR c++/71879
+// { dg-do compile { target c++11 } }
+
+template <class T> void f(T x) { x.fail(); }
+using R = decltype(&f<int>);