Author: weltschildkroete Date: 2024-05-16T21:15:25+02:00 New Revision: 476f7f65f9f17fab7e78f395b83dcb7b0bbd5215
URL: https://github.com/llvm/llvm-project/commit/476f7f65f9f17fab7e78f395b83dcb7b0bbd5215 DIFF: https://github.com/llvm/llvm-project/commit/476f7f65f9f17fab7e78f395b83dcb7b0bbd5215.diff LOG: [clang][Sema] Emit more specific diagnostic for auto in lambda before C++14 (#46059) (#68540) 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 before C++14` This does not change the behavior for `decltype(auto)` and `__auto_type` though. --------- Co-authored-by: cor3ntin <corentinja...@gmail.com> Added: Modified: clang/docs/ReleaseNotes.rst clang/include/clang/Basic/DiagnosticSemaKinds.td clang/lib/Sema/SemaType.cpp clang/test/SemaCXX/auto-cxx0x.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 2d2928e418623..65d191b6161a4 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -494,6 +494,9 @@ Improvements to Clang's diagnostics Improvements to Clang's time-trace ---------------------------------- +- Clang now specifies that using ``auto`` in a lambda parameter is a C++14 extension when + appropriate. (`#46059: <https://github.com/llvm/llvm-project/issues/46059>`_). + Bug Fixes in This Version ------------------------- - Clang's ``-Wundefined-func-template`` no longer warns on pure virtual diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 7e487b70b03dc..9372c862a36cb 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2433,7 +2433,9 @@ def err_auto_not_allowed : Error< "|in template parameter|in friend declaration|in function prototype that is " "not a function declaration|in requires expression parameter" "|in array declaration" - "|in declaration of conversion function template}1">; + "|in declaration of conversion function template" + "|in lambda parameter before 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 eb67546d048ae..9c002d56b5bd9 100644 --- a/clang/lib/Sema/SemaType.cpp +++ b/clang/lib/Sema/SemaType.cpp @@ -3257,9 +3257,13 @@ 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) { - Error = 16; + if (!SemaRef.getLangOpts().CPlusPlus14 && Auto && + Auto->getKeyword() == AutoTypeKeyword::Auto) { + Error = 25; // auto not allowed in lambda parameter (before C++14) + break; + } else if (!Auto || Auto->getKeyword() != AutoTypeKeyword::Auto) { + Error = 16; // __auto_type or decltype(auto) not allowed in lambda + // parameter break; } Info = SemaRef.getCurLambda(); diff --git a/clang/test/SemaCXX/auto-cxx0x.cpp b/clang/test/SemaCXX/auto-cxx0x.cpp index b4da3f9330c10..07687b6066790 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 before 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 before C++14}} #endif } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits