From: Alexey Bataev Date: Fri, 28 Jun 2019 16:16:00 +0000 (+0000) Subject: [OPENMP]Fix top DSA for static members. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=40aa8e605db2ce8b0458df9f6fb6080feabb23ca;p=clang [OPENMP]Fix top DSA for static members. Fixed handling of the data-sharing attributes for static members when requesting top most attribute. Previously, it might return the incorrect attributes for static members if they were overriden in the outer constructs. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@364655 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index d2e3c39d20..6f71875366 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -1354,16 +1354,28 @@ const DSAStackTy::DSAVarData DSAStackTy::getTopDSA(ValueDecl *D, // in a Construct, C/C++, predetermined, p.7] // Variables with static storage duration that are declared in a scope // inside the construct are shared. - auto &&MatchesAlways = [](OpenMPDirectiveKind) { return true; }; if (VD && VD->isStaticDataMember()) { - DSAVarData DVarTemp = hasDSA(D, isOpenMPPrivate, MatchesAlways, FromParent); - if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr) + // Check for explicitly specified attributes. + const_iterator I = begin(); + const_iterator EndI = end(); + if (FromParent && I != EndI) + ++I; + auto It = I->SharingMap.find(D); + if (It != I->SharingMap.end()) { + const DSAInfo &Data = It->getSecond(); + DVar.RefExpr = Data.RefExpr.getPointer(); + DVar.PrivateCopy = Data.PrivateCopy; + DVar.CKind = Data.Attributes; + DVar.ImplicitDSALoc = I->DefaultAttrLoc; + DVar.DKind = I->Directive; return DVar; + } DVar.CKind = OMPC_shared; return DVar; } + auto &&MatchesAlways = [](OpenMPDirectiveKind) { return true; }; // The predetermined shared attribute for const-qualified types having no // mutable members was removed after OpenMP 3.1. if (SemaRef.LangOpts.OpenMP <= 31) { diff --git a/test/OpenMP/simd_loop_messages.cpp b/test/OpenMP/simd_loop_messages.cpp index 8134020374..975cd7f90f 100644 --- a/test/OpenMP/simd_loop_messages.cpp +++ b/test/OpenMP/simd_loop_messages.cpp @@ -9,6 +9,7 @@ static int sii; static int globalii; struct S { + // expected-note@+1 {{static data member is predetermined as shared}} static int ssi; }; @@ -21,6 +22,10 @@ int test_iteration_spaces() { #pragma omp simd linear(S::ssi) for (S::ssi = 0; S::ssi < 10; ++S::ssi) ; +// expected-error@+1 {{shared variable cannot be private}} +#pragma omp simd private(S::ssi) + for (S::ssi = 0; S::ssi < 10; ++S::ssi) + ; #pragma omp simd // no messages expected for (S::ssi = 0; S::ssi < 10; ++S::ssi) ;