diff options
author | Samuel Antao <sfantao@us.ibm.com> | 2016-05-26 17:49:04 +0000 |
---|---|---|
committer | Samuel Antao <sfantao@us.ibm.com> | 2016-05-26 17:49:04 +0000 |
commit | ec172c6da02111b2e1150b3bd94578789d4fbd14 (patch) | |
tree | 86d58f9d1449977bacb1d6e03886ad0461602716 /clang/lib/Sema/SemaOpenMP.cpp | |
parent | d6e6bf1808f54cd755847aed3a4ee40b27102cb5 (diff) | |
download | bcm5719-llvm-ec172c6da02111b2e1150b3bd94578789d4fbd14.tar.gz bcm5719-llvm-ec172c6da02111b2e1150b3bd94578789d4fbd14.zip |
[OpenMP] Parsing and sema support for the from clause
Summary:
The patch contains the parsing and sema support for the `from` clause.
Patch based on the original post by Kelvin Li.
Reviewers: hfinkel, carlo.bertolli, kkwli0, arpith-jacob, ABataev
Subscribers: caomhin, cfe-commits
Differential Revision: http://reviews.llvm.org/D18488
llvm-svn: 270882
Diffstat (limited to 'clang/lib/Sema/SemaOpenMP.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 33 |
1 files changed, 27 insertions, 6 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index eb572909ae2..154ea8ae6fa 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -6523,7 +6523,7 @@ StmtResult Sema::ActOnOpenMPTargetUpdateDirective(ArrayRef<OMPClause *> Clauses, SourceLocation EndLoc) { bool seenMotionClause = false; for (auto *C : Clauses) { - if (C->getClauseKind() == OMPC_to) + if (C->getClauseKind() == OMPC_to || C->getClauseKind() == OMPC_from) seenMotionClause = true; } if (!seenMotionClause) { @@ -6800,6 +6800,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprClause(OpenMPClauseKind Kind, Expr *Expr, case OMPC_unknown: case OMPC_uniform: case OMPC_to: + case OMPC_from: llvm_unreachable("Clause is not allowed."); } return Res; @@ -7087,6 +7088,7 @@ OMPClause *Sema::ActOnOpenMPSimpleClause( case OMPC_unknown: case OMPC_uniform: case OMPC_to: + case OMPC_from: llvm_unreachable("Clause is not allowed."); } return Res; @@ -7239,6 +7241,7 @@ OMPClause *Sema::ActOnOpenMPSingleExprWithArgClause( case OMPC_unknown: case OMPC_uniform: case OMPC_to: + case OMPC_from: llvm_unreachable("Clause is not allowed."); } return Res; @@ -7424,6 +7427,7 @@ OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind, case OMPC_unknown: case OMPC_uniform: case OMPC_to: + case OMPC_from: llvm_unreachable("Clause is not allowed."); } return Res; @@ -7540,6 +7544,9 @@ OMPClause *Sema::ActOnOpenMPVarListClause( case OMPC_to: Res = ActOnOpenMPToClause(VarList, StartLoc, LParenLoc, EndLoc); break; + case OMPC_from: + Res = ActOnOpenMPFromClause(VarList, StartLoc, LParenLoc, EndLoc); + break; case OMPC_if: case OMPC_final: case OMPC_num_threads: @@ -10177,7 +10184,7 @@ static bool CheckMapConflicts( if (CKind == OMPC_map) SemaRef.Diag(ELoc, diag::err_omp_map_shared_storage) << ERange; else { - assert(CKind == OMPC_to); + assert(CKind == OMPC_to || CKind == OMPC_from); SemaRef.Diag(ELoc, diag::err_omp_once_referenced_in_target_update) << ERange; } @@ -10238,7 +10245,7 @@ static bool CheckMapConflicts( if (CKind == OMPC_map) SemaRef.Diag(ELoc, diag::err_omp_map_shared_storage) << ERange; else { - assert(CKind == OMPC_to); + assert(CKind == OMPC_to || CKind == OMPC_from); SemaRef.Diag(ELoc, diag::err_omp_once_referenced_in_target_update) << ERange; } @@ -10319,8 +10326,8 @@ checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, SourceLocation StartLoc, OpenMPMapClauseKind MapType = OMPC_MAP_unknown, bool IsMapTypeImplicit = false) { - // We only expect mappable expressions in 'to' and 'map' clauses. - assert((CKind == OMPC_map || CKind == OMPC_to) && + // We only expect mappable expressions in 'to', 'from', and 'map' clauses. + assert((CKind == OMPC_map || CKind == OMPC_to || CKind == OMPC_from) && "Unexpected clause kind with mappable expressions!"); // Keep track of the mappable components and base declarations in this clause. @@ -10330,7 +10337,7 @@ checkMappableExpressionList(Sema &SemaRef, DSAStackTy *DSAS, // lists. for (auto &RE : MVLI.VarList) { - assert(RE && "Null expr in omp to/map clause"); + assert(RE && "Null expr in omp to/from/map clause"); SourceLocation ELoc = RE->getExprLoc(); auto *VE = RE->IgnoreParenLValueCasts(); @@ -11117,3 +11124,17 @@ OMPClause *Sema::ActOnOpenMPToClause(ArrayRef<Expr *> VarList, MVLI.ProcessedVarList, MVLI.VarBaseDeclarations, MVLI.VarComponents); } + +OMPClause *Sema::ActOnOpenMPFromClause(ArrayRef<Expr *> VarList, + SourceLocation StartLoc, + SourceLocation LParenLoc, + SourceLocation EndLoc) { + MappableVarListInfo MVLI(VarList); + checkMappableExpressionList(*this, DSAStack, OMPC_from, MVLI, StartLoc); + if (MVLI.ProcessedVarList.empty()) + return nullptr; + + return OMPFromClause::Create(Context, StartLoc, LParenLoc, EndLoc, + MVLI.ProcessedVarList, MVLI.VarBaseDeclarations, + MVLI.VarComponents); +} |