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;
+}()) {}

Reply via email to