From: benwu25 Date: Wed, 17 Dec 2025 11:59:05 +0000 (+0700) Subject: c++: clear in_declarator_p before parsing a lambda [PR121443] X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0ee1ade8fafd92c95c1318f9207dbf1ce203ca61;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/cp/parser.cc b/gcc/cp/parser.cc index 394725fde39..be01cfdefe2 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 00000000000..023d25f2014 --- /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; +}()) {}