From 6333871f85403d07abc62fdb6182f288ff60ccd8 Mon Sep 17 00:00:00 2001 From: shafik Date: Fri, 4 Dec 2020 14:47:36 -0800 Subject: [PATCH] Add diagnostic for for-range-declaration being specificed with thread_local Currently we have a diagnostic that catches the other storage class specifies for the range based for loop declaration but we miss the thread_local case. This changes adds a diagnostic for that case as well. Differential Revision: https://reviews.llvm.org/D92671 --- clang/include/clang/Basic/DiagnosticSemaKinds.td | 2 +- clang/lib/Sema/SemaDecl.cpp | 12 ++++++++++++ clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp | 1 + 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td index 23f3749..f51ef84 100644 --- a/clang/include/clang/Basic/DiagnosticSemaKinds.td +++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td @@ -2448,7 +2448,7 @@ def err_for_range_decl_must_be_var : Error< "for range declaration must declare a variable">; def err_for_range_storage_class : Error< "loop variable %0 may not be declared %select{'extern'|'static'|" - "'__private_extern__'|'auto'|'register'|'constexpr'}1">; + "'__private_extern__'|'auto'|'register'|'constexpr'|'thread_local'}1">; def err_type_defined_in_for_range : Error< "types may not be defined in a for range declaration">; def err_for_range_deduction_failure : Error< diff --git a/clang/lib/Sema/SemaDecl.cpp b/clang/lib/Sema/SemaDecl.cpp index dc11dac..0031f87 100644 --- a/clang/lib/Sema/SemaDecl.cpp +++ b/clang/lib/Sema/SemaDecl.cpp @@ -12782,6 +12782,18 @@ void Sema::ActOnCXXForRangeDecl(Decl *D) { Error = 4; break; } + + // for-range-declaration cannot be given a storage class specifier con't. + switch (VD->getTSCSpec()) { + case TSCS_thread_local: + Error = 6; + break; + case TSCS___thread: + case TSCS__Thread_local: + case TSCS_unspecified: + break; + } + if (Error != -1) { Diag(VD->getOuterLocStart(), diag::err_for_range_storage_class) << VD << Error; diff --git a/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp b/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp index 7c95a3c..1c6aeee 100644 --- a/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp +++ b/clang/test/CXX/stmt.stmt/stmt.iter/stmt.ranged/p1.cpp @@ -151,6 +151,7 @@ void g() { for (extern int a : A()) {} // expected-error {{loop variable 'a' may not be declared 'extern'}} for (static int a : A()) {} // expected-error {{loop variable 'a' may not be declared 'static'}} + for (thread_local int a : A()) {} // expected-error {{loop variable 'a' may not be declared 'thread_local'}} for (register int a : A()) {} // expected-error {{loop variable 'a' may not be declared 'register'}} expected-warning 0-1{{register}} expected-error 0-1{{register}} for (constexpr int a : X::C()) {} // OK per CWG issue #1204. -- 2.7.4