Skip to content

Commit cb5b183

Browse files
committed
[Clang] Avoid null deref in lambda attribute compat warning
1 parent 48a6f2f commit cb5b183

File tree

3 files changed

+29
-7
lines changed

3 files changed

+29
-7
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,8 @@ Bug Fixes to C++ Support
432432
- Fix an assertion failure when taking the address on a non-type template parameter argument of
433433
object type. (#GH151531)
434434
- Suppress ``-Wdouble-promotion`` when explicitly asked for with C++ list initialization (#GH33409).
435+
- Fixed a crash in the pre-C++23 warning for attributes before a lambda
436+
declarator by unifying format args to ``%0`` as attribute name, ``%1`` as selector (#GH161070).
435437

436438
Bug Fixes to AST Handling
437439
^^^^^^^^^^^^^^^^^^^^^^^^^

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1147,7 +1147,7 @@ def ext_lambda_missing_parens : ExtWarn<
11471147
"lambda without a parameter clause is a C++23 extension">,
11481148
InGroup<CXX23>;
11491149
def warn_cxx20_compat_decl_attrs_on_lambda : Warning<
1150-
"%select{an attribute specifier sequence|%1}0 in this position "
1150+
"%select{an attribute specifier sequence|%0}1 in this position "
11511151
"is incompatible with C++ standards before C++23">,
11521152
InGroup<CXXPre23Compat>, DefaultIgnore;
11531153

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
// RUN: %clang_cc1 -std=c++20 %s -verify=cxx20
2-
// RUN: %clang_cc1 -std=c++23 %s -verify=cxx23
3-
// RUN: %clang_cc1 -std=c++23 -Wpre-c++23-compat %s -verify=precxx23
4-
// RUN: %clang_cc1 -std=c++23 -pedantic %s -verify=cxx23
5-
6-
//cxx23-no-diagnostics
1+
// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++20 %s -verify=cxx20
2+
// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++23 %s -verify=cxx23
3+
// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++23 -Wpre-c++23-compat %s -verify=precxx23
4+
// RUN: %clang_cc1 -triple aarch64-unknown-linux-gnu -target-feature +sme -std=c++23 -pedantic %s -verify=cxx23
75

86
auto L1 = [] constexpr {};
97
// cxx20-warning@-1 {{lambda without a parameter clause is a C++23 extension}}
@@ -14,3 +12,25 @@ auto L3 = [] static {};
1412
// cxx20-warning@-1 {{lambda without a parameter clause is a C++23 extension}}
1513
// cxx20-warning@-2 {{static lambdas are a C++23 extension}}
1614
// precxx23-warning@-3 {{static lambdas are incompatible with C++ standards before C++23}}
15+
16+
namespace GH161070 {
17+
void t1() { int a = [] __arm_streaming; }
18+
// precxx23-error@-1 {{'__arm_streaming' cannot be applied to a declaration}}
19+
// precxx23-error@-2 {{expected body of lambda expression}}
20+
// cxx23-error@-3 {{'__arm_streaming' cannot be applied to a declaration}}
21+
// cxx23-error@-4 {{expected body of lambda expression}}
22+
// cxx20-error@-5 {{'__arm_streaming' cannot be applied to a declaration}}
23+
// cxx20-error@-6 {{expected body of lambda expression}}
24+
// cxx20-warning@-7 {{'__arm_streaming' in this position is a C++23 extension}}
25+
// precxx23-warning@-8 {{'__arm_streaming' in this position is incompatible with C++ standards before C++23}}
26+
27+
void t2() { int a = [] [[assume(true)]]; }
28+
// precxx23-error@-1 {{'assume' attribute cannot be applied to a declaration}}
29+
// precxx23-error@-2 {{expected body of lambda expression}}
30+
// cxx23-error@-3 {{'assume' attribute cannot be applied to a declaration}}
31+
// cxx23-error@-4 {{expected body of lambda expression}}
32+
// cxx20-error@-5 {{'assume' attribute cannot be applied to a declaration}}
33+
// cxx20-error@-6 {{expected body of lambda expression}}
34+
// cxx20-warning@-7 {{an attribute specifier sequence in this position is a C++23 extension}}
35+
// precxx23-warning@-8 {{an attribute specifier sequence in this position is incompatible with C++ standards before C++23}}
36+
}

0 commit comments

Comments
 (0)