[clang] [Clang] Avoid null deref in lambda attribute compat warning (PR #161096)
Oleksandr T. via cfe-commits
cfe-commits at lists.llvm.org
Mon Sep 29 04:58:32 PDT 2025
https://github.com/a-tarasyuk updated https://github.com/llvm/llvm-project/pull/161096
>From cb5b1831921092d5dcf96f452f6dee367bfb18a1 Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <oleksandr.tarasiuk at outlook.com>
Date: Sun, 28 Sep 2025 23:45:51 +0300
Subject: [PATCH 1/3] [Clang] Avoid null deref in lambda attribute compat
warning
---
clang/docs/ReleaseNotes.rst | 2 ++
.../clang/Basic/DiagnosticParseKinds.td | 2 +-
clang/test/Parser/cxx2b-lambdas-ext-warns.cpp | 32 +++++++++++++++----
3 files changed, 29 insertions(+), 7 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 98c889c08b329..1e8c2cc35e37f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -432,6 +432,8 @@ Bug Fixes to C++ Support
- Fix an assertion failure when taking the address on a non-type template parameter argument of
object type. (#GH151531)
- Suppress ``-Wdouble-promotion`` when explicitly asked for with C++ list initialization (#GH33409).
+- Fixed a crash in the pre-C++23 warning for attributes before a lambda
+ declarator by unifying format args to ``%0`` as attribute name, ``%1`` as selector (#GH161070).
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 4d9e123eb4ef1..a098db58eac23 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1147,7 +1147,7 @@ def ext_lambda_missing_parens : ExtWarn<
"lambda without a parameter clause is a C++23 extension">,
InGroup<CXX23>;
def warn_cxx20_compat_decl_attrs_on_lambda : Warning<
- "%select{an attribute specifier sequence|%1}0 in this position "
+ "%select{an attribute specifier sequence|%0}1 in this position "
"is incompatible with C++ standards before C++23">,
InGroup<CXXPre23Compat>, DefaultIgnore;
diff --git a/clang/test/Parser/cxx2b-lambdas-ext-warns.cpp b/clang/test/Parser/cxx2b-lambdas-ext-warns.cpp
index 7ffb7aae9d391..8c7a77815d47c 100644
--- a/clang/test/Parser/cxx2b-lambdas-ext-warns.cpp
+++ b/clang/test/Parser/cxx2b-lambdas-ext-warns.cpp
@@ -1,9 +1,7 @@
-// RUN: %clang_cc1 -std=c++20 %s -verify=cxx20
-// RUN: %clang_cc1 -std=c++23 %s -verify=cxx23
-// RUN: %clang_cc1 -std=c++23 -Wpre-c++23-compat %s -verify=precxx23
-// RUN: %clang_cc1 -std=c++23 -pedantic %s -verify=cxx23
-
-//cxx23-no-diagnostics
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++20 %s -verify=cxx20
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++23 %s -verify=cxx23
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++23 -Wpre-c++23-compat %s -verify=precxx23
+// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++23 -pedantic %s -verify=cxx23
auto L1 = [] constexpr {};
// cxx20-warning at -1 {{lambda without a parameter clause is a C++23 extension}}
@@ -14,3 +12,25 @@ auto L3 = [] static {};
// cxx20-warning at -1 {{lambda without a parameter clause is a C++23 extension}}
// cxx20-warning at -2 {{static lambdas are a C++23 extension}}
// precxx23-warning at -3 {{static lambdas are incompatible with C++ standards before C++23}}
+
+namespace GH161070 {
+void t1() { int a = [] __arm_streaming; }
+// precxx23-error at -1 {{'__arm_streaming' cannot be applied to a declaration}}
+// precxx23-error at -2 {{expected body of lambda expression}}
+// cxx23-error at -3 {{'__arm_streaming' cannot be applied to a declaration}}
+// cxx23-error at -4 {{expected body of lambda expression}}
+// cxx20-error at -5 {{'__arm_streaming' cannot be applied to a declaration}}
+// cxx20-error at -6 {{expected body of lambda expression}}
+// cxx20-warning at -7 {{'__arm_streaming' in this position is a C++23 extension}}
+// precxx23-warning at -8 {{'__arm_streaming' in this position is incompatible with C++ standards before C++23}}
+
+void t2() { int a = [] [[assume(true)]]; }
+// precxx23-error at -1 {{'assume' attribute cannot be applied to a declaration}}
+// precxx23-error at -2 {{expected body of lambda expression}}
+// cxx23-error at -3 {{'assume' attribute cannot be applied to a declaration}}
+// cxx23-error at -4 {{expected body of lambda expression}}
+// cxx20-error at -5 {{'assume' attribute cannot be applied to a declaration}}
+// cxx20-error at -6 {{expected body of lambda expression}}
+// cxx20-warning at -7 {{an attribute specifier sequence in this position is a C++23 extension}}
+// precxx23-warning at -8 {{an attribute specifier sequence in this position is incompatible with C++ standards before C++23}}
+}
>From f60f931cb85ffb7fc6fc1a1ae3f1bc06ec28a00e Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <oleksandr.tarasiuk at outlook.com>
Date: Mon, 29 Sep 2025 13:08:21 +0300
Subject: [PATCH 2/3] update diagnostic args order
---
clang/include/clang/Basic/DiagnosticParseKinds.td | 4 ++--
clang/lib/Parse/ParseExprCXX.cpp | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index a098db58eac23..c724136a7fdaf 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1141,13 +1141,13 @@ def warn_cxx23_compat_binding_pack : Warning<
def err_capture_default_first : Error<
"capture default must be first">;
def ext_decl_attrs_on_lambda : ExtWarn<
- "%select{an attribute specifier sequence|%0}1 in this position "
+ "%select{an attribute specifier sequence|%1}0 in this position "
"is a C++23 extension">, InGroup<CXX23AttrsOnLambda>;
def ext_lambda_missing_parens : ExtWarn<
"lambda without a parameter clause is a C++23 extension">,
InGroup<CXX23>;
def warn_cxx20_compat_decl_attrs_on_lambda : Warning<
- "%select{an attribute specifier sequence|%0}1 in this position "
+ "%select{an attribute specifier sequence|%1}0 in this position "
"is incompatible with C++ standards before C++23">,
InGroup<CXXPre23Compat>, DefaultIgnore;
diff --git a/clang/lib/Parse/ParseExprCXX.cpp b/clang/lib/Parse/ParseExprCXX.cpp
index 8605ba2cdb49b..a2c69578d5087 100644
--- a/clang/lib/Parse/ParseExprCXX.cpp
+++ b/clang/lib/Parse/ParseExprCXX.cpp
@@ -1299,7 +1299,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
Diag(Tok, getLangOpts().CPlusPlus23
? diag::warn_cxx20_compat_decl_attrs_on_lambda
: diag::ext_decl_attrs_on_lambda)
- << Tok.getIdentifierInfo() << Tok.isRegularKeywordAttribute();
+ << Tok.isRegularKeywordAttribute() << Tok.getIdentifierInfo();
MaybeParseCXX11Attributes(D);
}
>From a456d05b7f150b4a3cd2af8d768474cd5cb74e7f Mon Sep 17 00:00:00 2001
From: Oleksandr Tarasiuk <oleksandr.tarasiuk at outlook.com>
Date: Mon, 29 Sep 2025 13:47:42 +0300
Subject: [PATCH 3/3] update release notes
---
clang/docs/ReleaseNotes.rst | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index e553e1b399976..db71f1460888f 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -432,8 +432,7 @@ Bug Fixes to C++ Support
- Fix an assertion failure when taking the address on a non-type template parameter argument of
object type. (#GH151531)
- Suppress ``-Wdouble-promotion`` when explicitly asked for with C++ list initialization (#GH33409).
-- Fixed a crash in the pre-C++23 warning for attributes before a lambda
- declarator by unifying format args to ``%0`` as attribute name, ``%1`` as selector (#GH161070).
+- Fixed a crash in the pre-C++23 warning for attributes before a lambda declarator (#GH161070).
Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
More information about the cfe-commits
mailing list