https://gcc.gnu.org/g:0ee1ade8fafd92c95c1318f9207dbf1ce203ca61
commit r16-6207-g0ee1ade8fafd92c95c1318f9207dbf1ce203ca61 Author: benwu25 <[email protected]> Date: Wed Dec 17 18:59:05 2025 +0700 c++: clear in_declarator_p before parsing a lambda [PR121443] We should set parser->in_declarator_p to false when parsing a lambda. In this testcase, for example, a lambda in a function declarator could contain a constructor, which would be disallowed in cp_parser_decl_specifier_seq since in_declarator_p was true. PR c++/121443 gcc/cp/ChangeLog: * parser.cc (cp_parser_lambda_expression): Clear in_declarator_p. gcc/testsuite/ChangeLog: * g++.dg/parse/pr121443.C: New test. Reviewed-by: Jason Merrill <[email protected]> Diff: --- gcc/cp/parser.cc | 3 +++ gcc/testsuite/g++.dg/parse/pr121443.C | 11 +++++++++++ 2 files changed, 14 insertions(+) diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 394725fde394..be01cfdefe2b 100644 --- a/gcc/cp/parser.cc +++ b/gcc/cp/parser.cc @@ -12041,6 +12041,7 @@ cp_parser_lambda_expression (cp_parser* parser, = parser->auto_is_implicit_function_template_parm_p; 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; parser->num_template_parameter_lists = 0; parser->in_statement = 0; @@ -12051,6 +12052,7 @@ cp_parser_lambda_expression (cp_parser* parser, parser->auto_is_implicit_function_template_parm_p = false; parser->omp_array_section_p = false; parser->in_template_argument_list_p = false; + parser->in_declarator_p = false; /* Inside the lambda, outside unevaluated context do not apply. */ cp_evaluated ev; @@ -12118,6 +12120,7 @@ cp_parser_lambda_expression (cp_parser* parser, = auto_is_implicit_function_template_parm_p; parser->omp_array_section_p = saved_omp_array_section_p; parser->in_template_argument_list_p = saved_in_targ; + parser->in_declarator_p = saved_in_declarator_p; } /* This lambda shouldn't have any proxies left at this point. */ diff --git a/gcc/testsuite/g++.dg/parse/pr121443.C b/gcc/testsuite/g++.dg/parse/pr121443.C new file mode 100644 index 000000000000..023d25f20140 --- /dev/null +++ b/gcc/testsuite/g++.dg/parse/pr121443.C @@ -0,0 +1,11 @@ +// PR c++/121443 +// { dg-do compile { target c++11 } } + +void f(int i = []() { + struct X { + int val; + X(int v) : val(v) { } + }; + X x(2); + return x.val; +}()) {}
