[clang] [Clang] Avoid null deref in lambda attribute compat warning (PR #161096)

Oleksandr T. via cfe-commits cfe-commits at lists.llvm.org
Sun Sep 28 13:57:20 PDT 2025


https://github.com/a-tarasyuk created https://github.com/llvm/llvm-project/pull/161096

Fixes #161070

---

This PR addresses the issue in `warn_cxx20_compat_decl_attrs_on_lambda` by using `%0`=_attribute name_ and `%1`=_selector_, which prevents a null `IdentifierInfo*`.

https://github.com/llvm/llvm-project/blob/48a6f2f85c8269d8326c185016801a4eb8d5dfd6/clang/lib/Parse/ParseExprCXX.cpp#L1299-L1302

https://github.com/llvm/llvm-project/blob/48a6f2f85c8269d8326c185016801a4eb8d5dfd6/clang/include/clang/Basic/DiagnosticParseKinds.td#L1143-L1145

https://github.com/llvm/llvm-project/blob/48a6f2f85c8269d8326c185016801a4eb8d5dfd6/clang/include/clang/Basic/DiagnosticParseKinds.td#L1149-L1152



>From 93f5df3ea986b641337cd93c6a0d635b3ee464cf 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] [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 | 24 +++++++++++++++++--
 3 files changed, 25 insertions(+), 3 deletions(-)

diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 98c889c08b329..ecd46336c9196 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``=attribute name, ``%1``=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..8af236881088d 100644
--- a/clang/test/Parser/cxx2b-lambdas-ext-warns.cpp
+++ b/clang/test/Parser/cxx2b-lambdas-ext-warns.cpp
@@ -3,8 +3,6 @@
 // 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
-
 auto L1 = [] constexpr {};
 // cxx20-warning at -1 {{lambda without a parameter clause is a C++23 extension}}
 auto L2 = []() static {};
@@ -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}}
+}



More information about the cfe-commits mailing list