Skip to content
1 change: 1 addition & 0 deletions clang/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,7 @@ Bug Fixes to C++ Support
- Suppress ``-Wdouble-promotion`` when explicitly asked for with C++ list initialization (#GH33409).
- Fix the result of `__builtin_is_implicit_lifetime` for types with a user-provided constructor. (#GH160610)
- Correctly deduce return types in ``decltype`` expressions. (#GH160497) (#GH56652) (#GH116319) (#GH161196)
- Fixed a crash in the pre-C++23 warning for attributes before a lambda declarator (#GH161070).

Bug Fixes to AST Handling
^^^^^^^^^^^^^^^^^^^^^^^^^
Expand Down
2 changes: 1 addition & 1 deletion clang/include/clang/Basic/DiagnosticParseKinds.td
Original file line number Diff line number Diff line change
Expand Up @@ -1141,7 +1141,7 @@ 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">,
Expand Down
2 changes: 1 addition & 1 deletion clang/lib/Parse/ParseExprCXX.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}

Expand Down
32 changes: 26 additions & 6 deletions clang/test/Parser/cxx2b-lambdas-ext-warns.cpp
Original file line number Diff line number Diff line change
@@ -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@-1 {{lambda without a parameter clause is a C++23 extension}}
Expand All @@ -14,3 +12,25 @@ auto L3 = [] static {};
// cxx20-warning@-1 {{lambda without a parameter clause is a C++23 extension}}
// cxx20-warning@-2 {{static lambdas are a C++23 extension}}
// precxx23-warning@-3 {{static lambdas are incompatible with C++ standards before C++23}}

namespace GH161070 {
void t1() { int a = [] __arm_streaming; }
// precxx23-error@-1 {{'__arm_streaming' cannot be applied to a declaration}}
// precxx23-error@-2 {{expected body of lambda expression}}
// cxx23-error@-3 {{'__arm_streaming' cannot be applied to a declaration}}
// cxx23-error@-4 {{expected body of lambda expression}}
// cxx20-error@-5 {{'__arm_streaming' cannot be applied to a declaration}}
// cxx20-error@-6 {{expected body of lambda expression}}
// cxx20-warning@-7 {{'__arm_streaming' in this position is a C++23 extension}}
// precxx23-warning@-8 {{'__arm_streaming' in this position is incompatible with C++ standards before C++23}}

void t2() { int a = [] [[assume(true)]]; }
// precxx23-error@-1 {{'assume' attribute cannot be applied to a declaration}}
// precxx23-error@-2 {{expected body of lambda expression}}
// cxx23-error@-3 {{'assume' attribute cannot be applied to a declaration}}
// cxx23-error@-4 {{expected body of lambda expression}}
// cxx20-error@-5 {{'assume' attribute cannot be applied to a declaration}}
// cxx20-error@-6 {{expected body of lambda expression}}
// cxx20-warning@-7 {{an attribute specifier sequence in this position is a C++23 extension}}
// precxx23-warning@-8 {{an attribute specifier sequence in this position is incompatible with C++ standards before C++23}}
}