From a864175fc1feb6db1bc7758cf44afd6e8ac3b920 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Tue, 20 Jan 2015 07:03:46 +0000 Subject: [PATCH] [OPENMP] Fixed DSA processing for predetermined shared variables. This patch allows to use predetermined shared variables in private clauses in parallel or tasks regions. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@226549 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaOpenMP.cpp | 12 ++++++------ test/OpenMP/single_copyprivate_messages.cpp | 12 ++++++++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index cd03f99610..d8bedd7af2 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -425,16 +425,16 @@ 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.4] // Static data members are shared. - if (D->isStaticDataMember()) { - DVar.CKind = OMPC_shared; - return DVar; - } - // OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced // in a Construct, C/C++, predetermined, p.7] // Variables with static storage duration that are declared in a scope // inside the construct are shared. - if (D->isStaticLocal()) { + if (D->isStaticDataMember() || D->isStaticLocal()) { + DSAVarData DVarTemp = + hasDSA(D, isOpenMPPrivate, MatchesAlways(), FromParent); + if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr) + return DVar; + DVar.CKind = OMPC_shared; return DVar; } diff --git a/test/OpenMP/single_copyprivate_messages.cpp b/test/OpenMP/single_copyprivate_messages.cpp index 252f2e6a4f..33d2428b22 100644 --- a/test/OpenMP/single_copyprivate_messages.cpp +++ b/test/OpenMP/single_copyprivate_messages.cpp @@ -44,6 +44,7 @@ S5 m(4); // expected-note 2 {{'m' defined here}} template T tmain(T argc, C **argv) { T i; + static T TA; #pragma omp parallel #pragma omp single copyprivate // expected-error {{expected '(' after 'copyprivate'}} #pragma omp parallel @@ -95,12 +96,18 @@ T tmain(T argc, C **argv) { #pragma omp parallel #pragma omp single firstprivate(i) copyprivate(i) // expected-error {{firstprivate variable cannot be copyprivate}} expected-note {{defined as firstprivate}} foo(); +#pragma omp parallel private(TA) + { +#pragma omp single copyprivate(TA) + TA = 99; + } return T(); } int main(int argc, char **argv) { int i; + static int intA; #pragma omp parallel #pragma omp single copyprivate // expected-error {{expected '(' after 'copyprivate'}} #pragma omp parallel @@ -154,6 +161,11 @@ int main(int argc, char **argv) { foo(); #pragma omp single copyprivate(i) nowait // expected-error {{the 'copyprivate' clause must not be used with the 'nowait' clause}} expected-note {{'nowait' clause is here}} foo(); +#pragma omp parallel private(intA) + { +#pragma omp single copyprivate(intA) + intA = 99; + } return tmain(argc, argv); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} } -- 2.40.0