[clang] [flang] [llvm] [OpenMP] Split UPDATE clause into two: for ATOMIC and for DEPOBJ (PR #212270)
Krzysztof Parzyszek via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 27 08:27:34 PDT 2026
https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/212270
The UPDATE clause has the same spelling on both of these directives, but functionally it's two different clauses. Split them into "update", and "update_depend_objects" to be able to tie their properties to their enum ids.
This should make it easier to implement auto-generating of clause properties in the future by avoiding spelling conflicts.
>From 1ddc975092b94f8c91a9acf32428c74f82f9bfe6 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Sat, 25 Jul 2026 09:36:02 -0500
Subject: [PATCH] [OpenMP] Split UPDATE clause into two: for ATOMIC and for
DEPOBJ
The UPDATE clause has the same spelling on both of these directives,
but functionally it's two different clauses. Split them into "update",
and "update_depend_objects" to be able to tie their properties to their
enum ids.
This should make it easier to implement auto-generating of clause
properties in the future by avoiding spelling conflicts.
---
clang/include/clang/AST/OpenMPClause.h | 90 ++++++++++---------
clang/include/clang/AST/RecursiveASTVisitor.h | 6 ++
clang/include/clang/Sema/SemaOpenMP.h | 12 +--
clang/lib/AST/OpenMPClause.cpp | 46 ++++------
clang/lib/AST/StmtProfile.cpp | 3 +
clang/lib/AST/TextNodeDumper.cpp | 5 +-
clang/lib/Basic/OpenMPKinds.cpp | 4 +-
clang/lib/CodeGen/CGOpenMPRuntime.cpp | 6 +-
clang/lib/CodeGen/CGOpenMPRuntime.h | 2 +-
clang/lib/CodeGen/CGStmtOpenMP.cpp | 4 +-
clang/lib/Parse/ParseOpenMP.cpp | 18 +++-
clang/lib/Sema/SemaOpenMP.cpp | 24 ++---
clang/lib/Sema/TreeTransform.h | 7 ++
clang/lib/Serialization/ASTReader.cpp | 18 ++--
clang/lib/Serialization/ASTWriter.cpp | 14 +--
clang/tools/libclang/CIndex.cpp | 3 +
flang/include/flang/Lower/OpenMP/Clauses.h | 2 +
flang/include/flang/Parser/dump-parse-tree.h | 2 +-
flang/include/flang/Parser/parse-tree.h | 4 +-
flang/lib/Lower/OpenMP/Clauses.cpp | 19 ++--
flang/lib/Parser/openmp-parsers.cpp | 11 ++-
flang/lib/Semantics/check-omp-structure.cpp | 12 +--
flang/lib/Semantics/check-omp-structure.h | 2 +-
flang/lib/Semantics/openmp-modifiers.cpp | 4 +-
flang/test/Parser/OpenMP/atomic-compare.f90 | 12 +--
flang/test/Parser/OpenMP/depobj-construct.f90 | 2 +-
llvm/include/llvm/Frontend/OpenMP/ClauseT.h | 15 +++-
llvm/include/llvm/Frontend/OpenMP/OMP.td | 11 ++-
28 files changed, 204 insertions(+), 154 deletions(-)
diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h
index 641c03bf8ff5c..9e9295e1a0c54 100644
--- a/clang/include/clang/AST/OpenMPClause.h
+++ b/clang/include/clang/AST/OpenMPClause.h
@@ -2967,7 +2967,40 @@ class OMPWriteClause : public OMPClause {
/// #pragma omp atomic update
/// \endcode
/// In this example directive '#pragma omp atomic' has 'update' clause.
-/// Also, this class represents 'update' clause in '#pragma omp depobj'
+class OMPUpdateClause : public OMPClause {
+public:
+ /// Build 'update' clause.
+ ///
+ /// \param StartLoc Starting location of the clause.
+ /// \param EndLoc Ending location of the clause.
+ OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc)
+ : OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc) {}
+
+ /// Build an empty clause.
+ OMPUpdateClause()
+ : OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()) {}
+
+ child_range children() {
+ return child_range(child_iterator(), child_iterator());
+ }
+
+ const_child_range children() const {
+ return const_child_range(const_child_iterator(), const_child_iterator());
+ }
+
+ child_range used_children() {
+ return child_range(child_iterator(), child_iterator());
+ }
+ const_child_range used_children() const {
+ return const_child_range(const_child_iterator(), const_child_iterator());
+ }
+
+ static bool classof(const OMPClause *T) {
+ return T->getClauseKind() == llvm::omp::OMPC_update;
+ }
+};
+
+/// This class represents 'update' clause in '#pragma omp depobj'
/// directive.
///
/// \code
@@ -2975,38 +3008,32 @@ class OMPWriteClause : public OMPClause {
/// \endcode
/// In this example directive '#pragma omp depobj' has 'update' clause with 'in'
/// dependence kind.
-class OMPUpdateClause final
+class OMPUpdateDependObjectsClause final
: public OMPClause,
- private llvm::TrailingObjects<OMPUpdateClause, SourceLocation,
- OpenMPDependClauseKind> {
+ private llvm::TrailingObjects<OMPUpdateDependObjectsClause,
+ SourceLocation, OpenMPDependClauseKind> {
friend class OMPClauseReader;
friend TrailingObjects;
- /// true if extended version of the clause for 'depobj' directive.
- bool IsExtended = false;
-
/// Define the sizes of each trailing object array except the last one. This
/// is required for TrailingObjects to work properly.
size_t numTrailingObjects(OverloadToken<SourceLocation>) const {
// 2 locations: for '(' and argument location.
- return IsExtended ? 2 : 0;
+ return 2;
}
/// Sets the location of '(' in clause for 'depobj' directive.
void setLParenLoc(SourceLocation Loc) {
- assert(IsExtended && "Expected extended clause.");
*getTrailingObjects<SourceLocation>() = Loc;
}
/// Sets the location of '(' in clause for 'depobj' directive.
void setArgumentLoc(SourceLocation Loc) {
- assert(IsExtended && "Expected extended clause.");
*std::next(getTrailingObjects<SourceLocation>(), 1) = Loc;
}
/// Sets the dependence kind for the clause for 'depobj' directive.
void setDependencyKind(OpenMPDependClauseKind DK) {
- assert(IsExtended && "Expected extended clause.");
*getTrailingObjects<OpenMPDependClauseKind>() = DK;
}
@@ -3014,25 +3041,15 @@ class OMPUpdateClause final
///
/// \param StartLoc Starting location of the clause.
/// \param EndLoc Ending location of the clause.
- OMPUpdateClause(SourceLocation StartLoc, SourceLocation EndLoc,
- bool IsExtended)
- : OMPClause(llvm::omp::OMPC_update, StartLoc, EndLoc),
- IsExtended(IsExtended) {}
+ OMPUpdateDependObjectsClause(SourceLocation StartLoc, SourceLocation EndLoc)
+ : OMPClause(llvm::omp::OMPC_update_depend_objects, StartLoc, EndLoc) {}
/// Build an empty clause.
- OMPUpdateClause(bool IsExtended)
- : OMPClause(llvm::omp::OMPC_update, SourceLocation(), SourceLocation()),
- IsExtended(IsExtended) {}
+ OMPUpdateDependObjectsClause()
+ : OMPClause(llvm::omp::OMPC_update_depend_objects, SourceLocation(),
+ SourceLocation()) {}
public:
- /// Creates clause for 'atomic' directive.
- ///
- /// \param C AST context.
- /// \param StartLoc Starting location of the clause.
- /// \param EndLoc Ending location of the clause.
- static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
- SourceLocation EndLoc);
-
/// Creates clause for 'depobj' directive.
///
/// \param C AST context.
@@ -3041,21 +3058,15 @@ class OMPUpdateClause final
/// \param ArgumentLoc Location of the argument.
/// \param DK Dependence kind.
/// \param EndLoc Ending location of the clause.
- static OMPUpdateClause *Create(const ASTContext &C, SourceLocation StartLoc,
- SourceLocation LParenLoc,
- SourceLocation ArgumentLoc,
- OpenMPDependClauseKind DK,
- SourceLocation EndLoc);
+ static OMPUpdateDependObjectsClause *
+ Create(const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation ArgumentLoc, OpenMPDependClauseKind DK,
+ SourceLocation EndLoc);
/// Creates an empty clause with the place for \a N variables.
///
/// \param C AST context.
- /// \param IsExtended true if extended clause for 'depobj' directive must be
- /// created.
- static OMPUpdateClause *CreateEmpty(const ASTContext &C, bool IsExtended);
-
- /// Checks if the clause is the extended clauses for 'depobj' directive.
- bool isExtended() const { return IsExtended; }
+ static OMPUpdateDependObjectsClause *CreateEmpty(const ASTContext &C);
child_range children() {
return child_range(child_iterator(), child_iterator());
@@ -3074,24 +3085,21 @@ class OMPUpdateClause final
/// Gets the location of '(' in clause for 'depobj' directive.
SourceLocation getLParenLoc() const {
- assert(IsExtended && "Expected extended clause.");
return *getTrailingObjects<SourceLocation>();
}
/// Gets the location of argument in clause for 'depobj' directive.
SourceLocation getArgumentLoc() const {
- assert(IsExtended && "Expected extended clause.");
return *std::next(getTrailingObjects<SourceLocation>(), 1);
}
/// Gets the dependence kind in clause for 'depobj' directive.
OpenMPDependClauseKind getDependencyKind() const {
- assert(IsExtended && "Expected extended clause.");
return *getTrailingObjects<OpenMPDependClauseKind>();
}
static bool classof(const OMPClause *T) {
- return T->getClauseKind() == llvm::omp::OMPC_update;
+ return T->getClauseKind() == llvm::omp::OMPC_update_depend_objects;
}
};
diff --git a/clang/include/clang/AST/RecursiveASTVisitor.h b/clang/include/clang/AST/RecursiveASTVisitor.h
index cdf8a71d54cc9..6913e9b614315 100644
--- a/clang/include/clang/AST/RecursiveASTVisitor.h
+++ b/clang/include/clang/AST/RecursiveASTVisitor.h
@@ -3710,6 +3710,12 @@ bool RecursiveASTVisitor<Derived>::VisitOMPUpdateClause(OMPUpdateClause *) {
return true;
}
+template <typename Derived>
+bool RecursiveASTVisitor<Derived>::VisitOMPUpdateDependObjectsClause(
+ OMPUpdateDependObjectsClause *) {
+ return true;
+}
+
template <typename Derived>
bool RecursiveASTVisitor<Derived>::VisitOMPCaptureClause(OMPCaptureClause *) {
return true;
diff --git a/clang/include/clang/Sema/SemaOpenMP.h b/clang/include/clang/Sema/SemaOpenMP.h
index 9ef388a744db8..361473140e236 100644
--- a/clang/include/clang/Sema/SemaOpenMP.h
+++ b/clang/include/clang/Sema/SemaOpenMP.h
@@ -1012,12 +1012,12 @@ class SemaOpenMP : public SemaBase {
SourceLocation LParenLoc,
SourceLocation MLoc, SourceLocation KindLoc,
SourceLocation EndLoc);
- /// Called on well-formed 'update' clause.
- OMPClause *ActOnOpenMPUpdateClause(OpenMPDependClauseKind Kind,
- SourceLocation KindLoc,
- SourceLocation StartLoc,
- SourceLocation LParenLoc,
- SourceLocation EndLoc);
+ /// Called on well-formed 'update_depend_objects' clause.
+ OMPClause *ActOnOpenMPUpdateDependObjectsClause(OpenMPDependClauseKind Kind,
+ SourceLocation KindLoc,
+ SourceLocation StartLoc,
+ SourceLocation LParenLoc,
+ SourceLocation EndLoc);
/// Called on well-formed 'holds' clause.
OMPClause *ActOnOpenMPHoldsClause(Expr *E, SourceLocation StartLoc,
SourceLocation LParenLoc,
diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp
index d451255bf5845..cac701994def8 100644
--- a/clang/lib/AST/OpenMPClause.cpp
+++ b/clang/lib/AST/OpenMPClause.cpp
@@ -409,36 +409,26 @@ const Expr *OMPOrderedClause::getLoopCounter(unsigned NumLoop) const {
return getTrailingObjects()[NumberOfLoops + NumLoop];
}
-OMPUpdateClause *OMPUpdateClause::Create(const ASTContext &C,
- SourceLocation StartLoc,
- SourceLocation EndLoc) {
- return new (C) OMPUpdateClause(StartLoc, EndLoc, /*IsExtended=*/false);
-}
-
-OMPUpdateClause *
-OMPUpdateClause::Create(const ASTContext &C, SourceLocation StartLoc,
- SourceLocation LParenLoc, SourceLocation ArgumentLoc,
- OpenMPDependClauseKind DK, SourceLocation EndLoc) {
+OMPUpdateDependObjectsClause *OMPUpdateDependObjectsClause::Create(
+ const ASTContext &C, SourceLocation StartLoc, SourceLocation LParenLoc,
+ SourceLocation ArgumentLoc, OpenMPDependClauseKind DK,
+ SourceLocation EndLoc) {
void *Mem =
C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
- alignof(OMPUpdateClause));
- auto *Clause =
- new (Mem) OMPUpdateClause(StartLoc, EndLoc, /*IsExtended=*/true);
+ alignof(OMPUpdateDependObjectsClause));
+ auto *Clause = new (Mem) OMPUpdateDependObjectsClause(StartLoc, EndLoc);
Clause->setLParenLoc(LParenLoc);
Clause->setArgumentLoc(ArgumentLoc);
Clause->setDependencyKind(DK);
return Clause;
}
-OMPUpdateClause *OMPUpdateClause::CreateEmpty(const ASTContext &C,
- bool IsExtended) {
- if (!IsExtended)
- return new (C) OMPUpdateClause(/*IsExtended=*/false);
+OMPUpdateDependObjectsClause *
+OMPUpdateDependObjectsClause::CreateEmpty(const ASTContext &C) {
void *Mem =
C.Allocate(totalSizeToAlloc<SourceLocation, OpenMPDependClauseKind>(2, 1),
- alignof(OMPUpdateClause));
- auto *Clause = new (Mem) OMPUpdateClause(/*IsExtended=*/true);
- Clause->IsExtended = true;
+ alignof(OMPUpdateDependObjectsClause));
+ auto *Clause = new (Mem) OMPUpdateDependObjectsClause();
return Clause;
}
@@ -2261,14 +2251,16 @@ void OMPClausePrinter::VisitOMPReadClause(OMPReadClause *) { OS << "read"; }
void OMPClausePrinter::VisitOMPWriteClause(OMPWriteClause *) { OS << "write"; }
-void OMPClausePrinter::VisitOMPUpdateClause(OMPUpdateClause *Node) {
+void OMPClausePrinter::VisitOMPUpdateClause(OMPUpdateClause *) {
OS << "update";
- if (Node->isExtended()) {
- OS << "(";
- OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
- Node->getDependencyKind());
- OS << ")";
- }
+}
+
+void OMPClausePrinter::VisitOMPUpdateDependObjectsClause(
+ OMPUpdateDependObjectsClause *Node) {
+ OS << "update(";
+ OS << getOpenMPSimpleClauseTypeName(Node->getClauseKind(),
+ Node->getDependencyKind());
+ OS << ")";
}
void OMPClausePrinter::VisitOMPCaptureClause(OMPCaptureClause *) {
diff --git a/clang/lib/AST/StmtProfile.cpp b/clang/lib/AST/StmtProfile.cpp
index 00c132f1ed9e0..ec4493d0afa41 100644
--- a/clang/lib/AST/StmtProfile.cpp
+++ b/clang/lib/AST/StmtProfile.cpp
@@ -630,6 +630,9 @@ void OMPClauseProfiler::VisitOMPWriteClause(const OMPWriteClause *) {}
void OMPClauseProfiler::VisitOMPUpdateClause(const OMPUpdateClause *) {}
+void OMPClauseProfiler::VisitOMPUpdateDependObjectsClause(
+ const OMPUpdateDependObjectsClause *) {}
+
void OMPClauseProfiler::VisitOMPCaptureClause(const OMPCaptureClause *) {}
void OMPClauseProfiler::VisitOMPCompareClause(const OMPCompareClause *) {}
diff --git a/clang/lib/AST/TextNodeDumper.cpp b/clang/lib/AST/TextNodeDumper.cpp
index 4bc7607a87d92..b2b3eda9ff2e3 100644
--- a/clang/lib/AST/TextNodeDumper.cpp
+++ b/clang/lib/AST/TextNodeDumper.cpp
@@ -372,7 +372,10 @@ void TextNodeDumper::Visit(const OMPClause *C) {
}
{
ColorScope Color(OS, ShowColors, ASTDumpColor::Attr);
- StringRef ClauseName(llvm::omp::getOpenMPClauseName(C->getClauseKind()));
+ OpenMPClauseKind CKind = C->getClauseKind();
+ StringRef ClauseName(CKind == llvm::omp::Clause::OMPC_update_depend_objects
+ ? StringRef("UpdateDependObjects")
+ : llvm::omp::getOpenMPClauseName(CKind));
OS << "OMP" << ClauseName.substr(/*Start=*/0, /*N=*/1).upper()
<< ClauseName.drop_front() << "Clause";
}
diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 5dd2a728ee1cd..1a2a963243f6c 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -162,7 +162,7 @@ unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,
.Case(#Name, static_cast<unsigned>(OMPC_ORDER_MODIFIER_##Name))
#include "clang/Basic/OpenMPKinds.def"
.Default(OMPC_ORDER_unknown);
- case OMPC_update:
+ case OMPC_update_depend_objects:
return llvm::StringSwitch<OpenMPDependClauseKind>(Str)
#define OPENMP_DEPEND_KIND(Name) .Case(#Name, OMPC_DEPEND_##Name)
#include "clang/Basic/OpenMPKinds.def"
@@ -517,7 +517,7 @@ const char *clang::getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind,
#include "clang/Basic/OpenMPKinds.def"
}
llvm_unreachable("Invalid OpenMP 'order' clause type");
- case OMPC_update:
+ case OMPC_update_depend_objects:
switch (Type) {
case OMPC_DEPEND_unknown:
return "unknown";
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.cpp b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
index c338935950b32..9e71e82e5ee86 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.cpp
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.cpp
@@ -4620,9 +4620,9 @@ void CGOpenMPRuntime::emitDestroyClause(CodeGenFunction &CGF, LValue DepobjLVal,
Args);
}
-void CGOpenMPRuntime::emitUpdateClause(CodeGenFunction &CGF, LValue DepobjLVal,
- OpenMPDependClauseKind NewDepKind,
- SourceLocation Loc) {
+void CGOpenMPRuntime::emitUpdateDependObjectsClause(
+ CodeGenFunction &CGF, LValue DepobjLVal, OpenMPDependClauseKind NewDepKind,
+ SourceLocation Loc) {
ASTContext &C = CGM.getContext();
QualType FlagsTy;
getDependTypes(C, KmpDependInfoTy, FlagsTy);
diff --git a/clang/lib/CodeGen/CGOpenMPRuntime.h b/clang/lib/CodeGen/CGOpenMPRuntime.h
index a81d3830a8035..6b29fdb4fafb5 100644
--- a/clang/lib/CodeGen/CGOpenMPRuntime.h
+++ b/clang/lib/CodeGen/CGOpenMPRuntime.h
@@ -1702,7 +1702,7 @@ class CGOpenMPRuntime {
/// Updates the dependency kind in the specified depobj object.
/// \param DepobjLVal LValue for the main depobj object.
/// \param NewDepKind New dependency kind.
- void emitUpdateClause(CodeGenFunction &CGF, LValue DepobjLVal,
+ void emitUpdateDependObjectsClause(CodeGenFunction &CGF, LValue DepobjLVal,
OpenMPDependClauseKind NewDepKind, SourceLocation Loc);
/// Initializes user defined allocators specified in the uses_allocators
diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index 18524a7c32b7a..97c43b4c0b384 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -6002,8 +6002,8 @@ void CodeGenFunction::EmitOMPDepobjDirective(const OMPDepobjDirective &S) {
CGM.getOpenMPRuntime().emitDestroyClause(*this, DOLVal, DC->getBeginLoc());
return;
}
- if (const auto *UC = S.getSingleClause<OMPUpdateClause>()) {
- CGM.getOpenMPRuntime().emitUpdateClause(
+ if (const auto *UC = S.getSingleClause<OMPUpdateDependObjectsClause>()) {
+ CGM.getOpenMPRuntime().emitUpdateDependObjectsClause(
*this, DOLVal, UC->getDependencyKind(), UC->getBeginLoc());
return;
}
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 045b704f5480c..2c65651c49750 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -1597,6 +1597,8 @@ void Parser::ParseOpenMPClauses(OpenMPDirectiveKind DKind,
OpenMPClauseKind CKind = Tok.isAnnotation()
? OMPC_unknown
: getOpenMPClauseKind(PP.getSpelling(Tok));
+ if (DKind == OMPD_depobj && CKind == OMPC_update)
+ CKind = OMPC_update_depend_objects;
Actions.OpenMP().StartOpenMPClause(CKind);
OMPClause *Clause =
ParseOpenMPClause(DKind, CKind, !SeenClauses[unsigned(CKind)]);
@@ -2374,6 +2376,9 @@ StmtResult Parser::ParseOpenMPExecutableDirective(
OpenMPClauseKind CKind = Tok.isAnnotation()
? OMPC_unknown
: getOpenMPClauseKind(PP.getSpelling(Tok));
+ if (DKind == OMPD_depobj && CKind == OMPC_update)
+ CKind = OMPC_update_depend_objects;
+
if (HasImplicitClause) {
assert(CKind == OMPC_unknown && "Must be unknown implicit clause.");
if (DKind == OMPD_flush) {
@@ -3421,10 +3426,17 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
<< getOpenMPClauseName(CKind) << 0;
ErrorFound = true;
}
+ Clause = ParseOpenMPClause(CKind, WrongDirective);
+ break;
+ case OMPC_update_depend_objects:
+ if (!FirstClause) {
+ Diag(Tok, diag::err_omp_more_one_clause)
+ << getOpenMPDirectiveName(DKind, OMPVersion)
+ << getOpenMPClauseName(CKind) << 0;
+ ErrorFound = true;
+ }
- Clause = (DKind == OMPD_depobj)
- ? ParseOpenMPSimpleClause(CKind, WrongDirective)
- : ParseOpenMPClause(CKind, WrongDirective);
+ Clause = ParseOpenMPSimpleClause(CKind, WrongDirective);
break;
case OMPC_num_teams:
case OMPC_thread_limit:
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 5b59eacb3eea8..76bb0d38d428f 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -17674,9 +17674,10 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
Res = ActOnOpenMPFailClause(static_cast<OpenMPClauseKind>(Argument),
ArgumentLoc, StartLoc, LParenLoc, EndLoc);
break;
- case OMPC_update:
- Res = ActOnOpenMPUpdateClause(static_cast<OpenMPDependClauseKind>(Argument),
- ArgumentLoc, StartLoc, LParenLoc, EndLoc);
+ case OMPC_update_depend_objects:
+ Res = ActOnOpenMPUpdateDependObjectsClause(
+ static_cast<OpenMPDependClauseKind>(Argument), ArgumentLoc, StartLoc,
+ LParenLoc, EndLoc);
break;
case OMPC_bind:
Res = ActOnOpenMPBindClause(static_cast<OpenMPBindClauseKind>(Argument),
@@ -17728,6 +17729,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
case OMPC_write:
case OMPC_capture:
case OMPC_compare:
+ case OMPC_update:
case OMPC_seq_cst:
case OMPC_acq_rel:
case OMPC_acquire:
@@ -18137,11 +18139,9 @@ OMPClause *SemaOpenMP::ActOnOpenMPOrderClause(
Kind, KindLoc, StartLoc, LParenLoc, EndLoc, Modifier, MLoc);
}
-OMPClause *SemaOpenMP::ActOnOpenMPUpdateClause(OpenMPDependClauseKind Kind,
- SourceLocation KindKwLoc,
- SourceLocation StartLoc,
- SourceLocation LParenLoc,
- SourceLocation EndLoc) {
+OMPClause *SemaOpenMP::ActOnOpenMPUpdateDependObjectsClause(
+ OpenMPDependClauseKind Kind, SourceLocation KindKwLoc,
+ SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
if (Kind == OMPC_DEPEND_unknown || Kind == OMPC_DEPEND_source ||
Kind == OMPC_DEPEND_sink || Kind == OMPC_DEPEND_depobj) {
SmallVector<unsigned> Except = {
@@ -18152,11 +18152,11 @@ OMPClause *SemaOpenMP::ActOnOpenMPUpdateClause(OpenMPDependClauseKind Kind,
Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
<< getListOfPossibleValues(OMPC_depend, /*First=*/0,
/*Last=*/OMPC_DEPEND_unknown, Except)
- << getOpenMPClauseNameForDiag(OMPC_update);
+ << getOpenMPClauseNameForDiag(OMPC_update_depend_objects);
return nullptr;
}
- return OMPUpdateClause::Create(getASTContext(), StartLoc, LParenLoc,
- KindKwLoc, Kind, EndLoc);
+ return OMPUpdateDependObjectsClause::Create(
+ getASTContext(), StartLoc, LParenLoc, KindKwLoc, Kind, EndLoc);
}
OMPClause *SemaOpenMP::ActOnOpenMPSizesClause(ArrayRef<Expr *> SizeExprs,
@@ -18841,7 +18841,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPWriteClause(SourceLocation StartLoc,
OMPClause *SemaOpenMP::ActOnOpenMPUpdateClause(SourceLocation StartLoc,
SourceLocation EndLoc) {
- return OMPUpdateClause::Create(getASTContext(), StartLoc, EndLoc);
+ return new (getASTContext()) OMPUpdateClause(StartLoc, EndLoc);
}
OMPClause *SemaOpenMP::ActOnOpenMPCaptureClause(SourceLocation StartLoc,
diff --git a/clang/lib/Sema/TreeTransform.h b/clang/lib/Sema/TreeTransform.h
index 0f6f168d06812..6e4e8cbecca93 100644
--- a/clang/lib/Sema/TreeTransform.h
+++ b/clang/lib/Sema/TreeTransform.h
@@ -11100,6 +11100,13 @@ TreeTransform<Derived>::TransformOMPUpdateClause(OMPUpdateClause *C) {
return C;
}
+template <typename Derived>
+OMPClause *TreeTransform<Derived>::TransformOMPUpdateDependObjectsClause(
+ OMPUpdateDependObjectsClause *C) {
+ // No need to rebuild this clause, no template-dependent parameters.
+ return C;
+}
+
template <typename Derived>
OMPClause *
TreeTransform<Derived>::TransformOMPCaptureClause(OMPCaptureClause *C) {
diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index 8b7eaaac021eb..0cb44da23d855 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -11559,7 +11559,10 @@ OMPClause *OMPClauseReader::readClause() {
C = new (Context) OMPWriteClause();
break;
case llvm::omp::OMPC_update:
- C = OMPUpdateClause::CreateEmpty(Context, Record.readInt());
+ C = new (Context) OMPUpdateClause();
+ break;
+ case llvm::omp::OMPC_update_depend_objects:
+ C = OMPUpdateDependObjectsClause::CreateEmpty(Context);
break;
case llvm::omp::OMPC_capture:
C = new (Context) OMPCaptureClause();
@@ -12037,12 +12040,13 @@ void OMPClauseReader::VisitOMPReadClause(OMPReadClause *) {}
void OMPClauseReader::VisitOMPWriteClause(OMPWriteClause *) {}
-void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *C) {
- if (C->isExtended()) {
- C->setLParenLoc(Record.readSourceLocation());
- C->setArgumentLoc(Record.readSourceLocation());
- C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
- }
+void OMPClauseReader::VisitOMPUpdateClause(OMPUpdateClause *) {}
+
+void OMPClauseReader::VisitOMPUpdateDependObjectsClause(
+ OMPUpdateDependObjectsClause *C) {
+ C->setLParenLoc(Record.readSourceLocation());
+ C->setArgumentLoc(Record.readSourceLocation());
+ C->setDependencyKind(Record.readEnum<OpenMPDependClauseKind>());
}
void OMPClauseReader::VisitOMPCaptureClause(OMPCaptureClause *) {}
diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp
index fc53aee000ef2..f34b2ff182bc8 100644
--- a/clang/lib/Serialization/ASTWriter.cpp
+++ b/clang/lib/Serialization/ASTWriter.cpp
@@ -8207,13 +8207,13 @@ void OMPClauseWriter::VisitOMPReadClause(OMPReadClause *) {}
void OMPClauseWriter::VisitOMPWriteClause(OMPWriteClause *) {}
-void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *C) {
- Record.push_back(C->isExtended() ? 1 : 0);
- if (C->isExtended()) {
- Record.AddSourceLocation(C->getLParenLoc());
- Record.AddSourceLocation(C->getArgumentLoc());
- Record.writeEnum(C->getDependencyKind());
- }
+void OMPClauseWriter::VisitOMPUpdateClause(OMPUpdateClause *) {}
+
+void OMPClauseWriter::VisitOMPUpdateDependObjectsClause(
+ OMPUpdateDependObjectsClause *C) {
+ Record.AddSourceLocation(C->getLParenLoc());
+ Record.AddSourceLocation(C->getArgumentLoc());
+ Record.writeEnum(C->getDependencyKind());
}
void OMPClauseWriter::VisitOMPCaptureClause(OMPCaptureClause *) {}
diff --git a/clang/tools/libclang/CIndex.cpp b/clang/tools/libclang/CIndex.cpp
index 7c9da867909f5..7eeeba9c7948d 100644
--- a/clang/tools/libclang/CIndex.cpp
+++ b/clang/tools/libclang/CIndex.cpp
@@ -2421,6 +2421,9 @@ void OMPClauseEnqueue::VisitOMPWriteClause(const OMPWriteClause *) {}
void OMPClauseEnqueue::VisitOMPUpdateClause(const OMPUpdateClause *) {}
+void OMPClauseEnqueue::VisitOMPUpdateDependObjectsClause(
+ const OMPUpdateDependObjectsClause *) {}
+
void OMPClauseEnqueue::VisitOMPCaptureClause(const OMPCaptureClause *) {}
void OMPClauseEnqueue::VisitOMPCompareClause(const OMPCompareClause *) {}
diff --git a/flang/include/flang/Lower/OpenMP/Clauses.h b/flang/include/flang/Lower/OpenMP/Clauses.h
index f334374280c73..f2ce74301a238 100644
--- a/flang/include/flang/Lower/OpenMP/Clauses.h
+++ b/flang/include/flang/Lower/OpenMP/Clauses.h
@@ -322,6 +322,8 @@ using Uniform = tomp::clause::UniformT<TypeTy, IdTy, ExprTy>;
using Unknown = tomp::clause::UnknownT<TypeTy, IdTy, ExprTy>;
using Untied = tomp::clause::UntiedT<TypeTy, IdTy, ExprTy>;
using Update = tomp::clause::UpdateT<TypeTy, IdTy, ExprTy>;
+using UpdateDependObjects =
+ tomp::clause::UpdateDependObjectsT<TypeTy, IdTy, ExprTy>;
using Use = tomp::clause::UseT<TypeTy, IdTy, ExprTy>;
using UseDeviceAddr = tomp::clause::UseDeviceAddrT<TypeTy, IdTy, ExprTy>;
using UseDevicePtr = tomp::clause::UseDevicePtrT<TypeTy, IdTy, ExprTy>;
diff --git a/flang/include/flang/Parser/dump-parse-tree.h b/flang/include/flang/Parser/dump-parse-tree.h
index 6750127945b51..729bcbc9b7cab 100644
--- a/flang/include/flang/Parser/dump-parse-tree.h
+++ b/flang/include/flang/Parser/dump-parse-tree.h
@@ -776,7 +776,7 @@ class ParseTreeDumper {
NODE(parser, OmpTypeNameList)
NODE(parser, OmpUnifiedAddressClause)
NODE(parser, OmpUnifiedSharedMemoryClause)
- NODE(parser, OmpUpdateClause)
+ NODE(parser, OmpUpdateDependObjectsClause)
NODE(parser, OmpUseClause)
NODE(parser, OmpUtilityDirective)
NODE(parser, OmpVariableCategory)
diff --git a/flang/include/flang/Parser/parse-tree.h b/flang/include/flang/Parser/parse-tree.h
index 0862800601c29..f9b7ec51c87e0 100644
--- a/flang/include/flang/Parser/parse-tree.h
+++ b/flang/include/flang/Parser/parse-tree.h
@@ -5113,8 +5113,8 @@ struct OmpUnifiedSharedMemoryClause {
// UPDATE(dependence-type) // since 5.0, until 5.1
// update-clause ->
// UPDATE(task-dependence-type) // since 5.2
-struct OmpUpdateClause {
- UNION_CLASS_BOILERPLATE(OmpUpdateClause);
+struct OmpUpdateDependObjectsClause {
+ UNION_CLASS_BOILERPLATE(OmpUpdateDependObjectsClause);
// The dependence type is an argument here, not a modifier.
std::variant<OmpDependenceType, OmpTaskDependenceType> u;
};
diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index f8cbbd17a55b9..9db79110df9e5 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -294,6 +294,7 @@ MAKE_EMPTY_CLASS(Simd, Simd);
MAKE_EMPTY_CLASS(Threads, Threads);
MAKE_EMPTY_CLASS(Unknown, Unknown);
MAKE_EMPTY_CLASS(Untied, Untied);
+MAKE_EMPTY_CLASS(Update, Update);
MAKE_EMPTY_CLASS(Weak, Weak);
MAKE_EMPTY_CLASS(Write, Write);
@@ -1755,16 +1756,14 @@ Uniform make(const parser::OmpClause::Uniform &inp,
// Unknown: empty
// Untied: empty
-Update make(const parser::OmpClause::Update &inp,
- semantics::SemanticsContext &semaCtx) {
- // inp.v -> parser::OmpUpdateClause
- if (inp.v) {
- return common::visit(
- [](auto &&s) { return Update{/*DependenceType=*/makeDepType(s)}; },
- inp.v->u);
- } else {
- return Update{/*DependenceType=*/std::nullopt};
- }
+UpdateDependObjects make(const parser::OmpClause::UpdateDependObjects &inp,
+ semantics::SemanticsContext &semaCtx) {
+ // inp.v -> parser::OmpUpdateDependObjectsClause
+ return common::visit(
+ [](auto &&s) {
+ return UpdateDependObjects{/*DependenceType=*/makeDepType(s)};
+ },
+ inp.v.u);
}
Use make(const parser::OmpClause::Use &inp,
diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index 11d0aa9e1359b..6cf57040cecd2 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -1416,8 +1416,10 @@ TYPE_PARSER(construct<OmpAlignedClause>(Parser<OmpObjectList>{},
maybe(":" >> nonemptyList(Parser<OmpAlignedClause::Modifier>{}))))
TYPE_PARSER( //
- construct<OmpUpdateClause>(parenthesized(Parser<OmpDependenceType>{})) ||
- construct<OmpUpdateClause>(parenthesized(Parser<OmpTaskDependenceType>{})))
+ construct<OmpUpdateDependObjectsClause>(
+ parenthesized(Parser<OmpDependenceType>{})) ||
+ construct<OmpUpdateDependObjectsClause>(
+ parenthesized(Parser<OmpTaskDependenceType>{})))
TYPE_PARSER(construct<OmpOrderClause>(
maybe(nonemptyList(Parser<OmpOrderClause::Modifier>{}) / ":"),
@@ -1708,8 +1710,9 @@ TYPE_PARSER( //
"UNIFORM" >> construct<OmpClause>(construct<OmpClause::Uniform>(
parenthesized(nonemptyList(name)))) ||
"UNTIED" >> construct<OmpClause>(construct<OmpClause::Untied>()) ||
- "UPDATE" >> construct<OmpClause>(construct<OmpClause::Update>(
- maybe(Parser<OmpUpdateClause>{}))) ||
+ "UPDATE" >> (construct<OmpClause>(construct<OmpClause::UpdateDependObjects>(
+ Parser<OmpUpdateDependObjectsClause>{})) ||
+ construct<OmpClause>(construct<OmpClause::Update>())) ||
"WEAK" >> construct<OmpClause>(construct<OmpClause::Weak>()) ||
"WHEN" >> construct<OmpClause>(construct<OmpClause::When>(
parenthesized(Parser<OmpWhenClause>{}))) ||
diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index f77382c9045fc..dcb01eb967c72 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -5286,17 +5286,13 @@ void OmpStructureChecker::CheckStructureComponent(
}
}
-void OmpStructureChecker::Enter(const parser::OmpClause::Update &x) {
+void OmpStructureChecker::Enter(
+ const parser::OmpClause::UpdateDependObjects &x) {
llvm::omp::Directive dir{GetContext().directive};
unsigned version{context_.langOptions().OpenMPVersion};
- const parser::OmpDependenceType *depType{nullptr};
- const parser::OmpTaskDependenceType *taskType{nullptr};
- if (auto &maybeUpdate{x.v}) {
- depType = std::get_if<parser::OmpDependenceType>(&maybeUpdate->u);
- taskType = std::get_if<parser::OmpTaskDependenceType>(&maybeUpdate->u);
- }
-
+ auto *depType = std::get_if<parser::OmpDependenceType>(&x.v.u);
+ auto *taskType = std::get_if<parser::OmpTaskDependenceType>(&x.v.u);
if (!depType && !taskType) {
assert(dir == llvm::omp::Directive::OMPD_atomic &&
"Unexpected alternative in update clause");
diff --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index f8aa47043a614..4acec2ad05ba1 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -238,7 +238,7 @@ class OmpStructureChecker : public OmpStructureCheckerBase {
void Enter(const parser::OmpClause::To &x);
void Enter(const parser::OmpClause::UnifiedAddress &x);
void Enter(const parser::OmpClause::UnifiedSharedMemory &x);
- void Enter(const parser::OmpClause::Update &x);
+ void Enter(const parser::OmpClause::UpdateDependObjects &x);
void Enter(const parser::OmpClause::UseDeviceAddr &x);
void Enter(const parser::OmpClause::UseDevicePtr &x);
void Enter(const parser::OmpClause::When &x);
diff --git a/flang/lib/Semantics/openmp-modifiers.cpp b/flang/lib/Semantics/openmp-modifiers.cpp
index fe8e087cd5a94..f3ee8917356fa 100644
--- a/flang/lib/Semantics/openmp-modifiers.cpp
+++ b/flang/lib/Semantics/openmp-modifiers.cpp
@@ -281,7 +281,7 @@ const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpDependenceType>() {
/*clauses=*/
{
{45, {Clause::OMPC_depend}},
- {51, {Clause::OMPC_depend, Clause::OMPC_update}},
+ {51, {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}},
{52, {Clause::OMPC_doacross}},
},
};
@@ -731,7 +731,7 @@ const OmpModifierDescriptor &OmpGetDescriptor<parser::OmpTaskDependenceType>() {
/*clauses=*/
{
{45, {Clause::OMPC_depend}},
- {51, {Clause::OMPC_depend, Clause::OMPC_update}},
+ {51, {Clause::OMPC_depend, Clause::OMPC_update_depend_objects}},
},
};
return desc;
diff --git a/flang/test/Parser/OpenMP/atomic-compare.f90 b/flang/test/Parser/OpenMP/atomic-compare.f90
index 7e80b9c8505e5..6707a66e751a0 100644
--- a/flang/test/Parser/OpenMP/atomic-compare.f90
+++ b/flang/test/Parser/OpenMP/atomic-compare.f90
@@ -18,7 +18,7 @@ subroutine f00(a, b)
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = atomic
-!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update ->
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update
!PARSE-TREE: | | OmpClause -> Compare
!PARSE-TREE: | | Flags = {}
!PARSE-TREE: | Block
@@ -56,7 +56,7 @@ subroutine f01(a, b)
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = atomic
-!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update ->
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update
!PARSE-TREE: | | OmpClause -> Compare
!PARSE-TREE: | | Flags = {}
!PARSE-TREE: | Block
@@ -110,7 +110,7 @@ subroutine f02(a, b)
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = atomic
-!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update ->
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update
!PARSE-TREE: | | OmpClause -> Compare
!PARSE-TREE: | | Flags = {}
!PARSE-TREE: | Block
@@ -147,7 +147,7 @@ subroutine g00(a, b)
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = atomic
-!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update ->
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update
!PARSE-TREE: | | OmpClause -> Capture
!PARSE-TREE: | | OmpClause -> Compare
!PARSE-TREE: | | Flags = {}
@@ -199,7 +199,7 @@ subroutine g01(a, b)
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = atomic
-!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update ->
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update
!PARSE-TREE: | | OmpClause -> Capture
!PARSE-TREE: | | OmpClause -> Compare
!PARSE-TREE: | | Flags = {}
@@ -256,7 +256,7 @@ subroutine g02(a, b)
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPAtomicConstruct
!PARSE-TREE: | OmpBeginDirective
!PARSE-TREE: | | OmpDirectiveName -> llvm::omp::Directive = atomic
-!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update ->
+!PARSE-TREE: | | OmpClauseList -> OmpClause -> Update
!PARSE-TREE: | | OmpClause -> Capture
!PARSE-TREE: | | OmpClause -> Compare
!PARSE-TREE: | | Flags = {}
diff --git a/flang/test/Parser/OpenMP/depobj-construct.f90 b/flang/test/Parser/OpenMP/depobj-construct.f90
index 9a49976cfd4b0..37fa0ce8fa5e4 100644
--- a/flang/test/Parser/OpenMP/depobj-construct.f90
+++ b/flang/test/Parser/OpenMP/depobj-construct.f90
@@ -31,7 +31,7 @@ subroutine f01
!PARSE-TREE: ExecutionPartConstruct -> ExecutableConstruct -> OpenMPConstruct -> OpenMPStandaloneConstruct -> OpenMPDepobjConstruct -> OmpDirectiveSpecification
!PARSE-TREE: | OmpDirectiveName -> llvm::omp::Directive = depobj
!PARSE-TREE: | OmpArgumentList -> OmpArgument -> OmpObject -> Designator -> DataRef -> Name = 'x'
-!PARSE-TREE: | OmpClauseList -> OmpClause -> Update -> OmpUpdateClause -> OmpTaskDependenceType -> OmpDependenceKind = Out
+!PARSE-TREE: | OmpClauseList -> OmpClause -> UpdateDependObjects -> OmpUpdateDependObjectsClause -> OmpTaskDependenceType -> OmpDependenceKind = Out
subroutine f02
integer :: x
diff --git a/llvm/include/llvm/Frontend/OpenMP/ClauseT.h b/llvm/include/llvm/Frontend/OpenMP/ClauseT.h
index b2f809e9b51ee..0c5b0d5566258 100644
--- a/llvm/include/llvm/Frontend/OpenMP/ClauseT.h
+++ b/llvm/include/llvm/Frontend/OpenMP/ClauseT.h
@@ -1322,9 +1322,14 @@ struct UntiedT {
// V5.2: [15.9.3] `update` clause
template <typename T, typename I, typename E> //
struct UpdateT {
+ using EmptyTrait = std::true_type;
+};
+
+template <typename T, typename I, typename E> //
+struct UpdateDependObjectsT {
using DependenceType = tomp::type::DependenceType;
using WrapperTrait = std::true_type;
- OPT(DependenceType) v;
+ DependenceType v;
};
// V5.2: [14.1.3] `use` clause
@@ -1399,7 +1404,8 @@ using EmptyClausesT = std::variant<
NoOpenmpT<T, I, E>, NoParallelismT<T, I, E>, NotinbranchT<T, I, E>,
NowaitT<T, I, E>, ReadT<T, I, E>, RelaxedT<T, I, E>, ReleaseT<T, I, E>,
SeqCstT<T, I, E>, SimdT<T, I, E>, ThreadsT<T, I, E>, UnknownT<T, I, E>,
- UntiedT<T, I, E>, UseT<T, I, E>, WeakT<T, I, E>, WriteT<T, I, E>>;
+ UntiedT<T, I, E>, UpdateT<T, I, E>, UseT<T, I, E>, WeakT<T, I, E>,
+ WriteT<T, I, E>>;
template <typename T, typename I, typename E>
using IncompleteClausesT =
@@ -1444,8 +1450,9 @@ using WrapperClausesT = std::variant<
SelfMapsT<T, I, E>, SeverityT<T, I, E>, SharedT<T, I, E>, SimdlenT<T, I, E>,
SizesT<T, I, E>, PermutationT<T, I, E>, ThreadLimitT<T, I, E>,
ThreadsetT<T, I, E>, UnifiedAddressT<T, I, E>,
- UnifiedSharedMemoryT<T, I, E>, UniformT<T, I, E>, UpdateT<T, I, E>,
- UseDeviceAddrT<T, I, E>, UseDevicePtrT<T, I, E>, UsesAllocatorsT<T, I, E>>;
+ UnifiedSharedMemoryT<T, I, E>, UniformT<T, I, E>,
+ UpdateDependObjectsT<T, I, E>, UseDeviceAddrT<T, I, E>,
+ UseDevicePtrT<T, I, E>, UsesAllocatorsT<T, I, E>>;
template <typename T, typename I, typename E>
using UnionOfAllClausesT = typename type::Union< //
diff --git a/llvm/include/llvm/Frontend/OpenMP/OMP.td b/llvm/include/llvm/Frontend/OpenMP/OMP.td
index dc2af1e62cfa4..a119dff67c30e 100644
--- a/llvm/include/llvm/Frontend/OpenMP/OMP.td
+++ b/llvm/include/llvm/Frontend/OpenMP/OMP.td
@@ -618,9 +618,14 @@ def OMPC_Untied : Clause<[Spelling<"untied">]> {
let clangClass = "OMPUntiedClause";
}
def OMPC_Update : Clause<[Spelling<"update">]> {
+ // This is the "update" clause for "atomic" construct.
+ // For "depobj" use OMPC_UpdateDependObjects.
let clangClass = "OMPUpdateClause";
- let flangClass = "OmpUpdateClause";
- let isValueOptional = true;
+}
+def OMPC_UpdateDependObjects : Clause<[Spelling<"update">]> {
+ let name = "update_depend_objects";
+ let clangClass = "OMPUpdateDependObjectsClause";
+ let flangClass = "OmpUpdateDependObjectsClause";
}
def OMPC_Use : Clause<[Spelling<"use">]> {
let clangClass = "OMPUseClause";
@@ -873,7 +878,7 @@ def OMP_Depobj : Directive<[Spelling<"depobj">]> {
VersionedClause<OMPC_Init, 60>,
];
let allowedOnceClauses = [
- VersionedClause<OMPC_Update, 50>,
+ VersionedClause<OMPC_UpdateDependObjects, 50>,
];
let association = AS_None;
let category = CA_Executable;
More information about the cfe-commits
mailing list