summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2015-01-20 07:03:46 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2015-01-20 07:03:46 +0000
commit42971a3342711aacb3d81491bea5ef5e9277f803 (patch)
tree21816e85188812202e6d97c4fa1e4a8d8418f481
parent450a58b8afbc1790bb58412de5bf0eaa9c599666 (diff)
downloadbcm5719-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.cpp12
-rw-r--r--clang/test/OpenMP/single_copyprivate_messages.cpp12
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}}
}
OpenPOWER on IntegriCloud