diff options
| author | Alexey Bataev <a.bataev@hotmail.com> | 2015-12-28 06:23:08 +0000 |
|---|---|---|
| committer | Alexey Bataev <a.bataev@hotmail.com> | 2015-12-28 06:23:08 +0000 |
| commit | 993d28073c1bef2eaabf815523157bcc6e0ddd47 (patch) | |
| tree | c93d4e50b376b671fcb813e73f297d542ab22168 /clang/lib | |
| parent | af88afb214f04cffbaf760956c31855c7b845593 (diff) | |
| download | bcm5719-llvm-993d28073c1bef2eaabf815523157bcc6e0ddd47.tar.gz bcm5719-llvm-993d28073c1bef2eaabf815523157bcc6e0ddd47.zip | |
[OPENMP 4.5] Do not allow 'linear' clause along with 'ordered(expr)' clause.
According to OpenMP 4.5 "A linear clause or an ordered clause with a parameter can be specified on a loop directive but not both.""
llvm-svn: 256485
Diffstat (limited to 'clang/lib')
| -rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index c42718d576b..5aa1fcb184b 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -1622,6 +1622,9 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, ActOnCapturedRegionError(); return StmtError(); } + + OMPOrderedClause *OC = nullptr; + SmallVector<OMPLinearClause *, 4> LCs; // This is required for proper codegen. for (auto *Clause : Clauses) { if (isOpenMPPrivate(Clause->getClauseKind()) || @@ -1647,6 +1650,18 @@ StmtResult Sema::ActOnOpenMPRegionEnd(StmtResult S, MarkDeclarationsReferencedInExpr(E); } } + if (Clause->getClauseKind() == OMPC_ordered) + OC = cast<OMPOrderedClause>(Clause); + else if (Clause->getClauseKind() == OMPC_linear) + LCs.push_back(cast<OMPLinearClause>(Clause)); + } + if (!LCs.empty() && OC && OC->getNumForLoops()) { + for (auto *C : LCs) { + Diag(C->getLocStart(), diag::err_omp_linear_ordered) + << SourceRange(OC->getLocStart(), OC->getLocEnd()); + } + ActOnCapturedRegionError(); + return StmtError(); } return ActOnCapturedRegionEnd(S.get()); } |

