diff --git a/flang/runtime/type-info.cpp b/flang/runtime/type-info.cpp --- a/flang/runtime/type-info.cpp +++ b/flang/runtime/type-info.cpp @@ -87,6 +87,10 @@ void Component::EstablishDescriptor(Descriptor &descriptor, const Descriptor &container, Terminator &terminator) const { + ISO::CFI_attribute_t attribute{static_cast( + genre_ == Genre::Allocatable ? CFI_attribute_allocatable + : genre_ == Genre::Pointer ? CFI_attribute_pointer + : CFI_attribute_other)}; TypeCategory cat{category()}; if (cat == TypeCategory::Character) { std::size_t lengthInChars{0}; @@ -96,13 +100,17 @@ RUNTIME_CHECK( terminator, characterLen_.genre() == Value::Genre::Deferred); } - descriptor.Establish(kind_, lengthInChars, nullptr, rank_); + descriptor.Establish( + kind_, lengthInChars, nullptr, rank_, nullptr, attribute); } else if (cat == TypeCategory::Derived) { - const DerivedType *type{derivedType()}; - RUNTIME_CHECK(terminator, type != nullptr); - descriptor.Establish(*type, nullptr, rank_); + if (const DerivedType * type{derivedType()}) { + descriptor.Establish(*type, nullptr, rank_, nullptr, attribute); + } else { // unlimited polymorphic + descriptor.Establish(TypeCode{TypeCategory::Derived, 0}, 0, nullptr, + rank_, nullptr, attribute, true); + } } else { - descriptor.Establish(cat, kind_, nullptr, rank_); + descriptor.Establish(cat, kind_, nullptr, rank_, nullptr, attribute); } if (rank_ && genre_ != Genre::Allocatable) { const typeInfo::Value *boundValues{bounds()};