When a lambda with explicit template parameters like []<int> also has
implicit template parameters from auto, and is used as a default
template argument, processing_template_parmlist remained set
from the outer template context. This caused
function_being_declared_is_template_p to incorrectly return false,
leading synthesize_implicit_template_parm to create a new template
scope instead of extending the existing one, resulting in a binding
level mismatch and an ICE in poplevel_class.
Fix by clearing processing_template_parmlist in
cp_parser_lambda_expression alongside the other parser state
save/restore operations.
PR c++/117518
gcc/cp/ChangeLog:
* parser.cc (cp_parser_lambda_expression): Clear
processing_template_parmlist when parsing lambda body.
gcc/testsuite/ChangeLog:
* g++.dg/cpp2a/lambda-targ19.C: New test.
Signed-off-by: Egas Ribeiro <egas.g.ribeiro@gmail.com>
Reviewed-by: Jason Merrill <jason@redhat.com>
bool saved_omp_array_section_p = parser->omp_array_section_p;
bool saved_in_targ = parser->in_template_argument_list_p;
bool saved_in_declarator_p = parser->in_declarator_p;
+ auto parmlist_sentinel
+ = make_temp_override (processing_template_parmlist, 0);
parser->num_template_parameter_lists = 0;
parser->in_statement = 0;
--- /dev/null
+// { dg-do compile { target c++20 } }
+// PR c++/117518
+template <auto = []<int> (auto) {}> int x;
+int y = x<>;