forked from OSchip/llvm-project
[OPENMP] Consider global named register variables as threadprivate by default.
Register are thread-local by default, so we have to consider them as threadprivate. llvm-svn: 225759
This commit is contained in:
parent
faa4f074eb
commit
26a3924a4f
|
@ -7226,7 +7226,7 @@ def err_omp_var_scope : Error<
|
|||
def err_omp_var_used : Error<
|
||||
"'#pragma omp %0' must precede all references to variable %q1">;
|
||||
def err_omp_var_thread_local : Error<
|
||||
"variable %0 cannot be threadprivate because it is thread-local">;
|
||||
"variable %0 cannot be threadprivate because it is %select{thread-local|a global named register variable}1">;
|
||||
def err_omp_private_incomplete_type : Error<
|
||||
"a private variable with incomplete type %0">;
|
||||
def err_omp_firstprivate_incomplete_type : Error<
|
||||
|
|
|
@ -391,7 +391,8 @@ DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D, bool FromParent) {
|
|||
// OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
|
||||
// in a Construct, C/C++, predetermined, p.1]
|
||||
// Variables appearing in threadprivate directives are threadprivate.
|
||||
if (D->getTLSKind() != VarDecl::TLS_None) {
|
||||
if (D->getTLSKind() != VarDecl::TLS_None ||
|
||||
D->getStorageClass() == SC_Register) {
|
||||
DVar.CKind = OMPC_threadprivate;
|
||||
return DVar;
|
||||
}
|
||||
|
@ -841,8 +842,10 @@ Sema::CheckOMPThreadPrivateDecl(SourceLocation Loc, ArrayRef<Expr *> VarList) {
|
|||
}
|
||||
|
||||
// Check if this is a TLS variable.
|
||||
if (VD->getTLSKind()) {
|
||||
Diag(ILoc, diag::err_omp_var_thread_local) << VD;
|
||||
if (VD->getTLSKind() != VarDecl::TLS_None ||
|
||||
VD->getStorageClass() == SC_Register) {
|
||||
Diag(ILoc, diag::err_omp_var_thread_local)
|
||||
<< VD << ((VD->getTLSKind() != VarDecl::TLS_None) ? 0 : 1);
|
||||
bool IsDecl =
|
||||
VD->isThisDeclarationADefinition(Context) == VarDecl::DeclarationOnly;
|
||||
Diag(VD->getLocation(),
|
||||
|
|
|
@ -96,6 +96,9 @@ class TempClass {
|
|||
static __thread int t; // expected-note {{'t' defined here}}
|
||||
#pragma omp threadprivate (t) // expected-error {{variable 't' cannot be threadprivate because it is thread-local}}
|
||||
|
||||
register int reg0 __asm__("0"); // expected-note {{'reg0' defined here}}
|
||||
#pragma omp threadprivate (reg0) // expected-error {{variable 'reg0' cannot be threadprivate because it is a global named register variable}}
|
||||
|
||||
int o; // expected-note {{candidate found by name lookup is 'o'}}
|
||||
#pragma omp threadprivate (o)
|
||||
namespace {
|
||||
|
|
Loading…
Reference in New Issue