[flang] Fix bogus errors about CONTIGUOUS attribute
authorPeter Klausler <pklausler@nvidia.com>
Tue, 9 May 2023 21:41:32 +0000 (14:41 -0700)
committerPeter Klausler <pklausler@nvidia.com>
Tue, 16 May 2023 21:01:24 +0000 (14:01 -0700)
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

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

index 3162af3..1b9a747 100644 (file)
@@ -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) {
index 78b80ae..aae2145 100644 (file)
@@ -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