[flang-commits] [flang] [flang][runtime] Finalize polymorphic components using dynamic type (PR #67040)
via flang-commits
flang-commits at lists.llvm.org
Thu Sep 21 10:01:19 PDT 2023
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-flang-runtime
<details>
<summary>Changes</summary>
Previous code was finalizing polymorphic components according to static type (calling the static type final routine, if any).
There is no way (I think) to know from a Fortran::runtime::typeInfo::Component if an allocatable component is polymorphic or not. So this patch just always uses the dynamic type descriptor to check for derived type allocatable component finalization.
---
Full diff: https://github.com/llvm/llvm-project/pull/67040.diff
1 Files Affected:
- (modified) flang/runtime/derived.cpp (+19-1)
``````````diff
diff --git a/flang/runtime/derived.cpp b/flang/runtime/derived.cpp
index 5224c1426479a28..55545b41da8d479 100644
--- a/flang/runtime/derived.cpp
+++ b/flang/runtime/derived.cpp
@@ -209,7 +209,25 @@ void Finalize(const Descriptor &descriptor,
k < myComponents; ++k) {
const auto &comp{
*componentDesc.ZeroBasedIndexedElement<typeInfo::Component>(k)};
- if (comp.genre() == typeInfo::Component::Genre::Allocatable ||
+ if (comp.genre() == typeInfo::Component::Genre::Allocatable &&
+ comp.category() == TypeCategory::Derived) {
+ // Component may be polymorphic or unlimited polymorphic. Need to use the
+ // dynamic type to check if finalization is needed.
+ for (std::size_t j{0}; j < elements; ++j) {
+ const Descriptor &compDesc{*descriptor.OffsetElement<Descriptor>(
+ j * byteStride + comp.offset())};
+ if (compDesc.IsAllocated()) {
+ if (const DescriptorAddendum * addendum{compDesc.Addendum()}) {
+ if (const typeInfo::DerivedType *
+ compDynamicType{addendum->derivedType()}) {
+ if (!compDynamicType->noFinalizationNeeded()) {
+ Finalize(compDesc, *compDynamicType, terminator);
+ }
+ }
+ }
+ }
+ }
+ } else if (comp.genre() == typeInfo::Component::Genre::Allocatable ||
comp.genre() == typeInfo::Component::Genre::Automatic) {
if (const typeInfo::DerivedType * compType{comp.derivedType()}) {
if (!compType->noFinalizationNeeded()) {
``````````
</details>
https://github.com/llvm/llvm-project/pull/67040
More information about the flang-commits
mailing list