[flang-commits] [flang] c7a4785 - Revert "[flang][OpenMP] Analyze objects in OmpObjectList on clauses (#155424)"

Krzysztof Parzyszek via flang-commits flang-commits at lists.llvm.org
Wed Aug 27 08:12:13 PDT 2025


Author: Krzysztof Parzyszek
Date: 2025-08-27T10:11:44-05:00
New Revision: c7a4785d6098fa080f2018691ac94f77b4c8b1ce

URL: https://github.com/llvm/llvm-project/commit/c7a4785d6098fa080f2018691ac94f77b4c8b1ce
DIFF: https://github.com/llvm/llvm-project/commit/c7a4785d6098fa080f2018691ac94f77b4c8b1ce.diff

LOG: Revert "[flang][OpenMP] Analyze objects in OmpObjectList on clauses (#155424)"

This reverts commit 63085310c9290336ff190ed911f59fc172e32b6c.

This breaks gfortran test suite:

```
error: Semantic errors in gfortran/regression/gomp/pr80918.f90
gfortran/regression/gomp/pr80918.f90:6:27: error: Whole assumed-size array 'a' may not appear here without subscripts
    !$omp task depend(inout:a)
                            ^
gfortran/regression/gomp/pr80918.f90:5:14: Declaration of 'a'
    integer :: a(*)
               ^
```

The error appears to be legitimate.

Added: 
    

Modified: 
    flang/lib/Semantics/check-omp-structure.cpp
    flang/lib/Semantics/check-omp-structure.h
    flang/test/Lower/OpenMP/Todo/omp-do-simd-linear.f90
    flang/test/Semantics/OpenMP/cray-pointer-usage.f90
    flang/test/Semantics/OpenMP/declare-mapper02.f90
    flang/test/Semantics/OpenMP/depend01.f90

Removed: 
    flang/test/Semantics/OpenMP/depend07.f90


################################################################################
diff  --git a/flang/lib/Semantics/check-omp-structure.cpp b/flang/lib/Semantics/check-omp-structure.cpp
index c73bf322534b6..7bbd99aab5a6b 100644
--- a/flang/lib/Semantics/check-omp-structure.cpp
+++ b/flang/lib/Semantics/check-omp-structure.cpp
@@ -268,43 +268,6 @@ bool OmpStructureChecker::CheckAllowedClause(llvmOmpClause clause) {
   return CheckAllowed(clause);
 }
 
