On 12/17/25 9:12 AM, Ben Wu wrote:
Whoops, here is a revised patch; misspelled cp_parser_decl_specifier_seq and wrong ChangeLog order.

Pushed, thanks.

-- 8< --

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.
---
  gcc/cp/parser.cc                      |  3 +++
  gcc/testsuite/g++.dg/parse/pr121443.C | 11 +++++++++++
  2 files changed, 14 insertions(+)
  create mode 100644 gcc/testsuite/g++.dg/parse/pr121443.C

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


On Tue, Dec 16, 2025 at 4:58 PM Ben Wu <[email protected] <mailto:[email protected]>> wrote:

    Bootstrapped and regtested on x86_64-pc-linux-gnu.

    See https://gcc.gnu.org/pipermail/gcc-patches/2025-
    December/703653.html <https://gcc.gnu.org/pipermail/gcc-
    patches/2025-December/703653.html> for v1 patch.

    Please use the attached patch file if applying, thanks!

    -- 8< --

    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.

    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_sec since in_declarator_p was true.
    ---
      gcc/cp/parser.cc                      |  3 +++
      gcc/testsuite/g++.dg/parse/pr121443.C | 11 +++++++++++
      2 files changed, 14 insertions(+)
      create mode 100644 gcc/testsuite/g++.dg/parse/pr121443.C

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


Reply via email to