diff --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp --- a/flang/lib/Evaluate/check-expression.cpp +++ b/flang/lib/Evaluate/check-expression.cpp @@ -661,10 +661,15 @@ return true; } else if (semantics::IsPointer(ultimate)) { return false; + } else if (semantics::IsAllocatable(ultimate)) { + // TODO: this could be merged with the case below if + // details->IsAssumedShape() did not return true for allocatables. Current + // ArraySpec building in semantics does not allow making a difference + // between some_assumed_shape(:) and some_allocatable(:). Both + // isDeferredShape() and isAssumedShape() are true in each case. + return true; } else if (const auto *details{ ultimate.detailsIf()}) { - // N.B. ALLOCATABLEs are deferred shape, not assumed, and - // are obviously contiguous. return !details->IsAssumedShape() && !details->IsAssumedRank(); } else if (auto assoc{Base::operator()(ultimate)}) { return assoc; diff --git a/flang/test/Evaluate/folding09.f90 b/flang/test/Evaluate/folding09.f90 --- a/flang/test/Evaluate/folding09.f90 +++ b/flang/test/Evaluate/folding09.f90 @@ -9,9 +9,10 @@ real, pointer, contiguous :: f(:) f => hosted end function - subroutine test(arr1, arr2, arr3, mat) + subroutine test(arr1, arr2, arr3, mat, alloc) real, intent(in) :: arr1(:), arr2(10), mat(10, 10) real, intent(in), contiguous :: arr3(:) + real, allocatable :: alloc(:) real :: scalar logical, parameter :: test_isc01 = is_contiguous(0) logical, parameter :: test_isc02 = is_contiguous(scalar) @@ -24,5 +25,6 @@ logical, parameter :: test_isc09 = is_contiguous(arr2(1:10:1)) logical, parameter :: test_isc10 = is_contiguous(arr3) logical, parameter :: test_isc11 = is_contiguous(f()) + logical, parameter :: test_isc12 = is_contiguous(alloc) end subroutine end module