]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
c++: clear in_declarator_p before parsing a lambda [PR121443]
authorbenwu25 <soggysocks206@gmail.com>
Wed, 17 Dec 2025 11:59:05 +0000 (18:59 +0700)
committerJason Merrill <jason@redhat.com>
Wed, 17 Dec 2025 11:59:05 +0000 (18:59 +0700)
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 <jason@redhat.com>
gcc/cp/parser.cc
gcc/testsuite/g++.dg/parse/pr121443.C [new file with mode: 0644]

index 394725fde394d1d3599c15ff5b573285ee62ba2a..be01cfdefe2b96101c973b5e5150e6ab61183230 100644 (file)
@@ -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 (file)
index 0000000..023d25f
--- /dev/null
@@ -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;
+}()) {}