diff --git a/flang/lib/Semantics/runtime-type-info.cpp b/flang/lib/Semantics/runtime-type-info.cpp index 153b9841e796e..94a1af6bff578 100644 --- a/flang/lib/Semantics/runtime-type-info.cpp +++ b/flang/lib/Semantics/runtime-type-info.cpp @@ -1112,15 +1112,18 @@ void RuntimeTableBuilder::DescribeSpecialProc( } } else { // user defined derived type I/O CHECK(proc->dummyArguments.size() >= 4); + const auto *ddo{std::get_if( + &proc->dummyArguments[0].u)}; + if (!ddo) { + return; + } if (derivedTypeSpec && - !std::get( - proc->dummyArguments[0].u) - .type.type() - .IsTkCompatibleWith(evaluate::DynamicType{*derivedTypeSpec})) { + !ddo->type.type().IsTkCompatibleWith( + evaluate::DynamicType{*derivedTypeSpec})) { // Defined I/O specific procedure is not for this derived type. return; } - if (binding) { + if (ddo->type.type().IsPolymorphic()) { isArgDescriptorSet |= 1; } switch (io.value()) {