diff --git a/flang/lib/Semantics/runtime-type-info.cpp b/flang/lib/Semantics/runtime-type-info.cpp index 66c42160ee9e9..9845a190bc756 100644 --- a/flang/lib/Semantics/runtime-type-info.cpp +++ b/flang/lib/Semantics/runtime-type-info.cpp @@ -555,10 +555,11 @@ const Symbol *RuntimeTableBuilder::DescribeType(Scope &dtScope) { }, symbol.details()); } - // Sort the data component symbols by offset before emitting them + // Sort the data component symbols by offset before emitting them, placing + // the parent component first if any. std::sort(dataComponentSymbols.begin(), dataComponentSymbols.end(), [](const Symbol *x, const Symbol *y) { - return x->offset() < y->offset(); + return x->test(Symbol::Flag::ParentComp) || x->offset() < y->offset(); }); std::vector dataComponents; for (const Symbol *symbol : dataComponentSymbols) { diff --git a/flang/test/Semantics/typeinfo10.f90 b/flang/test/Semantics/typeinfo10.f90 new file mode 100644 index 0000000000000..43c418bf45d0f --- /dev/null +++ b/flang/test/Semantics/typeinfo10.f90 @@ -0,0 +1,14 @@ +!RUN: bbc --dump-symbols %s | FileCheck %s +!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s + +! Test that empty parent types are still set first in the +! runtime info global array describing components. +module empty_parent + type :: z + end type + + type, extends(z) :: t + integer :: a + end type +end module +! CHECK: .c.t, SAVE{{.*}}.n.z{{.*}}n.a