diff --git a/flang/lib/Semantics/check-declarations.cpp b/flang/lib/Semantics/check-declarations.cpp index 3162af396efcc..1b9a747501edc 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()}; - if (symbol.attrs().test(Attr::CONTIGUOUS)) { - if ((!object && !symbol.has()) || - !((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 78b80ae8de935..aae2145ff9cc5 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