From 5b88e7d23c3cc3f33be26d46ae64309522224694 Mon Sep 17 00:00:00 2001 From: ergawy Date: Tue, 25 Feb 2025 23:48:12 -0600 Subject: [PATCH] [flang] Extend `omp loop` semantic checks for `reduction` Extend semantic checks for `omp loop` directive to report errors when a `reduction` clause is specified on a standalone `loop` directive with `teams` binding. This is similar to how clang behaves. --- flang/lib/Semantics/check-omp-structure.cpp | 12 ++++++++++++ flang/test/Semantics/OpenMP/loop-bind.f90 | 5 +++++ 2 files changed, 17 insertions(+) diff --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp index c95cf0d5921cf..906aed2dc0922 100644 --- a/flang/lib/Semantics/check-omp-structure.cpp +++ b/flang/lib/Semantics/check-omp-structure.cpp @@ -3134,6 +3134,18 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Reduction &x) { if (llvm::omp::nestedReduceWorkshareAllowedSet.test(GetContext().directive)) { CheckSharedBindingInOuterContext(objects); } + + if (GetContext().directive == llvm::omp::Directive::OMPD_loop) { + for (auto clause : GetContext().clauseInfo) { + if (const auto *bindClause{ + std::get_if(&clause.second->u)}) { + if (bindClause->v.v == parser::OmpBindClause::Binding::Teams) { + context_.Say(GetContext().clauseSource, + "'REDUCTION' clause not allowed with '!$OMP LOOP BIND(TEAMS)'."_err_en_US); + } + } + } + } } void OmpStructureChecker::Enter(const parser::OmpClause::InReduction &x) { diff --git a/flang/test/Semantics/OpenMP/loop-bind.f90 b/flang/test/Semantics/OpenMP/loop-bind.f90 index f3aa9d19fe989..337a4521339fb 100644 --- a/flang/test/Semantics/OpenMP/loop-bind.f90 +++ b/flang/test/Semantics/OpenMP/loop-bind.f90 @@ -30,4 +30,9 @@ program main end do !$omp end teams loop + !ERROR: 'REDUCTION' clause not allowed with '!$OMP LOOP BIND(TEAMS)'. + !$omp loop bind(teams) reduction(+: x) + do i = 0, 10 + x = x + i + end do end program main