diff options
author | Alexey Bataev <a.bataev@hotmail.com> | 2014-02-13 05:29:23 +0000 |
---|---|---|
committer | Alexey Bataev <a.bataev@hotmail.com> | 2014-02-13 05:29:23 +0000 |
commit | aadd52e5cc8776ed65c0850876a68a1f10a92f10 (patch) | |
tree | 6789802725add097bbba8e1e1ab597a4f697a863 /clang/lib/Sema | |
parent | 0e3b5e0b20698558be7a30b42f3d245bf6a4af54 (diff) | |
download | bcm5719-llvm-aadd52e5cc8776ed65c0850876a68a1f10a92f10.tar.gz bcm5719-llvm-aadd52e5cc8776ed65c0850876a68a1f10a92f10.zip |
[OPENMP] 'if' clause support (no CodeGen support)
llvm-svn: 201297
Diffstat (limited to 'clang/lib/Sema')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 48 | ||||
-rw-r--r-- | clang/lib/Sema/TreeTransform.h | 19 |
2 files changed, 66 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index 0ca7d567449..fee9b1d2ce4 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -721,6 +721,48 @@ StmtResult Sema::ActOnOpenMPParallelDirective(ArrayRef<OMPClause *> Clauses, Clauses, AStmt)); } +OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, + Expr *Expr, + SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc) { + OMPClause *Res = 0; + switch (Kind) { + case OMPC_if: + Res = ActOnOpenMPIfClause(Expr, StartLoc, LParenLoc, EndLoc); + break; + case OMPC_default: + case OMPC_private: + case OMPC_firstprivate: + case OMPC_shared: + case OMPC_threadprivate: + case OMPC_unknown: + case NUM_OPENMP_CLAUSES: + llvm_unreachable("Clause is not allowed."); + } + return Res; +} + +OMPClause *Sema::ActOnOpenMPIfClause(Expr *Condition, + SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc) { + Expr *ValExpr = Condition; + if (!Condition->isValueDependent() && !Condition->isTypeDependent() && + !Condition->isInstantiationDependent() && + !Condition->containsUnexpandedParameterPack()) { + ExprResult Val = ActOnBooleanCondition(DSAStack->getCurScope(), + Condition->getExprLoc(), + Condition); + if (Val.isInvalid()) + return 0; + + ValExpr = Val.take(); + } + + return new (Context) OMPIfClause(ValExpr, StartLoc, LParenLoc, EndLoc); +} + OMPClause *Sema::ActOnOpenMPSimpleClause(OpenMPClauseKind Kind, unsigned Argument, SourceLocation ArgumentLoc, @@ -734,6 +776,7 @@ OMPClause *Sema::ActOnOpenMPSimpleClause(OpenMPClauseKind Kind, ActOnOpenMPDefaultClause(static_cast<OpenMPDefaultClauseKind>(Argument), ArgumentLoc, StartLoc, LParenLoc, EndLoc); break; + case OMPC_if: case OMPC_private: case OMPC_firstprivate: case OMPC_shared: @@ -780,7 +823,9 @@ OMPClause *Sema::ActOnOpenMPDefaultClause(OpenMPDefaultClauseKind Kind, case OMPC_DEFAULT_shared: DSAStack->setDefaultDSAShared(); break; - default: + case OMPC_DEFAULT_unknown: + case NUM_OPENMP_DEFAULT_KINDS: + llvm_unreachable("Clause kind is not allowed."); break; } return new (Context) OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, @@ -803,6 +848,7 @@ OMPClause *Sema::ActOnOpenMPVarListClause(OpenMPClauseKind Kind, case OMPC_shared: Res = ActOnOpenMPSharedClause(VarList, StartLoc, LParenLoc, EndLoc); break; + case OMPC_if: case OMPC_default: case OMPC_threadprivate: case OMPC_unknown: diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h index 7afed1a4480..d9ed6f5f027 100644 --- a/clang/lib/Sema/TreeTransform.h +++ b/clang/lib/Sema/TreeTransform.h @@ -1298,6 +1298,18 @@ public: StartLoc, EndLoc); } + /// \brief Build a new OpenMP 'if' clause. + /// + /// By default, performs semantic analysis to build the new statement. + /// Subclasses may override this routine to provide different behavior. + OMPClause *RebuildOMPIfClause(Expr *Condition, + SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc) { + return getSema().ActOnOpenMPIfClause(Condition, StartLoc, + LParenLoc, EndLoc); + } + /// \brief Build a new OpenMP 'default' clause. /// /// By default, performs semantic analysis to build the new statement. @@ -6279,6 +6291,13 @@ TreeTransform<Derived>::TransformOMPParallelDirective(OMPParallelDirective *D) { template<typename Derived> OMPClause * +TreeTransform<Derived>::TransformOMPIfClause(OMPIfClause *C) { + return getDerived().RebuildOMPIfClause(C->getCondition(), C->getLocStart(), + C->getLParenLoc(), C->getLocEnd()); +} + +template<typename Derived> +OMPClause * TreeTransform<Derived>::TransformOMPDefaultClause(OMPDefaultClause *C) { return getDerived().RebuildOMPDefaultClause(C->getDefaultKind(), C->getDefaultKindKwLoc(), |