diff --git a/flang/docs/Extensions.md b/flang/docs/Extensions.md index ac293ce08d5f7..d4dacb7e427f4 100644 --- a/flang/docs/Extensions.md +++ b/flang/docs/Extensions.md @@ -175,6 +175,10 @@ end * OPEN(ACCESS='APPEND') is interpreted as OPEN(POSITION='APPEND') to ease porting from Sun Fortran. * Intrinsic subroutines EXIT([status]) and ABORT() +* The definition of simple contiguity in 9.5.4 applies only to arrays; + we also treat scalars as being trivially contiguous, so that they + can be used in contexts like data targets in pointer assignments + with bounds remapping. ### Extensions supported when enabled by options diff --git a/flang/lib/Evaluate/check-expression.cpp b/flang/lib/Evaluate/check-expression.cpp index 2e0cc8087b8a0..aaed4c33b1e1f 100644 --- a/flang/lib/Evaluate/check-expression.cpp +++ b/flang/lib/Evaluate/check-expression.cpp @@ -626,8 +626,12 @@ class IsSimplyContiguousHelper Result operator()(const semantics::Symbol &symbol) const { const auto &ultimate{symbol.GetUltimate()}; - if (ultimate.attrs().test(semantics::Attr::CONTIGUOUS) || - ultimate.Rank() == 0) { + if (ultimate.attrs().test(semantics::Attr::CONTIGUOUS)) { + return true; + } else if (ultimate.Rank() == 0) { + // Extension: accept scalars as a degenerate case of + // simple contiguity to allow their use in contexts like + // data targets in pointer assignments with remapping. return true; } else if (semantics::IsPointer(ultimate)) { return false;