diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2015-11-26 07:50:39 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-11-26 07:50:39 +0000 |
commit | 7b6bc88c5aaf2e3db7dad2d9876d6eee1cc9476c (patch) | |
tree | 7664de8efde365a5c44fa93c6419733a74042b4d /clang/lib/Sema/SemaOpenMP.cpp | |
parent | ed865dfcc50d5248dbbb055c8859ebf6a15f3bc8 (diff) | |
download | bcm5719-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/lib/Sema/SemaOpenMP.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 26 |
1 files changed, 16 insertions, 10 deletions
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; } |