Bootstrapped and regtested on x86_64-pc-linux-gnu.
See 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
From de77fed326f69b0ed09a3e089f0dce31ddafb933 Mon Sep 17 00:00:00 2001
From: benwu25 <[email protected]>
Date: Tue, 16 Dec 2025 16:17:08 -0800
Subject: [PATCH] c++: clear in_declarator_p before parsing a lambda [PR121443]
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