mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-01-10 18:11:19 +00:00
Fix missing diagnostic for unsupported TLS for some thread_local variables.
Clang r181627 moved a check for block-scope variables into this code for handling thread storage class specifiers, but in the process, it broke the logic for checking if the target supports TLS. Fix this with some simple restructuring of the code. rdar://problem/18796883 llvm-svn: 222512
This commit is contained in:
parent
d64bc4bee6
commit
d8f4165b0d
@ -5613,22 +5613,20 @@ Sema::ActOnVariableDeclarator(Scope *S, Declarator &D, DeclContext *DC,
|
||||
NewVD->setLocalExternDecl();
|
||||
|
||||
if (DeclSpec::TSCS TSCS = D.getDeclSpec().getThreadStorageClassSpec()) {
|
||||
if (NewVD->hasLocalStorage()) {
|
||||
// C++11 [dcl.stc]p4:
|
||||
// When thread_local is applied to a variable of block scope the
|
||||
// storage-class-specifier static is implied if it does not appear
|
||||
// explicitly.
|
||||
// Core issue: 'static' is not implied if the variable is declared
|
||||
// 'extern'.
|
||||
if (SCSpec == DeclSpec::SCS_unspecified &&
|
||||
TSCS == DeclSpec::TSCS_thread_local &&
|
||||
DC->isFunctionOrMethod())
|
||||
NewVD->setTSCSpec(TSCS);
|
||||
else
|
||||
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
|
||||
diag::err_thread_non_global)
|
||||
<< DeclSpec::getSpecifierName(TSCS);
|
||||
} else if (!Context.getTargetInfo().isTLSSupported())
|
||||
// C++11 [dcl.stc]p4:
|
||||
// When thread_local is applied to a variable of block scope the
|
||||
// storage-class-specifier static is implied if it does not appear
|
||||
// explicitly.
|
||||
// Core issue: 'static' is not implied if the variable is declared
|
||||
// 'extern'.
|
||||
if (NewVD->hasLocalStorage() &&
|
||||
(SCSpec != DeclSpec::SCS_unspecified ||
|
||||
TSCS != DeclSpec::TSCS_thread_local ||
|
||||
!DC->isFunctionOrMethod()))
|
||||
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
|
||||
diag::err_thread_non_global)
|
||||
<< DeclSpec::getSpecifierName(TSCS);
|
||||
else if (!Context.getTargetInfo().isTLSSupported())
|
||||
Diag(D.getDeclSpec().getThreadStorageClassSpecLoc(),
|
||||
diag::err_thread_unsupported);
|
||||
else
|
||||
|
5
clang/test/SemaCXX/cxx11-thread-unsupported.cpp
Normal file
5
clang/test/SemaCXX/cxx11-thread-unsupported.cpp
Normal file
@ -0,0 +1,5 @@
|
||||
// RUN: %clang_cc1 -std=c++11 -triple=x86_64-apple-macosx10.6 -verify %s
|
||||
|
||||
void f() {
|
||||
thread_local int x; // expected-error {{thread-local storage is not supported for the current target}}
|
||||
}
|
Loading…
Reference in New Issue
Block a user