[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
This commit is contained in:
Valentin Clement
2023-02-08 17:55:38 +01:00
parent cb19b83baa
commit 6a63e21cf4

View File

@@ -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<const char>(2 * j),
@@ -109,7 +110,7 @@ void RTNAME(PointerAssociateRemapping)(Descriptor &pointer,
GetInt64(bounds.ZeroBasedIndexedElement<const char>(2 * j + 1),
boundElementBytes, terminator));
if (j == 0) {
byteStride = dim.ByteStride();
byteStride = dim.ByteStride() * dim.Extent();
} else {
dim.SetByteStride(byteStride);
byteStride *= dim.Extent();