Index: lib/Sema/SemaOpenMP.cpp =================================================================== --- lib/Sema/SemaOpenMP.cpp +++ lib/Sema/SemaOpenMP.cpp @@ -521,7 +521,7 @@ // 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() || D->isStaticLocal()) { + if (D->isStaticDataMember()) { DSAVarData DVarTemp = hasDSA(D, isOpenMPPrivate, MatchesAlways(), FromParent); if (DVarTemp.CKind != OMPC_unknown && DVarTemp.RefExpr) Index: test/OpenMP/for_firstprivate_messages.cpp =================================================================== --- test/OpenMP/for_firstprivate_messages.cpp +++ test/OpenMP/for_firstprivate_messages.cpp @@ -307,6 +307,10 @@ #pragma omp for firstprivate(B::x) // expected-error {{threadprivate or thread local variable cannot be firstprivate}} for (i = 0; i < argc; ++i) foo(); + static int si; +#pragma omp for firstprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 1; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/for_lastprivate_messages.cpp =================================================================== --- test/OpenMP/for_lastprivate_messages.cpp +++ test/OpenMP/for_lastprivate_messages.cpp @@ -283,5 +283,9 @@ #pragma omp for lastprivate(n) firstprivate(n) // OK for (i = 0; i < argc; ++i) foo(); + static int si; +#pragma omp for lastprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 1; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/for_private_messages.cpp =================================================================== --- test/OpenMP/for_private_messages.cpp +++ test/OpenMP/for_private_messages.cpp @@ -185,6 +185,10 @@ #pragma omp for private(i) for (int k = 0; k < argc; ++k) ++k; + static int si; +#pragma omp for private(si) // OK + for(int k = 0; k < argc; ++k) + si = k + 1; return 0; } Index: test/OpenMP/for_reduction_messages.cpp =================================================================== --- test/OpenMP/for_reduction_messages.cpp +++ test/OpenMP/for_reduction_messages.cpp @@ -357,6 +357,10 @@ #pragma omp for reduction(+ : fl) // expected-error {{reduction variable must be shared}} for (int i = 0; i < 10; ++i) foo(); + static int m=0; +#pragma omp for reduction(+:m) + for (int i = 0; i < 10; ++i) + m++; return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/for_simd_firstprivate_messages.cpp =================================================================== --- test/OpenMP/for_simd_firstprivate_messages.cpp +++ test/OpenMP/for_simd_firstprivate_messages.cpp @@ -300,6 +300,10 @@ #pragma omp for simd firstprivate(i) // expected-error {{firstprivate variable must be shared}} for (i = 0; i < argc; ++i) foo(); + static int si; +#pragma omp for simd firstprivate(si) + for (i = 0; i < argc; ++i) + si = i + 1; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/for_simd_lastprivate_messages.cpp =================================================================== --- test/OpenMP/for_simd_lastprivate_messages.cpp +++ test/OpenMP/for_simd_lastprivate_messages.cpp @@ -272,5 +272,9 @@ #pragma omp for simd lastprivate(n) firstprivate(n) // OK for (i = 0; i < argc; ++i) foo(); + static int si; +#pragma omp for simd lastprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 1; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/for_simd_private_messages.cpp =================================================================== --- test/OpenMP/for_simd_private_messages.cpp +++ test/OpenMP/for_simd_private_messages.cpp @@ -175,6 +175,10 @@ #pragma omp for simd private(i) for (int k = 0; k < argc; ++k) ++k; + static int m; +#pragma omp for simd private(m) + for (int k = 0; k < argc; ++k) + m = k + 2; return 0; } Index: test/OpenMP/for_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/for_simd_reduction_messages.cpp +++ test/OpenMP/for_simd_reduction_messages.cpp @@ -353,6 +353,10 @@ #pragma omp for simd reduction(+ : fl) // expected-error {{reduction variable must be shared}} for (int i = 0; i < 10; ++i) foo(); + static int m; +#pragma omp for simd reduction(+ : m) + for (int i = 0; i < 10; ++i) + m++; return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/parallel_firstprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_firstprivate_messages.cpp +++ test/OpenMP/parallel_firstprivate_messages.cpp @@ -62,6 +62,7 @@ S5 g(5); int i; int &j = i; // expected-note {{'j' defined here}} + static int m; #pragma omp parallel firstprivate // expected-error {{expected '(' after 'firstprivate'}} #pragma omp parallel firstprivate ( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} #pragma omp parallel firstprivate () // expected-error {{expected expression}} @@ -84,6 +85,7 @@ #pragma omp parallel shared(i) #pragma omp parallel firstprivate(i) #pragma omp parallel firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} + #pragma omp parallel firstprivate(m) foo(); return 0; Index: test/OpenMP/parallel_for_firstprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_for_firstprivate_messages.cpp +++ test/OpenMP/parallel_for_firstprivate_messages.cpp @@ -255,6 +255,10 @@ #pragma omp parallel for firstprivate(i) // expected-note {{defined as firstprivate}} for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be firstprivate, predetermined as private}} foo(); + static int si; +#pragma omp parallel for firstprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 1; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/parallel_for_lastprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_for_lastprivate_messages.cpp +++ test/OpenMP/parallel_for_lastprivate_messages.cpp @@ -232,5 +232,10 @@ #pragma omp parallel for lastprivate(n) firstprivate(n) // OK for (i = 0; i < argc; ++i) foo(); + static int si; +#pragma omp parallel for lastprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 2; + return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/parallel_for_private_messages.cpp =================================================================== --- test/OpenMP/parallel_for_private_messages.cpp +++ test/OpenMP/parallel_for_private_messages.cpp @@ -175,6 +175,10 @@ #pragma omp parallel for private(i) for (int k = 0; k < argc; ++k) ++k; + static int m; +#pragma omp parallel for private(m) + for (int k = 0; k < argc; ++k) + m = k + 2; return 0; } Index: test/OpenMP/parallel_for_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_for_reduction_messages.cpp +++ test/OpenMP/parallel_for_reduction_messages.cpp @@ -298,6 +298,10 @@ #pragma omp parallel for reduction(+ : fl) for (int i = 0; i < 10; ++i) foo(); + static int m; +#pragma omp parallel for reduction(+ : m) // OK + for (int i = 0; i < 10; ++i) + m++; return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/parallel_for_simd_firstprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_for_simd_firstprivate_messages.cpp +++ test/OpenMP/parallel_for_simd_firstprivate_messages.cpp @@ -253,6 +253,10 @@ #pragma omp parallel for simd firstprivate(i) // expected-note {{defined as firstprivate}} for (i = 0; i < argc; ++i) // expected-error {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be firstprivate, predetermined as linear}} foo(); + static int si; +#pragma omp parallel for simd firstprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 2; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/parallel_for_simd_lastprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_for_simd_lastprivate_messages.cpp +++ test/OpenMP/parallel_for_simd_lastprivate_messages.cpp @@ -231,5 +231,9 @@ #pragma omp parallel for simd lastprivate(n) firstprivate(n) // OK for (i = 0; i < argc; ++i) foo(); + static int si; +#pragma omp parallel for simd lastprivate(si) // OK + for (i = 0; i < argc; ++i) + si = i + 3; return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/parallel_for_simd_private_messages.cpp =================================================================== --- test/OpenMP/parallel_for_simd_private_messages.cpp +++ test/OpenMP/parallel_for_simd_private_messages.cpp @@ -175,6 +175,10 @@ #pragma omp parallel for simd private(i) for (int k = 0; k < argc; ++k) ++k; + static int m; +#pragma omp parallel for simd private(m) // OK + for (int k = 0; k < argc; ++k) + m = k + 3; return 0; } Index: test/OpenMP/parallel_for_simd_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_for_simd_reduction_messages.cpp +++ test/OpenMP/parallel_for_simd_reduction_messages.cpp @@ -298,6 +298,10 @@ #pragma omp parallel for simd reduction(+ : fl) for (int i = 0; i < 10; ++i) foo(); + static int m; +#pragma omp parallel for simd reduction(+ : m) // OK + for (int i = 0; i < 10; ++i) + m++; return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/parallel_private_messages.cpp =================================================================== --- test/OpenMP/parallel_private_messages.cpp +++ test/OpenMP/parallel_private_messages.cpp @@ -84,6 +84,9 @@ #pragma omp parallel private(i) foo(); } + static int m; + #pragma omp parallel private(m) // OK + foo(); return 0; } Index: test/OpenMP/parallel_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_reduction_messages.cpp +++ test/OpenMP/parallel_reduction_messages.cpp @@ -243,6 +243,9 @@ for (int i = 0; i < 10; ++i) #pragma omp parallel reduction(+ : fl) foo(); + static int m; +#pragma omp parallel reduction(+ : m) // OK + m++; return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/parallel_sections_firstprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_sections_firstprivate_messages.cpp +++ test/OpenMP/parallel_sections_firstprivate_messages.cpp @@ -298,6 +298,11 @@ { foo(); } + static int r; +#pragma omp parallel sections firstprivate(r) // OK + { + foo(); + } return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/parallel_sections_lastprivate_messages.cpp =================================================================== --- test/OpenMP/parallel_sections_lastprivate_messages.cpp +++ test/OpenMP/parallel_sections_lastprivate_messages.cpp @@ -274,5 +274,10 @@ { foo(); } + static int r; +#pragma omp parallel sections lastprivate(r) // OK + { + foo(); + } return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/parallel_sections_private_messages.cpp =================================================================== --- test/OpenMP/parallel_sections_private_messages.cpp +++ test/OpenMP/parallel_sections_private_messages.cpp @@ -206,6 +206,11 @@ { foo(); } + static int m; +#pragma omp parallel sections private(m) + { + foo(); + } return 0; } Index: test/OpenMP/parallel_sections_reduction_messages.cpp =================================================================== --- test/OpenMP/parallel_sections_reduction_messages.cpp +++ test/OpenMP/parallel_sections_reduction_messages.cpp @@ -361,6 +361,11 @@ { foo(); } + static int m; +#pragma omp parallel sections reduction(+ : m) // OK + { + foo(); + } return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/sections_firstprivate_messages.cpp =================================================================== --- test/OpenMP/sections_firstprivate_messages.cpp +++ test/OpenMP/sections_firstprivate_messages.cpp @@ -338,6 +338,11 @@ { foo(); } + static int r; +#pragma omp sections firstprivate(r) // OK + { + foo(); + } return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/sections_lastprivate_messages.cpp =================================================================== --- test/OpenMP/sections_lastprivate_messages.cpp +++ test/OpenMP/sections_lastprivate_messages.cpp @@ -314,5 +314,10 @@ { foo(); } + static int r; +#pragma omp sections lastprivate(r) // OK + { + foo(); + } return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/sections_private_messages.cpp =================================================================== --- test/OpenMP/sections_private_messages.cpp +++ test/OpenMP/sections_private_messages.cpp @@ -206,6 +206,11 @@ { foo(); } + static int m; +#pragma omp sections private(m) + { + foo(); + } return 0; } Index: test/OpenMP/sections_reduction_messages.cpp =================================================================== --- test/OpenMP/sections_reduction_messages.cpp +++ test/OpenMP/sections_reduction_messages.cpp @@ -416,6 +416,11 @@ { foo(); } + static int m; +#pragma omp sections reduction(+ : m) // OK + { + foo(); + } return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} } Index: test/OpenMP/simd_lastprivate_messages.cpp =================================================================== --- test/OpenMP/simd_lastprivate_messages.cpp +++ test/OpenMP/simd_lastprivate_messages.cpp @@ -213,5 +213,9 @@ #pragma omp simd lastprivate(j) // expected-error {{arguments of OpenMP clause 'lastprivate' cannot be of reference type}} for (i = 0; i < argc; ++i) foo(); + static int t; +#pragma omp simd lastprivate(t) // OK + for (i = 0; i < argc; ++i) + foo(); return 0; } Index: test/OpenMP/single_firstprivate_messages.cpp =================================================================== --- test/OpenMP/single_firstprivate_messages.cpp +++ test/OpenMP/single_firstprivate_messages.cpp @@ -242,6 +242,9 @@ #pragma omp parallel reduction(+ : i) // expected-note {{defined as reduction}} #pragma omp single firstprivate(i) // expected-error {{firstprivate variable must be shared}} foo(); + static int t; +#pragma omp single firstprivate(t) // OK + foo(); return foomain(argc, argv); // expected-note {{in instantiation of function template specialization 'foomain' requested here}} } Index: test/OpenMP/single_private_messages.cpp =================================================================== --- test/OpenMP/single_private_messages.cpp +++ test/OpenMP/single_private_messages.cpp @@ -142,6 +142,9 @@ foo(); #pragma omp single private(i) foo(); + static int m; +#pragma omp single private(m) // OK + foo(); return 0; } Index: test/OpenMP/task_firstprivate_messages.cpp =================================================================== --- test/OpenMP/task_firstprivate_messages.cpp +++ test/OpenMP/task_firstprivate_messages.cpp @@ -71,6 +71,7 @@ S5 g(5); int i; int &j = i; // expected-note {{'j' defined here}} + static int m; #pragma omp task firstprivate // expected-error {{expected '(' after 'firstprivate'}} #pragma omp task firstprivate( // expected-error {{expected expression}} expected-error {{expected ')'}} expected-note {{to match this '('}} #pragma omp task firstprivate() // expected-error {{expected expression}} @@ -93,6 +94,7 @@ #pragma omp task shared(i) #pragma omp task firstprivate(i) #pragma omp task firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} +#pragma omp task firstprivate(m) // OK foo(); return 0; Index: test/OpenMP/task_private_messages.cpp =================================================================== --- test/OpenMP/task_private_messages.cpp +++ test/OpenMP/task_private_messages.cpp @@ -93,6 +93,9 @@ #pragma omp task private(i) foo(); } + static int m; +#pragma omp task private(m) // OK + foo(); return 0; } Index: test/OpenMP/teams_firstprivate_messages.cpp =================================================================== --- test/OpenMP/teams_firstprivate_messages.cpp +++ test/OpenMP/teams_firstprivate_messages.cpp @@ -127,6 +127,10 @@ #pragma omp target #pragma omp teams firstprivate(j) // expected-error {{arguments of OpenMP clause 'firstprivate' cannot be of reference type}} foo(); + static int m; +#pragma omp target +#pragma omp teams firstprivate(m) // OK + foo(); return 0; } Index: test/OpenMP/teams_private_messages.cpp =================================================================== --- test/OpenMP/teams_private_messages.cpp +++ test/OpenMP/teams_private_messages.cpp @@ -122,6 +122,10 @@ #pragma omp parallel private(i) foo(); } + static int m; + #pragma omp target + #pragma omp teams private(m) // OK + foo(); return 0; } Index: test/OpenMP/teams_reduction_messages.cpp =================================================================== --- test/OpenMP/teams_reduction_messages.cpp +++ test/OpenMP/teams_reduction_messages.cpp @@ -310,6 +310,10 @@ #pragma omp target #pragma omp teams reduction(+ : fl) foo(); + static int m; +#pragma omp target +#pragma omp teams reduction(+ : m) // OK + foo(); return tmain(argc) + tmain(fl); // expected-note {{in instantiation of function template specialization 'tmain' requested here}} expected-note {{in instantiation of function template specialization 'tmain' requested here}} }