aboutsummaryrefslogtreecommitdiff
path: root/clang/lib/Parse/ParseOpenMP.cpp
diff options
context:
space:
mode:
authorSunil Kuravinakop <koops@hpe.com>2022-05-24 23:55:08 -0500
committerChi-Chun, Chen <chichunchen844@gmail.com>2022-05-24 23:56:42 -0500
commit232bf8189ef7d574a468bd5bfd1e84e962f7f16e (patch)
tree2f942cde25390f0db10eeb3819db11dfe292f235 /clang/lib/Parse/ParseOpenMP.cpp
parent66db5312bd6676cae721b3ad9f76b68af7909e7c (diff)
downloadllvm-232bf8189ef7d574a468bd5bfd1e84e962f7f16e.zip
llvm-232bf8189ef7d574a468bd5bfd1e84e962f7f16e.tar.gz
llvm-232bf8189ef7d574a468bd5bfd1e84e962f7f16e.tar.bz2
[OpenMP] atomic compare fail : Parser & AST support
This is a support for " #pragma omp atomic compare fail ". It has Parser & AST support for now. Reviewed By: tianshilei1992 Differential Revision: https://reviews.llvm.org/D123235
Diffstat (limited to 'clang/lib/Parse/ParseOpenMP.cpp')
-rw-r--r--clang/lib/Parse/ParseOpenMP.cpp46
1 files changed, 45 insertions, 1 deletions
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 48ee1b0..3d5c9c9 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -3234,6 +3234,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
case OMPC_write:
case OMPC_capture:
case OMPC_compare:
+ case OMPC_fail:
case OMPC_seq_cst:
case OMPC_acq_rel:
case OMPC_acquire:
@@ -3620,6 +3621,45 @@ OMPClause *Parser::ParseOpenMPSimpleClause(OpenMPClauseKind Kind,
Val.getValue().Loc, Val.getValue().RLoc);
}
+OMPClause *Parser::ParseOpenMPFailClause(OMPClause *Clause) {
+
+ OMPFailClause *FailClause = static_cast<OMPFailClause *>(Clause);
+ SourceLocation LParenLoc;
+ if (Tok.is(tok::l_paren)) {
+ LParenLoc = Tok.getLocation();
+ ConsumeAnyToken();
+ } else {
+ Diag(diag::err_expected_lparen_after) << getOpenMPClauseName(OMPC_fail);
+ return Clause;
+ }
+
+
+ OpenMPClauseKind CKind = Tok.isAnnotation()
+ ? OMPC_unknown
+ : getOpenMPClauseKind(PP.getSpelling(Tok));
+ if (CKind == OMPC_unknown) {
+ Diag(diag::err_omp_expected_clause) << ("atomic compare fail");
+ return Clause;
+ }
+ OMPClause *MemoryOrderClause = ParseOpenMPClause(CKind, false);
+ SourceLocation MemOrderLoc;
+ // Store Memory Order SubClause for Sema.
+ if (MemoryOrderClause) {
+ MemOrderLoc = Tok.getLocation();
+ }
+
+ if (Tok.is(tok::r_paren)) {
+ FailClause->initFailClause(LParenLoc,MemoryOrderClause,MemOrderLoc);
+ ConsumeAnyToken();
+ } else {
+ const IdentifierInfo *Arg = Tok.getIdentifierInfo();
+ Diag(Tok, diag::err_expected_rparen_after)
+ << (Arg ? Arg->getName() : "atomic compare fail");
+ }
+
+ return Clause;
+}
+
/// Parsing of OpenMP clauses like 'ordered'.
///
/// ordered-clause:
@@ -3652,7 +3692,11 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPClauseKind Kind, bool ParseOnly) {
if (ParseOnly)
return nullptr;
- return Actions.ActOnOpenMPClause(Kind, Loc, Tok.getLocation());
+ OMPClause *Clause = Actions.ActOnOpenMPClause(Kind, Loc, Tok.getLocation());
+ if (Kind == llvm::omp::Clause::OMPC_fail) {
+ Clause = ParseOpenMPFailClause(Clause);
+ }
+ return Clause;
}
/// Parsing of OpenMP clauses with single expressions and some additional