diff options
author | SunilKuravinakop <98882378+SunilKuravinakop@users.noreply.github.com> | 2024-01-31 17:02:06 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-01-31 06:32:06 -0500 |
commit | a74e9ce5dc5cc746bd625b0ef20524a90a073375 (patch) | |
tree | b726a3735b5791e07c2a45ecef52976cb86a0b72 /clang/lib/Sema/SemaOpenMP.cpp | |
parent | 5cc87b424be87db4247f34ae5477be8b09a573e9 (diff) | |
download | llvm-a74e9ce5dc5cc746bd625b0ef20524a90a073375.zip llvm-a74e9ce5dc5cc746bd625b0ef20524a90a073375.tar.gz llvm-a74e9ce5dc5cc746bd625b0ef20524a90a073375.tar.bz2 |
[OpenMP] atomic compare weak : Parser & AST support (#79475)
This is a support for " #pragma omp atomic compare weak". It has Parser
& AST support for now.
---------
Authored-by: Sunil Kuravinakop <kuravina@pe28vega.us.cray.com>
Diffstat (limited to 'clang/lib/Sema/SemaOpenMP.cpp')
-rw-r--r-- | clang/lib/Sema/SemaOpenMP.cpp | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp index b51f25c..1556f6e 100644 --- a/clang/lib/Sema/SemaOpenMP.cpp +++ b/clang/lib/Sema/SemaOpenMP.cpp @@ -12708,9 +12708,11 @@ StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, } break; } + case OMPC_weak: case OMPC_fail: { if (!EncounteredAtomicKinds.contains(OMPC_compare)) { - Diag(C->getBeginLoc(), diag::err_omp_atomic_fail_no_compare) + Diag(C->getBeginLoc(), diag::err_omp_atomic_no_compare) + << getOpenMPClauseName(C->getClauseKind()) << SourceRange(C->getBeginLoc(), C->getEndLoc()); return StmtError(); } @@ -13202,6 +13204,27 @@ StmtResult Sema::ActOnOpenMPAtomicDirective(ArrayRef<OMPClause *> Clauses, E = Checker.getE(); D = Checker.getD(); CE = Checker.getCond(); + // The weak clause may only appear if the resulting atomic operation is + // an atomic conditional update for which the comparison tests for + // equality. It was not possible to do this check in + // OpenMPAtomicCompareChecker::checkStmt() as the check for OMPC_weak + // could not be performed (Clauses are not available). + auto *It = find_if(Clauses, [](OMPClause *C) { + return C->getClauseKind() == llvm::omp::Clause::OMPC_weak; + }); + if (It != Clauses.end()) { + auto *Cond = dyn_cast<BinaryOperator>(CE); + if (Cond->getOpcode() != BO_EQ) { + ErrorInfo.Error = Checker.ErrorTy::NotAnAssignment; + ErrorInfo.ErrorLoc = Cond->getExprLoc(); + ErrorInfo.NoteLoc = Cond->getOperatorLoc(); + ErrorInfo.ErrorRange = ErrorInfo.NoteRange = Cond->getSourceRange(); + + Diag(ErrorInfo.ErrorLoc, diag::err_omp_atomic_weak_no_equality) + << ErrorInfo.ErrorRange; + return StmtError(); + } + } // We reuse IsXLHSInRHSPart to tell if it is in the form 'x ordop expr'. IsXLHSInRHSPart = Checker.isXBinopExpr(); } @@ -17593,6 +17616,9 @@ OMPClause *Sema::ActOnOpenMPClause(OpenMPClauseKind Kind, case OMPC_relaxed: Res = ActOnOpenMPRelaxedClause(StartLoc, EndLoc); break; + case OMPC_weak: + Res = ActOnOpenMPWeakClause(StartLoc, EndLoc); + break; case OMPC_threads: Res = ActOnOpenMPThreadsClause(StartLoc, EndLoc); break; @@ -17781,6 +17807,11 @@ OMPClause *Sema::ActOnOpenMPRelaxedClause(SourceLocation StartLoc, return new (Context) OMPRelaxedClause(StartLoc, EndLoc); } +OMPClause *Sema::ActOnOpenMPWeakClause(SourceLocation StartLoc, + SourceLocation EndLoc) { + return new (Context) OMPWeakClause(StartLoc, EndLoc); +} + OMPClause *Sema::ActOnOpenMPThreadsClause(SourceLocation StartLoc, SourceLocation EndLoc) { return new (Context) OMPThreadsClause(StartLoc, EndLoc); |