[clang] 476f7f6 - [clang][Sema] Emit more specific diagnostic for auto in lambda before C++14 (#46059) (#68540)
via cfe-commits
cfe-commits at lists.llvm.org
Thu May 16 12:15:29 PDT 2024
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 <corentinjabot at 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 at -2 {{'auto' not allowed in lambda parameter}}
+ // expected-error at -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 at -2 {{'auto' not allowed in lambda parameter}}
+ // expected-error at -2 {{'auto' not allowed in lambda parameter before C++14}}
#endif
}
More information about the cfe-commits
mailing list