diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2015-01-20 07:03:46 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-01-20 07:03:46 +0000 |
commit | 42971a3342711aacb3d81491bea5ef5e9277f803 (patch) | |
tree | 21816e85188812202e6d97c4fa1e4a8d8418f481 | |
parent | 450a58b8afbc1790bb58412de5bf0eaa9c599666 (diff) | |
download | bcm5719-llvm-42971a3342711aacb3d81491bea5ef5e9277f803.tar.gz bcm5719-llvm-42971a3342711aacb3d81491bea5ef5e9277f803.zip |
[OPENMP] Fixed DSA processing for predetermined shared variables.
This patch allows to use predetermined shared variables in private clauses in
parallel or tasks regions.
llvm-svn: 226549
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 12 | ||||
-rw-r--r-- | clang/test/OpenMP/single_copyprivate_messages.cpp | 12 |
2 files changed, 18 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index cd03f996102..d8bedd7af2c 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/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/clang/test/OpenMP/single_copyprivate_messages.cpp b/clang/test/OpenMP/single_copyprivate_messages.cpp index 252f2e6a4ff..33d2428b22d 100644 --- a/clang/test/OpenMP/single_copyprivate_messages.cpp +++ b/clang/test/OpenMP/single_copyprivate_messages.cpp @@ -44,6 +44,7 @@ S5 m(4); // expected-note 2 {{'m' defined here}} template <class T, class C> 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<int, char>' requested here}} } |