https://github.com/weltschildkroete updated https://github.com/llvm/llvm-project/pull/68540
>From 7e62fe6179dc63e9930a77c6996ae651d4489aa2 Mon Sep 17 00:00:00 2001 From: Leonardo Duarte <weltschildkro...@gmail.com> Date: Sun, 8 Oct 2023 12:59:15 +0200 Subject: [PATCH] [clang][Sema] Emit more specific diagnostic for auto in lambda before C++14 (#46059) Namely, we specify that `auto` in a lambda parameter is a C++14 extension in the error message, which now reads: `'auto' not allowed in lambda parameter until C++14` This does not change the behavior for `decltype(auto)` and `__auto_type` though. The relevant change to `SemaType.cpp` is the addition of a branch that sets `Error = 24`, whilst the bulk of the change comes from formatting. --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Sema/SemaType.cpp | 7 +++++-- clang/test/SemaCXX/auto-cxx0x.cpp | 4 ++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index b211680a0e9b6e9..804c69c222ec0d0 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2393,7 +2393,7 @@ def err_auto_not_allowed : Error< "|in type allocated by 'new'|in K&R-style function parameter" "|in template parameter|in friend declaration|in function prototype that is " "not a function declaration|in requires expression parameter" - "|in array declaration}1">; + "|in array declaration|in lambda parameter until C++14}1">; def err_dependent_deduced_tst : Error< "typename specifier refers to " "%select{class template|function template|variable template|alias template|" diff --git a/clang/lib/Sema/SemaType.cpp b/clang/lib/Sema/SemaType.cpp index 068971f8130a4aa..52a8161797e15e1 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3605,8 +3605,11 @@ static QualType GetDeclSpecTypeForDeclarator(TypeProcessingState &state, Info = &SemaRef.InventedParameterInfos.back(); } else { // In C++14, generic lambdas allow 'auto' in their parameters. - if (!SemaRef.getLangOpts().CPlusPlus14 || !Auto || - Auto->getKeyword() != AutoTypeKeyword::Auto) { + if (!SemaRef.getLangOpts().CPlusPlus14 && Auto && + Auto->getKeyword() == AutoTypeKeyword::Auto) { + Error = 24; + break; + } else if (!Auto || Auto->getKeyword() != AutoTypeKeyword::Auto) { Error = 16; break; } diff --git a/clang/test/SemaCXX/auto-cxx0x.cpp b/clang/test/SemaCXX/auto-cxx0x.cpp index b4da3f9330c1045..65398de28e10cfb 100644 --- a/clang/test/SemaCXX/auto-cxx0x.cpp +++ b/clang/test/SemaCXX/auto-cxx0x.cpp @@ -12,7 +12,7 @@ thread_local auto x; // expected-error {{requires an initializer}} void g() { [](auto){}(0); #if __cplusplus == 201103L - // expected-error@-2 {{'auto' not allowed in lambda parameter}} + // expected-error@-2 {{'auto' not allowed in lambda parameter until C++14}} #endif } @@ -20,6 +20,6 @@ void rdar47689465() { int x = 0; [](auto __attribute__((noderef)) *){}(&x); #if __cplusplus == 201103L - // expected-error@-2 {{'auto' not allowed in lambda parameter}} + // expected-error@-2 {{'auto' not allowed in lambda parameter until C++14}} #endif } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits