From 73f9d9aa64bd43dab8a78d2ce65e7782427ba8fa Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Fri, 28 Jun 2019 16:16:00 +0000 Subject: [PATCH] [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. llvm-svn: 364655 --- clang/lib/Sema/SemaOpenMP.cpp | 18 +++++++++++++++--- clang/test/OpenMP/simd_loop_messages.cpp | 5 +++++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index d2e3c39..6f71875 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/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/clang/test/OpenMP/simd_loop_messages.cpp b/clang/test/OpenMP/simd_loop_messages.cpp index 8134020..975cd7f 100644 --- a/clang/test/OpenMP/simd_loop_messages.cpp +++ b/clang/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) ; -- 2.7.4