[flang-commits] [flang] 28cc960 - [flang] Fix bogus errors about CONTIGUOUS attribute

Peter Klausler via flang-commits flang-commits at lists.llvm.org
Tue May 16 14:22:19 PDT 2023


Author: Peter Klausler
Date: 2023-05-16T14:01:24-07:00
New Revision: 28cc9606c0b4a70f26b4a3eea32cf88c330b2d82

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

LOG: [flang] Fix bogus errors about CONTIGUOUS attribute

Incorrect error messages were issuing for symbol table entries
with the CONTIGUOUS attribute that didn't deserve them, like
host association symbols.  Put the CONTIGUOUS check into
CheckObjectEntity().

Differential Revision: https://reviews.llvm.org/D150712

Added: 
    

Modified: 
    flang/lib/Semantics/check-declarations.cpp
    flang/test/Semantics/resolve14.f90

Removed: 
    


################################################################################
diff  --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp
index 3162af396efc..1b9a747501ed 100644
--- a/flang/lib/Semantics/check-declarations.cpp
+++ b/flang/lib/Semantics/check-declarations.cpp
@@ -261,19 +261,6 @@ void CheckHelper::Check(const Symbol &symbol) {
     CheckExplicitSave(symbol);
   }
   const auto *object{symbol.detailsIf<ObjectEntityDetails>()};
-  if (symbol.attrs().test(Attr::CONTIGUOUS)) {
-    if ((!object && !symbol.has<UseDetails>()) ||
-        !((IsPointer(symbol) && symbol.Rank() > 0) || IsAssumedShape(symbol) ||
-            evaluate::IsAssumedRank(symbol))) {
-      if (symbol.owner().IsDerivedType()) { // C752
-        messages_.Say(
-            "A CONTIGUOUS component must be an array with the POINTER attribute"_err_en_US);
-      } else { // C830
-        messages_.Say(
-            "CONTIGUOUS entity must be an array pointer, assumed-shape, or assumed-rank"_err_en_US);
-      }
-    }
-  }
   CheckGlobalName(symbol);
   if (isDone) {
     return; // following checks do not apply
@@ -848,6 +835,17 @@ void CheckHelper::CheckObjectEntity(
         "'%s' is a data object and may not be EXTERNAL"_err_en_US,
         symbol.name());
   }
+  if (symbol.attrs().test(Attr::CONTIGUOUS)) {
+    if ((IsPointer(symbol) && symbol.Rank() > 0) || IsAssumedShape(symbol) ||
+        evaluate::IsAssumedRank(symbol)) {
+    } else if (symbol.owner().IsDerivedType()) { // C752
+      messages_.Say(
+          "A CONTIGUOUS component must be an array with the POINTER attribute"_err_en_US);
+    } else { // C830
+      messages_.Say(
+          "CONTIGUOUS entity must be an array pointer, assumed-shape, or assumed-rank"_err_en_US);
+    }
+  }
 }
 
 void CheckHelper::CheckPointerInitialization(const Symbol &symbol) {

diff  --git a/flang/test/Semantics/resolve14.f90 b/flang/test/Semantics/resolve14.f90
index 78b80ae8de93..aae2145ff9cc 100644
--- a/flang/test/Semantics/resolve14.f90
+++ b/flang/test/Semantics/resolve14.f90
@@ -27,6 +27,12 @@ program p2
   contiguous w
   !ERROR: 'z' is use-associated from module 'm2' and cannot be re-declared
   integer z
+  real, target :: a(10)
+  real, contiguous, pointer :: p(:) => a
   !ERROR: Reference to 'y' is ambiguous
   y = 1
+ contains
+  subroutine inner
+    p(1) = 0. ! ok - check for regression on contiguous host assoc.
+  end subroutine
 end


        


More information about the flang-commits mailing list