summaryrefslogtreecommitdiffstats
path: root/clang/lib/Sema/SemaOpenMP.cpp
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/lib/Sema/SemaOpenMP.cpp
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/lib/Sema/SemaOpenMP.cpp')
-rw-r--r--clang/lib/Sema/SemaOpenMP.cpp26
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;
}
OpenPOWER on IntegriCloud