From: Alexey Bataev Date: Tue, 12 May 2015 09:02:07 +0000 (+0000) Subject: [OPENMP] Allow using of threadprivate variables as loop-control variables in lop... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=29fafc4751d93249b592bd40d353e71fbe55049c;p=clang [OPENMP] Allow using of threadprivate variables as loop-control variables in lop based directives. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@237102 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Sema/SemaOpenMP.cpp b/lib/Sema/SemaOpenMP.cpp index db238c02d5..dd3ff37c37 100644 --- a/lib/Sema/SemaOpenMP.cpp +++ b/lib/Sema/SemaOpenMP.cpp @@ -2606,11 +2606,12 @@ static bool CheckOpenMPIterationSpace( ? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate) : OMPC_private; if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && - DVar.CKind != PredeterminedCKind) || + DVar.CKind != OMPC_threadprivate && DVar.CKind != PredeterminedCKind) || (isOpenMPWorksharingDirective(DKind) && !isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown && DVar.CKind != OMPC_private && - DVar.CKind != OMPC_lastprivate)) && - (DVar.CKind != OMPC_private || DVar.RefExpr != nullptr)) { + DVar.CKind != OMPC_lastprivate && DVar.CKind != OMPC_threadprivate)) && + ((DVar.CKind != OMPC_private && DVar.CKind != OMPC_threadprivate) || + DVar.RefExpr != nullptr)) { SemaRef.Diag(Init->getLocStart(), diag::err_omp_loop_var_dsa) << getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind) << getOpenMPClauseName(PredeterminedCKind); diff --git a/test/OpenMP/for_loop_messages.cpp b/test/OpenMP/for_loop_messages.cpp index 39aaa5cf28..86220648a8 100644 --- a/test/OpenMP/for_loop_messages.cpp +++ b/test/OpenMP/for_loop_messages.cpp @@ -10,10 +10,10 @@ public: }; static int sii; -#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}} +#pragma omp threadprivate(sii) static int globalii; -register int reg0 __asm__("0"); // expected-note {{defined as threadprivate or thread local}} +register int reg0 __asm__("0"); int test_iteration_spaces() { const int N = 100; @@ -308,7 +308,6 @@ int test_iteration_spaces() { #pragma omp parallel { -// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be threadprivate or thread local, predetermined as private}} #pragma omp for for (sii = 0; sii < 10; sii += 1) c[sii] = a[sii]; @@ -316,7 +315,6 @@ int test_iteration_spaces() { #pragma omp parallel { -// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for' directive may not be threadprivate or thread local, predetermined as private}} #pragma omp for for (reg0 = 0; reg0 < 10; reg0 += 1) c[reg0] = a[reg0]; diff --git a/test/OpenMP/for_simd_loop_messages.cpp b/test/OpenMP/for_simd_loop_messages.cpp index db59d9d22e..15dbefe793 100644 --- a/test/OpenMP/for_simd_loop_messages.cpp +++ b/test/OpenMP/for_simd_loop_messages.cpp @@ -10,7 +10,7 @@ public: }; static int sii; -#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}} +#pragma omp threadprivate(sii) static int globalii; int test_iteration_spaces() { @@ -306,7 +306,6 @@ int test_iteration_spaces() { #pragma omp parallel { -// expected-error@+2 {{loop iteration variable in the associated loop of 'omp for simd' directive may not be threadprivate or thread local, predetermined as linear}} #pragma omp for simd for (sii = 0; sii < 10; sii += 1) c[sii] = a[sii]; diff --git a/test/OpenMP/parallel_for_loop_messages.cpp b/test/OpenMP/parallel_for_loop_messages.cpp index 318f0e6d9e..ba54c6a5ec 100644 --- a/test/OpenMP/parallel_for_loop_messages.cpp +++ b/test/OpenMP/parallel_for_loop_messages.cpp @@ -10,7 +10,7 @@ public: }; static int sii; -#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}} +#pragma omp threadprivate(sii) static int globalii; int test_iteration_spaces() { @@ -258,7 +258,6 @@ int test_iteration_spaces() { c[ii] = a[ii]; { -// expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel for' directive may not be threadprivate or thread local, predetermined as private}} #pragma omp parallel for for (sii = 0; sii < 10; sii += 1) c[sii] = a[sii]; diff --git a/test/OpenMP/parallel_for_simd_loop_messages.cpp b/test/OpenMP/parallel_for_simd_loop_messages.cpp index 43dbbe089b..b182f1b697 100644 --- a/test/OpenMP/parallel_for_simd_loop_messages.cpp +++ b/test/OpenMP/parallel_for_simd_loop_messages.cpp @@ -10,7 +10,7 @@ public: }; static int sii; -#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}} +#pragma omp threadprivate(sii) static int globalii; int test_iteration_spaces() { @@ -259,7 +259,6 @@ int test_iteration_spaces() { c[ii] = a[ii]; { -// expected-error@+2 {{loop iteration variable in the associated loop of 'omp parallel for simd' directive may not be threadprivate or thread local, predetermined as linear}} #pragma omp parallel for simd for (sii = 0; sii < 10; sii += 1) c[sii] = a[sii]; diff --git a/test/OpenMP/simd_loop_messages.cpp b/test/OpenMP/simd_loop_messages.cpp index b2c804c93e..b3d0a30736 100644 --- a/test/OpenMP/simd_loop_messages.cpp +++ b/test/OpenMP/simd_loop_messages.cpp @@ -1,7 +1,7 @@ // RUN: %clang_cc1 -fsyntax-only -fopenmp=libiomp5 -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s static int sii; -#pragma omp threadprivate(sii) // expected-note {{defined as threadprivate or thread local}} +#pragma omp threadprivate(sii) static int globalii; int test_iteration_spaces() { @@ -252,7 +252,6 @@ int test_iteration_spaces() { #pragma omp parallel { - // expected-error@+2 {{loop iteration variable in the associated loop of 'omp simd' directive may not be threadprivate or thread local, predetermined as linear}} #pragma omp simd for (sii = 0; sii < 10; sii+=1) c[sii] = a[sii];