[flang-commits] [flang] [flang][OpenMP] Accept trailing colon in DOACROSS(SOURCE:) (PR #218982)

Krzysztof Parzyszek via flang-commits flang-commits at lists.llvm.org
Wed Aug 26 09:48:33 PDT 2026


https://github.com/kparzysz created https://github.com/llvm/llvm-project/pull/218982

None

>From 2b6c165b22d51704e288419a9012f30a3df108e3 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Wed, 26 Aug 2026 09:25:27 -0500
Subject: [PATCH] [flang][OpenMP] Accept trailing colon in DOACROSS(SOURCE:)

---
 flang/lib/Parser/openmp-parsers.cpp      | 25 +++++++++++++++++++-----
 flang/test/Semantics/OpenMP/doacross.f90 |  2 ++
 2 files changed, 22 insertions(+), 5 deletions(-)

diff --git a/flang/lib/Parser/openmp-parsers.cpp b/flang/lib/Parser/openmp-parsers.cpp
index d1b4fc2c0d437..340872f117282 100644
--- a/flang/lib/Parser/openmp-parsers.cpp
+++ b/flang/lib/Parser/openmp-parsers.cpp
@@ -1440,11 +1440,26 @@ TYPE_PARSER(construct<OmpIteration>(name, maybe(Parser<OmpIterationOffset>{})))
 
 TYPE_PARSER(construct<OmpIterationVector>(nonemptyList(Parser<OmpIteration>{})))
 
-TYPE_PARSER(construct<OmpDoacross>(
-    // Don't parse the modifier list as "maybe", or otherwise the parser will
-    // always succeed (never allowing TaskDep in OmpDependClause).
-    nonemptyList(Parser<OmpDoacross::Modifier>{}),
-    maybe(":"_tok >> Parser<OmpIterationVector>{})))
+struct OmpDoacrossParser {
+  using resultType = OmpDoacross;
+
+  std::optional<resultType> Parse(ParseState &state) const {
+    auto modifier{nonemptyList(Parser<OmpDoacross::Modifier>{})};
+    if (auto &&modList{modifier.Parse(state)}) {
+      if (attempt(":"_tok).Parse(state)) {
+        auto vector{Parser<OmpIterationVector>{}};
+        if (auto &&iterVec{attempt(vector).Parse(state)}) {
+          return OmpDoacross{std::move(*modList), std::move(*iterVec)};
+        }
+      }
+      return OmpDoacross{
+          std::move(*modList), std::optional<OmpIterationVector>{}};
+    }
+    return std::nullopt;
+  }
+};
+
+TYPE_PARSER(construct<OmpDoacross>(OmpDoacrossParser{}))
 
 TYPE_CONTEXT_PARSER("Omp Depend clause"_en_US,
     construct<OmpDependClause>(
diff --git a/flang/test/Semantics/OpenMP/doacross.f90 b/flang/test/Semantics/OpenMP/doacross.f90
index e62c176345116..6508e1b8dee1b 100644
--- a/flang/test/Semantics/OpenMP/doacross.f90
+++ b/flang/test/Semantics/OpenMP/doacross.f90
@@ -14,6 +14,8 @@ subroutine f00(x)
 !ERROR: The number of variables in the SINK iteration vector does not match the parameter specified in ORDERED clause
 !ERROR: 'dependence-type' modifier cannot occur multiple times
       !$omp ordered doacross(sink, sink: i)
+!Trailing colon is ok.
+      !$omp ordered doacross(source:)
       x(i, j) = 0
     enddo
   enddo



More information about the flang-commits mailing list