Skip to content

Commit 7166bc7

Browse files

File tree

4 files changed

+29
-8
lines changed

4 files changed

+29
-8
lines changed

clang/docs/ReleaseNotes.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,7 @@ Bug Fixes to C++ Support
434434
- Suppress ``-Wdouble-promotion`` when explicitly asked for with C++ list initialization (#GH33409).
435435
- Fix the result of `__builtin_is_implicit_lifetime` for types with a user-provided constructor. (#GH160610)
436436
- Correctly deduce return types in ``decltype`` expressions. (#GH160497) (#GH56652) (#GH116319) (#GH161196)
437+
- Fixed a crash in the pre-C++23 warning for attributes before a lambda declarator (#GH161070).
437438

438439
Bug Fixes to AST Handling
439440
^^^^^^^^^^^^^^^^^^^^^^^^^

clang/include/clang/Basic/DiagnosticParseKinds.td

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1141,7 +1141,7 @@ def warn_cxx23_compat_binding_pack : Warning<
11411141
def err_capture_default_first : Error<
11421142
"capture default must be first">;
11431143
def ext_decl_attrs_on_lambda : ExtWarn<
1144-
"%select{an attribute specifier sequence|%0}1 in this position "
1144+
"%select{an attribute specifier sequence|%1}0 in this position "
11451145
"is a C++23 extension">, InGroup<CXX23AttrsOnLambda>;
11461146
def ext_lambda_missing_parens : ExtWarn<
11471147
"lambda without a parameter clause is a C++23 extension">,

clang/lib/Parse/ParseExprCXX.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ ExprResult Parser::ParseLambdaExpressionAfterIntroducer(
12991299
Diag(Tok, getLangOpts().CPlusPlus23
13001300
? diag::warn_cxx20_compat_decl_attrs_on_lambda
13011301
: diag::ext_decl_attrs_on_lambda)
1302-
<< Tok.getIdentifierInfo() << Tok.isRegularKeywordAttribute();
1302+
<< Tok.isRegularKeywordAttribute() << Tok.getIdentifierInfo();
13031303
MaybeParseCXX11Attributes(D);
13041304
}
13051305

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)