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
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,
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) {