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@+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) ; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits