r364655 - [OPENMP]Fix top DSA for static members.
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Fri Jun 28 09:16:00 PDT 2019
Author: abataev
Date: Fri Jun 28 09:16:00 2019
New Revision: 364655
URL: http://llvm.org/viewvc/llvm-project?rev=364655&view=rev
Log:
[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.
Modified:
cfe/trunk/lib/Sema/SemaOpenMP.cpp
cfe/trunk/test/OpenMP/simd_loop_messages.cpp
Modified: cfe/trunk/lib/Sema/SemaOpenMP.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Sema/SemaOpenMP.cpp?rev=364655&r1=364654&r2=364655&view=diff
==============================================================================
--- cfe/trunk/lib/Sema/SemaOpenMP.cpp (original)
+++ cfe/trunk/lib/Sema/SemaOpenMP.cpp Fri Jun 28 09:16:00 2019
@@ -1354,16 +1354,28 @@ const DSAStackTy::DSAVarData DSAStackTy:
// 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) {
Modified: cfe/trunk/test/OpenMP/simd_loop_messages.cpp
URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/OpenMP/simd_loop_messages.cpp?rev=364655&r1=364654&r2=364655&view=diff
==============================================================================
--- cfe/trunk/test/OpenMP/simd_loop_messages.cpp (original)
+++ cfe/trunk/test/OpenMP/simd_loop_messages.cpp Fri Jun 28 09:16:00 2019
@@ -9,6 +9,7 @@ static int sii;
static int globalii;
struct S {
+ // expected-note at +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 at +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)
;
More information about the cfe-commits
mailing list