On Tue, 9 Dec 2025, Egas Ribeiro wrote: > Bootstrapped and regtested on x86_64-pc-linux-gnu. > > -- >8 -- > > 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 this by temporarily clearing processing_template_parmlist when > parsing lambda parameters.
Makes sense. > > PR c++/117518 > > gcc/cp/ChangeLog: > > * parser.cc (cp_parser_lambda_declarator_opt): Clear > processing_template_parmlist when parsing lambda parameters. > > gcc/testsuite/ChangeLog: > > * g++.dg/cpp1z/lambda-default-template-117518.C: New test. > > Signed-off-by: Egas Ribeiro <[email protected]> > --- > gcc/cp/parser.cc | 2 ++ > gcc/testsuite/g++.dg/cpp1z/lambda-default-template-117518.C | 3 +++ > 2 files changed, 5 insertions(+) > create mode 100644 > gcc/testsuite/g++.dg/cpp1z/lambda-default-template-117518.C > > diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc > index cdfa8f0122d..3dc3263f59d 100644 > --- a/gcc/cp/parser.cc > +++ b/gcc/cp/parser.cc > @@ -12550,6 +12550,8 @@ cp_parser_lambda_declarator_opt (cp_parser* parser, > tree lambda_expr, > begin_scope (sk_function_parms, /*entity=*/NULL_TREE); > > /* Parse parameters. */ > + auto parmlist_sentinel > + = make_temp_override (processing_template_parmlist, 0); > param_list > = cp_parser_parameter_declaration_clause > (parser, CP_PARSER_FLAGS_TYPENAME_OPTIONAL, /*lambda_p=*/true); > diff --git a/gcc/testsuite/g++.dg/cpp1z/lambda-default-template-117518.C > b/gcc/testsuite/g++.dg/cpp1z/lambda-default-template-117518.C > new file mode 100644 > index 00000000000..55318943acf > --- /dev/null > +++ b/gcc/testsuite/g++.dg/cpp1z/lambda-default-template-117518.C > @@ -0,0 +1,3 @@ > +// { dg-do compile { target c++20 } } > +// PR c++/117518 > +template <auto = []<int> (auto) {}> int x; Could you move this test into the c++2a dir? Other such tests there are named lambda-targNNN.C Could you also instantiate x using the default targ? > -- > 2.52.0 > >
