From 7b6bc88c5aaf2e3db7dad2d9876d6eee1cc9476c Mon Sep 17 00:00:00 2001 From: Alexey Bataev Date: Thu, 26 Nov 2015 07:50:39 +0000 Subject: [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 --- clang/lib/Sema/SemaOpenMP.cpp | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) (limited to 'clang/lib/Sema/SemaOpenMP.cpp') 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; } -- cgit v1.2.3