[flang-commits] [flang] b37e359 - [flang] Carry over the derived type from MOLD

Valentin Clement via flang-commits flang-commits at lists.llvm.org
Wed Feb 8 00:27:36 PST 2023


Author: Valentin Clement
Date: 2023-02-08T09:27:27+01:00
New Revision: b37e35979ad569c052b31c7b9e543cca49346cdc

URL: https://github.com/llvm/llvm-project/commit/b37e35979ad569c052b31c7b9e543cca49346cdc
DIFF: https://github.com/llvm/llvm-project/commit/b37e35979ad569c052b31c7b9e543cca49346cdc.diff

LOG: [flang] Carry over the derived type from MOLD

Derived type from the MOLD was not carried over
to the newly allocated pointer or allocatable.
This may lead to wrong dynamic type when the pointer or allocatable
is polymorphic as shown in the example below:

```
type :: p1
  integer :: a
end type

type, extends(p1) :: p2
  integer :: b
end type

class(p1), pointer :: p(:)

allocate(p(5), MOLD=p2(1,2))
```

Reviewed By: klausler

Differential Revision: https://reviews.llvm.org/D143525

Added: 
    

Modified: 
    flang/runtime/allocatable.cpp
    flang/runtime/pointer.cpp

Removed: 
    


################################################################################
diff  --git a/flang/runtime/allocatable.cpp b/flang/runtime/allocatable.cpp
index 9a11ebf0d0b66..a7cc75b11feb7 100644
--- a/flang/runtime/allocatable.cpp
+++ b/flang/runtime/allocatable.cpp
@@ -94,6 +94,13 @@ void RTNAME(AllocatableApplyMold)(
   descriptor.set_base_addr(nullptr);
   descriptor.raw().attribute = CFI_attribute_allocatable;
   descriptor.raw().rank = rank;
+  if (auto *descAddendum{descriptor.Addendum()}) {
+    if (const auto *moldAddendum{mold.Addendum()}) {
+      if (const auto *derived{moldAddendum->derivedType()}) {
+        descAddendum->set_derivedType(derived);
+      }
+    }
+  }
 }
 
 int RTNAME(AllocatableAllocate)(Descriptor &descriptor, bool hasStat,

diff  --git a/flang/runtime/pointer.cpp b/flang/runtime/pointer.cpp
index 83fbb583864cf..c5ea96f3ee01a 100644
--- a/flang/runtime/pointer.cpp
+++ b/flang/runtime/pointer.cpp
@@ -60,6 +60,13 @@ void RTNAME(PointerApplyMold)(
   pointer.set_base_addr(nullptr);
   pointer.raw().attribute = CFI_attribute_pointer;
   pointer.raw().rank = rank;
+  if (auto *pointerAddendum{pointer.Addendum()}) {
+    if (const auto *moldAddendum{mold.Addendum()}) {
+      if (const auto *derived{moldAddendum->derivedType()}) {
+        pointerAddendum->set_derivedType(derived);
+      }
+    }
+  }
 }
 
 void RTNAME(PointerAssociateScalar)(Descriptor &pointer, void *target) {


        


More information about the flang-commits mailing list