summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
authorAlexey Bataev <a.bataev@hotmail.com>2015-11-26 07:50:39 +0000
committerAlexey Bataev <a.bataev@hotmail.com>2015-11-26 07:50:39 +0000
commit7b6bc88c5aaf2e3db7dad2d9876d6eee1cc9476c (patch)
tree7664de8efde365a5c44fa93c6419733a74042b4d /clang
parented865dfcc50d5248dbbb055c8859ebf6a15f3bc8 (diff)
downloadbcm5719-llvm-7b6bc88c5aaf2e3db7dad2d9876d6eee1cc9476c.tar.gz
bcm5719-llvm-7b6bc88c5aaf2e3db7dad2d9876d6eee1cc9476c.zip
[OPENMP 4.5] Fixed rules for 'ordered' clause.
According to OpenMP 4.5 the parameter of 'ordered' clause must be greater than or equal to the parameter of 'collapse' clause. Patch adds this rule. llvm-svn: 254141
Diffstat (limited to 'clang')
-rw-r--r--clang/include/clang/Basic/DiagnosticSemaKinds.td4
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp26
-rw-r--r--clang/test/OpenMP/for_ordered_clause.cpp16
3 files changed, 36 insertions, 10 deletions
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index 9585110f967..ece71d3be22 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -7901,6 +7901,10 @@ def note_omp_static_member_in_target : Note<
"mappable type cannot contain static members">;
def err_omp_threadprivate_in_map : Error<
"threadprivate variables are not allowed in map clause">;
+def err_omp_wrong_ordered_loop_count : Error<
+ "the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause">;
+def note_collapse_loop_count : Note<
+ "parameter of the 'collapse' clause">;
} // end of OpenMP category
let CategoryName = "Related Result Type Issue" in {
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 079f87aa868..3392e53d514 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -3359,13 +3359,22 @@ CheckOpenMPLoop(OpenMPDirectiveKind DKind, Expr *CollapseLoopCountExpr,
// Found 'collapse' clause - calculate collapse number.
llvm::APSInt Result;
if (CollapseLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
- NestedLoopCount += Result.getLimitedValue() - 1;
+ NestedLoopCount = Result.getLimitedValue();
}
if (OrderedLoopCountExpr) {
// Found 'ordered' clause - calculate collapse number.
llvm::APSInt Result;
- if (OrderedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext()))
- NestedLoopCount += Result.getLimitedValue() - 1;
+ if (OrderedLoopCountExpr->EvaluateAsInt(Result, SemaRef.getASTContext())) {
+ if (Result.getLimitedValue() < NestedLoopCount) {
+ SemaRef.Diag(OrderedLoopCountExpr->getExprLoc(),
+ diag::err_omp_wrong_ordered_loop_count)
+ << OrderedLoopCountExpr->getSourceRange();
+ SemaRef.Diag(CollapseLoopCountExpr->getExprLoc(),
+ diag::note_collapse_loop_count)
+ << CollapseLoopCountExpr->getSourceRange();
+ }
+ NestedLoopCount = Result.getLimitedValue();
+ }
}
// This is helper routine for loop directives (e.g., 'for', 'simd',
// 'for simd', etc.).
@@ -5256,13 +5265,10 @@ ExprResult Sema::VerifyPositiveIntegerConstantInClause(Expr *E,
<< E->getSourceRange();
return ExprError();
}
- if (CKind == OMPC_collapse) {
- DSAStack->setCollapseNumber(DSAStack->getCollapseNumber() - 1 +
- Result.getExtValue());
- } else if (CKind == OMPC_ordered) {
- DSAStack->setCollapseNumber(DSAStack->getCollapseNumber() - 1 +
- Result.getExtValue());
- }
+ if (CKind == OMPC_collapse)
+ DSAStack->setCollapseNumber(Result.getExtValue());
+ else if (CKind == OMPC_ordered)
+ DSAStack->setCollapseNumber(Result.getExtValue());
return ICE;
}
diff --git a/clang/test/OpenMP/for_ordered_clause.cpp b/clang/test/OpenMP/for_ordered_clause.cpp
index 5b080215873..f28731e4770 100644
--- a/clang/test/OpenMP/for_ordered_clause.cpp
+++ b/clang/test/OpenMP/for_ordered_clause.cpp
@@ -52,11 +52,19 @@ T tmain(T argc, S **argv) { //expected-note 2 {{declared here}
#pragma omp for ordered(1)
for (int i = ST; i < N; i++)
argv[0][i] = argv[0][i] - argv[0][i - ST];
+#pragma omp for ordered(N-1) // expected-error 2 {{argument to 'ordered' clause must be a positive integer value}}
+ for (int i = ST; i < N; i++)
+ argv[0][i] = argv[0][i] - argv[0][i - ST];
#pragma omp for ordered(N) // expected-error {{argument to 'ordered' clause must be a positive integer value}}
for (T i = ST; i < N; i++)
argv[0][i] = argv[0][i] - argv[0][i - ST];
#pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}}
+#pragma omp for ordered(N) collapse(N + 2) // expected-error {{the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause}} expected-note {{parameter of the 'collapse' clause}} expected-error {{argument to 'ordered' clause must be a positive integer value}}
+ for (int i = ST; i < N; i++)
+ for (int j = ST; j < N; j++)
+ for (int k = ST; k < N; k++)
+ foo();
return argc;
}
@@ -98,6 +106,14 @@ int main(int argc, char **argv) {
foo();
#pragma omp for ordered(2) // expected-note {{as specified in 'ordered' clause}}
foo(); // expected-error {{expected 2 for loops after '#pragma omp for'}}
+#pragma omp for ordered(0) // expected-error {{argument to 'ordered' clause must be a positive integer value}}
+ for (int i = 4; i < 12; i++)
+ argv[0][i] = argv[0][i] - argv[0][i - 4];
+#pragma omp for ordered(2) collapse(3) // expected-error {{the parameter of the 'ordered' clause must be greater than or equal to the parameter of the 'collapse' clause}} expected-note {{parameter of the 'collapse' clause}}
+ for (int i = 0; i < 10; i++)
+ for (int j = 0; j < 11; j++)
+ for (int k = 0; k < 12; k++)
+ foo();
// expected-note@+1 {{in instantiation of function template specialization 'tmain<int, char, 1, 0>' requested here}}
return tmain<int, char, 1, 0>(argc, argv);
}
OpenPOWER on IntegriCloud