summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2019-06-28 14:59:25 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2019-06-28 14:59:25 +0000
commit405f8fc812c0067d810fa53f9dd7ba09d02f7cc5 (patch)
treeada488e4fe9f0f6d6a9a77e5254e3ba06f36291d /clang
parent13d9c723c89b851209c53e9509f8506559796020 (diff)
downloadbcm5719-llvm-405f8fc812c0067d810fa53f9dd7ba09d02f7cc5.tar.gz
bcm5719-llvm-405f8fc812c0067d810fa53f9dd7ba09d02f7cc5.zip
[OPENMP]Fix checks for DSA in simd constructs.
The errors for incorrectly specified data-sharing attributes for simd constructs must be emitted only for the explicitly provided clauses, not the predetermined ones. llvm-svn: 364647
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp4
-rw-r--r--clang/test/OpenMP/simd_loop_messages.cpp11
2 files changed, 12 insertions, 3 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index b531d31c1ca..732b22cbf30 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -5697,12 +5697,12 @@ static bool checkOpenMPIterationSpace(
? ((NestedLoopCount == 1) ? OMPC_linear : OMPC_lastprivate)
: OMPC_private;
if (((isOpenMPSimdDirective(DKind) && DVar.CKind != OMPC_unknown &&
- DVar.CKind != PredeterminedCKind) ||
+ DVar.CKind != PredeterminedCKind && DVar.RefExpr) ||
((isOpenMPWorksharingDirective(DKind) || DKind == OMPD_taskloop ||
isOpenMPDistributeDirective(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_private || DVar.RefExpr)) {
SemaRef.Diag(Init->getBeginLoc(), diag::err_omp_loop_var_dsa)
<< getOpenMPClauseName(DVar.CKind) << getOpenMPDirectiveName(DKind)
<< getOpenMPClauseName(PredeterminedCKind);
diff --git a/clang/test/OpenMP/simd_loop_messages.cpp b/clang/test/OpenMP/simd_loop_messages.cpp
index 80f3cb14b76..4c4ce5f98c2 100644
--- a/clang/test/OpenMP/simd_loop_messages.cpp
+++ b/clang/test/OpenMP/simd_loop_messages.cpp
@@ -1,5 +1,4 @@
// RUN: %clang_cc1 -fsyntax-only -fopenmp -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s
-
// RUN: %clang_cc1 -fsyntax-only -fopenmp-simd -x c++ -std=c++11 -fexceptions -fcxx-exceptions -verify %s
static int sii;
@@ -7,12 +6,22 @@ static int sii;
#pragma omp threadprivate(sii)
static int globalii;
+struct S {
+ static int ssi;
+};
+
int test_iteration_spaces() {
const int N = 100;
float a[N], b[N], c[N];
int ii, jj, kk;
float fii;
double dii;
+#pragma omp simd linear(S::ssi)
+ for (S::ssi = 0; S::ssi < 10; ++S::ssi)
+ ;
+#pragma omp simd // no messages expected
+ for (S::ssi = 0; S::ssi < 10; ++S::ssi)
+ ;
#pragma omp simd
for (int i = 0; i < 10; i+=1) {
c[i] = a[i] + b[i];
OpenPOWER on IntegriCloud