From 6a63e21cf4e6a8499d90e2337eb545644646ee31 Mon Sep 17 00:00:00 2001 From: Valentin Clement Date: Wed, 8 Feb 2023 17:55:38 +0100 Subject: [PATCH] [flang] Fix rank and byte stride in pointer remapping In some remapping case the rank of the pointer is different from the target one. ``` program remap type :: p integer :: a end type t type(p), target :: ta(10) = [ (t(i),i=1,10) ] class(t), pointer :: p(:,:) p(1:2,1:5) => ta end ``` This patch updates the rank and the byte stride to fix such case. Reviewed By: klausler Differential Revision: https://reviews.llvm.org/D143566 --- flang/runtime/pointer.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/flang/runtime/pointer.cpp b/flang/runtime/pointer.cpp index c5ea96f..7bfe775 100644 --- a/flang/runtime/pointer.cpp +++ b/flang/runtime/pointer.cpp @@ -102,6 +102,7 @@ void RTNAME(PointerAssociateRemapping)(Descriptor &pointer, Terminator terminator{sourceFile, sourceLine}; SubscriptValue byteStride{/*captured from first dimension*/}; std::size_t boundElementBytes{bounds.ElementBytes()}; + pointer.raw().rank = bounds.rank(); for (int j{0}; j < bounds.rank(); ++j) { auto &dim{pointer.GetDimension(j)}; dim.SetBounds(GetInt64(bounds.ZeroBasedIndexedElement(2 * j), @@ -109,7 +110,7 @@ void RTNAME(PointerAssociateRemapping)(Descriptor &pointer, GetInt64(bounds.ZeroBasedIndexedElement(2 * j + 1), boundElementBytes, terminator)); if (j == 0) { - byteStride = dim.ByteStride(); + byteStride = dim.ByteStride() * dim.Extent(); } else { dim.SetByteStride(byteStride); byteStride *= dim.Extent(); -- 2.7.4