diff options
-rw-r--r-- | clang/include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 26 | ||||
-rw-r--r-- | clang/test/OpenMP/for_ordered_clause.cpp | 16 |
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); } |