-void OmpStructureChecker::AnalyzeObject(
-    const parser::OmpObject &object, bool allowAssumedSizeArrays) {
-  if (std::holds_alternative<parser::Name>(object.u)) {
-    // Do not analyze common block names. The analyzer will flag an error
-    // on those.
-    return;
-  }
-  if (auto *symbol{GetObjectSymbol(object)}) {
-    // Eliminate certain kinds of symbols before running the analyzer to
-    // avoid confusing error messages. The analyzer assumes that the context
-    // of the object use is an expression, and some diagnostics are tailored
-    // to that.
-    if (symbol->has<DerivedTypeDetails>() || symbol->has<MiscDetails>()) {
-      // Type names, construct names, etc.
-      return;
-    }
-    if (auto *typeSpec{symbol->GetType()}) {
-      if (typeSpec->category() == DeclTypeSpec::Category::Character) {
-        // Don't pass character objects to the analyzer, it can emit somewhat
-        // cryptic errors (e.g. "'obj' is not an array"). Substrings are
-        // checked elsewhere in OmpStructureChecker.
-        return;
-      }
-    }
-  }
-  evaluate::ExpressionAnalyzer ea{context_};
-  auto restore{ea.AllowWholeAssumedSizeArray(allowAssumedSizeArrays)};
-  common::visit([&](auto &&s) { ea.Analyze(s); }, object.u);
-}
-
-void OmpStructureChecker::AnalyzeObjects(
-    const parser::OmpObjectList &objects, bool allowAssumedSizeArrays) {
-  for (const parser::OmpObject &object : objects.v) {
-    AnalyzeObject(object, allowAssumedSizeArrays);
-  }
-}
-
 bool OmpStructureChecker::IsCloselyNestedRegion(const OmpDirectiveSet &set) {
   // Definition of close nesting:
   //
@@ -2734,9 +2697,8 @@ void OmpStructureChecker::Leave(const parser::OmpClauseList &) {
 void OmpStructureChecker::Enter(const parser::OmpClause &x) {
   SetContextClause(x);
 
-  llvm::omp::Clause id{x.Id()};
   // The visitors for these clauses do their own checks.
-  switch (id) {
+  switch (x.Id()) {
   case llvm::omp::Clause::OMPC_copyprivate:
   case llvm::omp::Clause::OMPC_enter:
   case llvm::omp::Clause::OMPC_lastprivate:
@@ -2750,7 +2712,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause &x) {
   // Named constants are OK to be used within 'shared' and 'firstprivate'
   // clauses.  The check for this happens a few lines below.
   bool SharedOrFirstprivate = false;
-  switch (id) {
+  switch (x.Id()) {
   case llvm::omp::Clause::OMPC_shared:
   case llvm::omp::Clause::OMPC_firstprivate:
     SharedOrFirstprivate = true;
@@ -2759,20 +2721,7 @@ void OmpStructureChecker::Enter(const parser::OmpClause &x) {
     break;
   }
 
-  auto allowsAssumedSizeArrays{[](llvm::omp::Clause c) {
-    // These clauses allow assumed-size-arrays as list items.
-    switch (c) {
-    case llvm::omp::Clause::OMPC_map:
-    case llvm::omp::Clause::OMPC_shared:
-    case llvm::omp::Clause::OMPC_use_device_addr:
-      return true;
-    default:
-      return false;
-    }
-  }};
-
   if (const parser::OmpObjectList *objList{GetOmpObjectList(x)}) {
-    AnalyzeObjects(*objList, allowsAssumedSizeArrays(id));
     SymbolSourceMap symbols;
     GetSymbolsInObjectList(*objList, symbols);
     for (const auto &[symbol, source] : symbols) {

diff  --git a/flang/lib/Semantics/check-omp-structure.h b/flang/lib/Semantics/check-omp-structure.h
index 177a5f4bd3a27..8ac905242162f 100644
--- a/flang/lib/Semantics/check-omp-structure.h
+++ b/flang/lib/Semantics/check-omp-structure.h
@@ -167,10 +167,6 @@ class OmpStructureChecker
   void CheckVariableListItem(const SymbolSourceMap &symbols);
   void CheckDirectiveSpelling(
       parser::CharBlock spelling, llvm::omp::Directive id);
-  void AnalyzeObject(
-      const parser::OmpObject &object, bool allowAssumedSizeArrays = false);
-  void AnalyzeObjects(const parser::OmpObjectList &objects,
-      bool allowAssumedSizeArrays = false);
   void CheckMultipleOccurrence(semantics::UnorderedSymbolSet &listVars,
       const std::list<parser::Name> &nameList, const parser::CharBlock &item,
       const std::string &clauseName);

diff  --git a/flang/test/Lower/OpenMP/Todo/omp-do-simd-linear.f90 b/flang/test/Lower/OpenMP/Todo/omp-do-simd-linear.f90
index db8f5c293b40e..4caf12a0169c4 100644
--- a/flang/test/Lower/OpenMP/Todo/omp-do-simd-linear.f90
+++ b/flang/test/Lower/OpenMP/Todo/omp-do-simd-linear.f90
@@ -3,7 +3,7 @@
 ! RUN: %not_todo_cmd bbc -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
 ! RUN: %not_todo_cmd %flang_fc1 -emit-fir -fopenmp -o - %s 2>&1 | FileCheck %s
 subroutine testDoSimdLinear(int_array)
-        integer :: int_array(:)
+        integer :: int_array(*)
 !CHECK: not yet implemented: Unhandled clause LINEAR in SIMD construct
 !$omp do simd linear(int_array)
         do index_ = 1, 10

diff  --git a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90 b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
index bc45c2e38d057..6c74462dd2789 100644
--- a/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
+++ b/flang/test/Semantics/OpenMP/cray-pointer-usage.f90
@@ -4,9 +4,6 @@ subroutine test_cray_pointer_usage
   integer :: i
   real(8) :: var(*), pointee(2)
   pointer(ivar, var)
-  real(8) :: var2(10)
-  pointer(ivar2, var2)
-  ! ERROR: Whole assumed-size array 'var' may not appear here without subscripts
   ! ERROR: Cray Pointee 'var' may not appear in LINEAR clause
   ! ERROR: The list item 'var' specified without the REF 'linear-modifier' must be of INTEGER type
   ! ERROR: The list item `var` must be a dummy argument
@@ -20,9 +17,9 @@ subroutine test_cray_pointer_usage
     print *, var(1)
   !$omp end parallel
 
-  ! ERROR: Cray Pointee 'var2' may not appear in PRIVATE clause, use Cray Pointer 'ivar2' instead
-  !$omp parallel num_threads(2) default(none) private(var2)
-    print *, var2(1)
+  ! ERROR: Cray Pointee 'var' may not appear in PRIVATE clause, use Cray Pointer 'ivar' instead
+  !$omp parallel num_threads(2) default(none) private(var)
+    print *, var(1)
   !$omp end parallel
 
   ! ERROR: Cray Pointee 'var' may not appear in SHARED clause, use Cray Pointer 'ivar' instead

diff  --git a/flang/test/Semantics/OpenMP/declare-mapper02.f90 b/flang/test/Semantics/OpenMP/declare-mapper02.f90
index 2ad87c914bc7d..a62a7f8d0a392 100644
--- a/flang/test/Semantics/OpenMP/declare-mapper02.f90
+++ b/flang/test/Semantics/OpenMP/declare-mapper02.f90
@@ -6,6 +6,5 @@
 end type t1
 
 !ERROR: ABSTRACT derived type may not be used here
-!ERROR: Reference to object with abstract derived type 't1' must be polymorphic
 !$omp declare mapper(mm : t1::x) map(x, x%y)
 end

diff  --git a/flang/test/Semantics/OpenMP/depend01.f90 b/flang/test/Semantics/OpenMP/depend01.f90
index 6c6cc16bcc5f9..19fcfbf64bebd 100644
--- a/flang/test/Semantics/OpenMP/depend01.f90
+++ b/flang/test/Semantics/OpenMP/depend01.f90
@@ -20,7 +20,7 @@ program omp_depend
   !ERROR: 'a' in DEPEND clause must have a positive stride
   !ERROR: 'b' in DEPEND clause must have a positive stride
   !ERROR: 'b' in DEPEND clause is a zero size array section
-  !$omp task shared(x) depend(in: a(10:5:-1)) depend(in: b(5:10:-1, 2))
+  !$omp task shared(x) depend(in: a(10:5:-1)) depend(in: b(5:10:-1))
   print *, a(5:10), b
   !$omp end task
 

diff  --git a/flang/test/Semantics/OpenMP/depend07.f90 b/flang/test/Semantics/OpenMP/depend07.f90
deleted file mode 100644
index 53c98b079f34b..0000000000000
--- a/flang/test/Semantics/OpenMP/depend07.f90
+++ /dev/null
@@ -1,11 +0,0 @@
-!RUN: %python %S/../test_errors.py %s %flang -fopenmp -fopenmp-version=45
-
-subroutine foo(x)
-  integer :: x(3, *)
-  !$omp task depend(in:x(:,5))
-  !$omp end task
-  !ERROR: Assumed-size array 'x' must have explicit final subscript upper bound value
-  !$omp task depend(in:x(5,:))
-  !$omp end task
-end
-


        


More information about the flang-commits mailing list