From d1146925d8e139d4b2b108619ff21e4d1fc5ff62 Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Thu, 10 Dec 2015 08:20:58 +0000 Subject: [PATCH] [OPENMP] Fixed processing of predetermined data-sharing attributes Predetermined data-shared attributes for local variables are now considered as implicit. Also, patch prohibits changin of DSA for static memebers of classes. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@255229 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Sema/SemaOpenMP.cpp | 50 +++++++------------ test/OpenMP/for_firstprivate_messages.cpp | 4 +- test/OpenMP/for_misc_messages.c | 2 +- .../OpenMP/for_simd_firstprivate_messages.cpp | 4 +- test/OpenMP/for_simd_misc_messages.c | 2 +- .../parallel_for_lastprivate_messages.cpp | 4 +- test/OpenMP/parallel_for_misc_messages.c | 3 +- .../parallel_for_reduction_messages.cpp | 6 +-- ...parallel_for_simd_lastprivate_messages.cpp | 4 +- .../parallel_for_simd_reduction_messages.cpp | 6 +-- test/OpenMP/parallel_private_messages.cpp | 4 +- test/OpenMP/parallel_reduction_messages.cpp | 6 +-- ...parallel_sections_lastprivate_messages.cpp | 4 +- .../parallel_sections_reduction_messages.cpp | 6 +-- .../OpenMP/sections_firstprivate_messages.cpp | 4 +- test/OpenMP/simd_misc_messages.c | 10 +++- test/OpenMP/single_firstprivate_messages.cpp | 4 +- test/OpenMP/task_private_messages.cpp | 4 +- test/OpenMP/taskloop_lastprivate_messages.cpp | 4 +- .../taskloop_simd_lastprivate_messages.cpp | 4 +- test/OpenMP/teams_private_messages.cpp | 4 +- test/OpenMP/teams_reduction_messages.cpp | 6 +-- 22 files changed, 67 insertions(+), 78 deletions(-) diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index 525cfd844c..90aaeaa8af 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -565,41 +565,20 @@ 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.1] - // Variables with automatic storage duration that are declared in a scope - // inside the construct are private. - OpenMPDirectiveKind Kind = - FromParent ? getParentDirective() : getCurrentDirective(); - auto StartI = std::next(Stack.rbegin()); - auto EndI = std::prev(Stack.rend()); - if (FromParent && StartI != EndI) { - StartI = std::next(StartI); - } - if (!isParallelOrTaskRegion(Kind)) { - if (isOpenMPLocal(D, StartI) && - ((D->isLocalVarDecl() && (D->getStorageClass() == SC_Auto || - D->getStorageClass() == SC_None)) || - isa(D))) { - DVar.CKind = OMPC_private; + // in a Construct, C/C++, predetermined, p.4] + // Static data members are shared. + // 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->isStaticDataMember()) { + DSAVarData DVarTemp = + hasDSA(D, isOpenMPPrivate, MatchesAlways(), FromParent); + if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr) return DVar; - } - // 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. - // 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->isStaticDataMember()) { - DSAVarData DVarTemp = - hasDSA(D, isOpenMPPrivate, MatchesAlways(), FromParent); - if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr) - return DVar; - - DVar.CKind = OMPC_shared; - return DVar; - } + DVar.CKind = OMPC_shared; + return DVar; } QualType Type = D->getType().getNonReferenceType().getCanonicalType(); @@ -626,6 +605,11 @@ DSAStackTy::DSAVarData DSAStackTy::getTopDSA(VarDecl *D, bool FromParent) { // Explicitly specified attributes and local variables with predetermined // attributes. + auto StartI = std::next(Stack.rbegin()); + auto EndI = std::prev(Stack.rend()); + if (FromParent && StartI != EndI) { + StartI = std::next(StartI); + } auto I = std::prev(StartI); if (I->SharingMap.count(D)) { DVar.RefExpr = I->SharingMap[D].RefExpr; diff --git a/test/OpenMP/for_firstprivate_messages.cpp b/test/OpenMP/for_firstprivate_messages.cpp index 5c34fdad00..1933de2585 100644 --- a/test/OpenMP/for_firstprivate_messages.cpp +++ b/test/OpenMP/for_firstprivate_messages.cpp @@ -118,7 +118,7 @@ int foomain(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}} -#pragma omp for firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp for firstprivate(i) // expected-error {{firstprivate variable must be shared}} for (int k = 0; k < argc; ++k) { i = k; v += i; @@ -285,7 +285,7 @@ int main(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}} -#pragma omp for firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp for firstprivate(i) // expected-error {{firstprivate variable must be shared}} for (int k = 0; k < argc; ++k) { i = k; v += i; diff --git a/test/OpenMP/for_misc_messages.c b/test/OpenMP/for_misc_messages.c index c7635c270b..0a7cdf8fc0 100644 --- a/test/OpenMP/for_misc_messages.c +++ b/test/OpenMP/for_misc_messages.c @@ -194,7 +194,7 @@ void test_collapse() { for (i = 0; i < 16; ++i) // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}} for (int j = 0; j < 16; ++j) -// expected-error@+2 {{private variable cannot be reduction}} +// expected-error@+2 {{reduction variable must be shared}} // expected-error@+1 {{region cannot be closely nested inside 'for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} #pragma omp for reduction(+ : i, j) for (int k = 0; k < 16; ++k) diff --git a/test/OpenMP/for_simd_firstprivate_messages.cpp b/test/OpenMP/for_simd_firstprivate_messages.cpp index d3232ea251..cb74ee0817 100644 --- a/test/OpenMP/for_simd_firstprivate_messages.cpp +++ b/test/OpenMP/for_simd_firstprivate_messages.cpp @@ -122,7 +122,7 @@ int foomain(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}} -#pragma omp for simd firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}} for (int k = 0; k < argc; ++k) { i = k; v += i; @@ -286,7 +286,7 @@ int main(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}} -#pragma omp for simd firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}} for (int k = 0; k < argc; ++k) { i = k; v += i; diff --git a/test/OpenMP/for_simd_misc_messages.c b/test/OpenMP/for_simd_misc_messages.c index 2983a36599..ca1e366ca0 100644 --- a/test/OpenMP/for_simd_misc_messages.c +++ b/test/OpenMP/for_simd_misc_messages.c @@ -375,7 +375,7 @@ void test_collapse() { for (i = 0; i < 16; ++i) // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for simd' directive into a parallel or another task region?}} for (int j = 0; j < 16; ++j) -// expected-error@+2 {{private variable cannot be reduction}} +// expected-error@+2 {{reduction variable must be shared}} // expected-error@+1 {{OpenMP constructs may not be nested inside a simd region}} #pragma omp for simd reduction(+ : i, j) for (int k = 0; k < 16; ++k) diff --git a/test/OpenMP/parallel_for_lastprivate_messages.cpp b/test/OpenMP/parallel_for_lastprivate_messages.cpp index 6eb60b32b8..ccfe2ea407 100644 --- a/test/OpenMP/parallel_for_lastprivate_messages.cpp +++ b/test/OpenMP/parallel_for_lastprivate_messages.cpp @@ -17,7 +17,7 @@ public: S2(S2 &s2) : a(s2.a) {} S2 &operator=(const S2 &); const S2 &operator=(const S2 &) const; - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}} @@ -188,7 +188,7 @@ int main(int argc, char **argv) { #pragma omp parallel for lastprivate(xa) // OK for (i = 0; i < argc; ++i) foo(); -#pragma omp parallel for lastprivate(S2::S2s) +#pragma omp parallel for lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}} for (i = 0; i < argc; ++i) foo(); #pragma omp parallel for lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}} diff --git a/test/OpenMP/parallel_for_misc_messages.c b/test/OpenMP/parallel_for_misc_messages.c index f78a766303..1a773be617 100644 --- a/test/OpenMP/parallel_for_misc_messages.c +++ b/test/OpenMP/parallel_for_misc_messages.c @@ -165,8 +165,7 @@ void test_collapse() { for (i = 0; i < 16; ++i) // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}} for (int j = 0; j < 16; ++j) -// expected-error@+3 {{reduction variable must be shared}} -// expected-error@+2 {{private variable cannot be reduction}} +// expected-error@+2 2 {{reduction variable must be shared}} // expected-error@+1 {{region cannot be closely nested inside 'parallel for' region; perhaps you forget to enclose 'omp for' directive into a parallel region?}} #pragma omp for reduction(+ : i, j) for (int k = 0; k < 16; ++k) diff --git a/test/OpenMP/parallel_for_reduction_messages.cpp b/test/OpenMP/parallel_for_reduction_messages.cpp index d64577795e..22251b4463 100644 --- a/test/OpenMP/parallel_for_reduction_messages.cpp +++ b/test/OpenMP/parallel_for_reduction_messages.cpp @@ -18,7 +18,7 @@ class S2 { public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} - static float S2s; + static float S2s; // expected-note 2 {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} @@ -141,7 +141,7 @@ T tmain(T argc) { #pragma omp parallel for reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} for (int i = 0; i < 10; ++i) foo(); -#pragma omp parallel for reduction(&& : S2::S2s) +#pragma omp parallel for reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} for (int i = 0; i < 10; ++i) foo(); #pragma omp parallel for reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} @@ -263,7 +263,7 @@ int main(int argc, char **argv) { #pragma omp parallel for reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} for (int i = 0; i < 10; ++i) foo(); -#pragma omp parallel for reduction(&& : S2::S2s) +#pragma omp parallel for reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} for (int i = 0; i < 10; ++i) foo(); #pragma omp parallel for reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} diff --git a/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp b/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp index 22e514ffc2..bd1a6d5055 100644 --- a/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp +++ b/test/OpenMP/parallel_for_simd_lastprivate_messages.cpp @@ -16,7 +16,7 @@ public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} const S2 &operator=(const S2 &) const; - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}} @@ -190,7 +190,7 @@ int main(int argc, char **argv) { #pragma omp parallel for simd lastprivate(xa) // OK for (i = 0; i < argc; ++i) foo(); -#pragma omp parallel for simd lastprivate(S2::S2s) +#pragma omp parallel for simd lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}} for (i = 0; i < argc; ++i) foo(); #pragma omp parallel for simd lastprivate(S2::S2sc) // expected-error {{shared variable cannot be lastprivate}} diff --git a/test/OpenMP/parallel_for_simd_reduction_messages.cpp b/test/OpenMP/parallel_for_simd_reduction_messages.cpp index f402e74720..e2e9e1bca3 100644 --- a/test/OpenMP/parallel_for_simd_reduction_messages.cpp +++ b/test/OpenMP/parallel_for_simd_reduction_messages.cpp @@ -18,7 +18,7 @@ class S2 { public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} - static float S2s; + static float S2s; // expected-note 2 {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} @@ -141,7 +141,7 @@ T tmain(T argc) { #pragma omp parallel for simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} for (int i = 0; i < 10; ++i) foo(); -#pragma omp parallel for simd reduction(&& : S2::S2s) +#pragma omp parallel for simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} for (int i = 0; i < 10; ++i) foo(); #pragma omp parallel for simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} @@ -263,7 +263,7 @@ int main(int argc, char **argv) { #pragma omp parallel for simd reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} for (int i = 0; i < 10; ++i) foo(); -#pragma omp parallel for simd reduction(&& : S2::S2s) +#pragma omp parallel for simd reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} for (int i = 0; i < 10; ++i) foo(); #pragma omp parallel for simd reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} diff --git a/test/OpenMP/parallel_private_messages.cpp b/test/OpenMP/parallel_private_messages.cpp index c497526bc9..ab535b4752 100644 --- a/test/OpenMP/parallel_private_messages.cpp +++ b/test/OpenMP/parallel_private_messages.cpp @@ -13,7 +13,7 @@ class S2 { mutable int a; public: S2():a(0) { } - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} }; const S2 b; const S2 ba[5]; @@ -69,7 +69,7 @@ int main(int argc, char **argv) { #pragma omp parallel private(ba) #pragma omp parallel private(ca) // expected-error {{shared variable cannot be private}} #pragma omp parallel private(da) // expected-error {{shared variable cannot be private}} - #pragma omp parallel private(S2::S2s) + #pragma omp parallel private(S2::S2s) // expected-error {{shared variable cannot be private}} #pragma omp parallel private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} #pragma omp parallel private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} #pragma omp parallel shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} diff --git a/test/OpenMP/parallel_reduction_messages.cpp b/test/OpenMP/parallel_reduction_messages.cpp index 174924cc81..b29f7c98a5 100644 --- a/test/OpenMP/parallel_reduction_messages.cpp +++ b/test/OpenMP/parallel_reduction_messages.cpp @@ -18,7 +18,7 @@ class S2 { public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} - static float S2s; + static float S2s; // expected-note 2 {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} @@ -121,7 +121,7 @@ T tmain(T argc) { foo(); #pragma omp parallel reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} foo(); -#pragma omp parallel reduction(&& : S2::S2s) +#pragma omp parallel reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} foo(); #pragma omp parallel reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} foo(); @@ -216,7 +216,7 @@ int main(int argc, char **argv) { foo(); #pragma omp parallel reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} foo(); -#pragma omp parallel reduction(&& : S2::S2s) +#pragma omp parallel reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} foo(); #pragma omp parallel reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} foo(); diff --git a/test/OpenMP/parallel_sections_lastprivate_messages.cpp b/test/OpenMP/parallel_sections_lastprivate_messages.cpp index d213cdd879..af3c5e2a57 100644 --- a/test/OpenMP/parallel_sections_lastprivate_messages.cpp +++ b/test/OpenMP/parallel_sections_lastprivate_messages.cpp @@ -16,7 +16,7 @@ public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} const S2 &operator=(const S2 &) const; - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}} @@ -220,7 +220,7 @@ int main(int argc, char **argv) { { foo(); } -#pragma omp parallel sections lastprivate(S2::S2s) +#pragma omp parallel sections lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}} { foo(); } diff --git a/test/OpenMP/parallel_sections_reduction_messages.cpp b/test/OpenMP/parallel_sections_reduction_messages.cpp index 70f4a8cc2a..eff1849d71 100644 --- a/test/OpenMP/parallel_sections_reduction_messages.cpp +++ b/test/OpenMP/parallel_sections_reduction_messages.cpp @@ -18,7 +18,7 @@ class S2 { public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} - static float S2s; + static float S2s; // expected-note 2 {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} @@ -161,7 +161,7 @@ T tmain(T argc) { { foo(); } -#pragma omp parallel sections reduction(&& : S2::S2s) +#pragma omp parallel sections reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} { foo(); } @@ -314,7 +314,7 @@ int main(int argc, char **argv) { { foo(); } -#pragma omp parallel sections reduction(&& : S2::S2s) +#pragma omp parallel sections reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} { foo(); } diff --git a/test/OpenMP/sections_firstprivate_messages.cpp b/test/OpenMP/sections_firstprivate_messages.cpp index e6ce503bd4..cd2b4b8838 100644 --- a/test/OpenMP/sections_firstprivate_messages.cpp +++ b/test/OpenMP/sections_firstprivate_messages.cpp @@ -135,7 +135,7 @@ int foomain(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp sections' directive into a parallel or another task region?}} -#pragma omp sections firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}} { foo(); } @@ -322,7 +322,7 @@ int main(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp sections' directive into a parallel or another task region?}} -#pragma omp sections firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp sections firstprivate(i) // expected-error {{firstprivate variable must be shared}} { foo(); } diff --git a/test/OpenMP/simd_misc_messages.c b/test/OpenMP/simd_misc_messages.c index 29c87bb95d..1e15482919 100644 --- a/test/OpenMP/simd_misc_messages.c +++ b/test/OpenMP/simd_misc_messages.c @@ -356,12 +356,18 @@ void test_collapse() { for (i = 0; i < 16; ++i) // expected-note@+1 {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp for' directive into a parallel or another task region?}} for (int j = 0; j < 16; ++j) -// expected-error@+3 {{reduction variable must be shared}} -// expected-error@+2 {{private variable cannot be reduction}} +// expected-error@+2 2 {{reduction variable must be shared}} // expected-error@+1 {{OpenMP constructs may not be nested inside a simd region}} #pragma omp for reduction(+ : i, j) for (int k = 0; k < 16; ++k) i += j; +#pragma omp parallel +#pragma omp for + for (i = 0; i < 16; ++i) + for (int j = 0; j < 16; ++j) +#pragma omp simd reduction(+ : i, j) + for (int k = 0; k < 16; ++k) + i += j; } void test_linear() { diff --git a/test/OpenMP/single_firstprivate_messages.cpp b/test/OpenMP/single_firstprivate_messages.cpp index 3fd00ae92b..32de9fdc88 100644 --- a/test/OpenMP/single_firstprivate_messages.cpp +++ b/test/OpenMP/single_firstprivate_messages.cpp @@ -109,7 +109,7 @@ int foomain(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp single' directive into a parallel or another task region?}} -#pragma omp single firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}} foo(); v += i; } @@ -232,7 +232,7 @@ int main(int argc, char **argv) { { int v = 0; int i; // expected-note {{variable with automatic storage duration is predetermined as private; perhaps you forget to enclose 'omp single' directive into a parallel or another task region?}} -#pragma omp single firstprivate(i) // expected-error {{private variable cannot be firstprivate}} +#pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}} foo(); v += i; } diff --git a/test/OpenMP/task_private_messages.cpp b/test/OpenMP/task_private_messages.cpp index a1af7e9643..6bce1352b1 100644 --- a/test/OpenMP/task_private_messages.cpp +++ b/test/OpenMP/task_private_messages.cpp @@ -14,7 +14,7 @@ class S2 { public: S2() : a(0) {} - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} }; const S2 b; const S2 ba[5]; @@ -78,7 +78,7 @@ int main(int argc, char **argv) { #pragma omp task private(ba) #pragma omp task private(ca) // expected-error {{shared variable cannot be private}} #pragma omp task private(da) // expected-error {{shared variable cannot be private}} -#pragma omp task private(S2::S2s) +#pragma omp task private(S2::S2s) // expected-error {{shared variable cannot be private}} #pragma omp task private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} #pragma omp task private(threadvar, B::x) // expected-error 2 {{threadprivate or thread local variable cannot be private}} #pragma omp task shared(i), private(i) // expected-error {{shared variable cannot be private}} expected-note {{defined as shared}} diff --git a/test/OpenMP/taskloop_lastprivate_messages.cpp b/test/OpenMP/taskloop_lastprivate_messages.cpp index ea8b3d9c61..e436444815 100644 --- a/test/OpenMP/taskloop_lastprivate_messages.cpp +++ b/test/OpenMP/taskloop_lastprivate_messages.cpp @@ -17,7 +17,7 @@ public: S2(S2 &s2) : a(s2.a) {} const S2 &operator =(const S2&) const; S2 &operator =(const S2&); - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}} @@ -224,7 +224,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp taskloop lastprivate(S2::S2s) +#pragma omp taskloop lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}} for (i = 0; i < argc; ++i) foo(); #pragma omp parallel diff --git a/test/OpenMP/taskloop_simd_lastprivate_messages.cpp b/test/OpenMP/taskloop_simd_lastprivate_messages.cpp index 0990564bfe..ed1bdf5a6e 100644 --- a/test/OpenMP/taskloop_simd_lastprivate_messages.cpp +++ b/test/OpenMP/taskloop_simd_lastprivate_messages.cpp @@ -17,7 +17,7 @@ public: S2(S2 &s2) : a(s2.a) {} const S2 &operator =(const S2&) const; S2 &operator =(const S2&); - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note {{static data member is predetermined as shared}} @@ -224,7 +224,7 @@ int main(int argc, char **argv) { for (i = 0; i < argc; ++i) foo(); #pragma omp parallel -#pragma omp taskloop simd lastprivate(S2::S2s) +#pragma omp taskloop simd lastprivate(S2::S2s) // expected-error {{shared variable cannot be lastprivate}} for (i = 0; i < argc; ++i) foo(); #pragma omp parallel diff --git a/test/OpenMP/teams_private_messages.cpp b/test/OpenMP/teams_private_messages.cpp index 0b0aa7c746..344ef8daf9 100644 --- a/test/OpenMP/teams_private_messages.cpp +++ b/test/OpenMP/teams_private_messages.cpp @@ -13,7 +13,7 @@ class S2 { mutable int a; public: S2():a(0) { } - static float S2s; + static float S2s; // expected-note {{static data member is predetermined as shared}} }; const S2 b; const S2 ba[5]; @@ -96,7 +96,7 @@ int main(int argc, char **argv) { #pragma omp teams private(da) // expected-error {{shared variable cannot be private}} foo(); #pragma omp target - #pragma omp teams private(S2::S2s) + #pragma omp teams private(S2::S2s) // expected-error {{shared variable cannot be private}} foo(); #pragma omp target #pragma omp teams private(e, g) // expected-error {{calling a private constructor of class 'S4'}} expected-error {{calling a private constructor of class 'S5'}} diff --git a/test/OpenMP/teams_reduction_messages.cpp b/test/OpenMP/teams_reduction_messages.cpp index 5fb43668f3..87d03485c1 100644 --- a/test/OpenMP/teams_reduction_messages.cpp +++ b/test/OpenMP/teams_reduction_messages.cpp @@ -18,7 +18,7 @@ class S2 { public: S2() : a(0) {} S2(S2 &s2) : a(s2.a) {} - static float S2s; + static float S2s; // expected-note 2 {{static data member is predetermined as shared}} static const float S2sc; }; const float S2::S2sc = 0; // expected-note 2 {{'S2sc' defined here}} @@ -142,7 +142,7 @@ T tmain(T argc) { #pragma omp teams reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} foo(); #pragma omp target -#pragma omp teams reduction(&& : S2::S2s) +#pragma omp teams reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} foo(); #pragma omp target #pragma omp teams reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} @@ -270,7 +270,7 @@ int main(int argc, char **argv) { #pragma omp teams reduction(^ : fl) // expected-error {{invalid operands to binary expression ('float' and 'float')}} foo(); #pragma omp target -#pragma omp teams reduction(&& : S2::S2s) +#pragma omp teams reduction(&& : S2::S2s) // expected-error {{shared variable cannot be reduction}} foo(); #pragma omp target #pragma omp teams reduction(&& : S2::S2sc) // expected-error {{const-qualified list item cannot be reduction}} -- 2.40.0