mirror of
https://github.com/intel/llvm.git
synced 2026-02-01 08:56:15 +08:00
[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:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user