diff --git a/flang/lib/Lower/ConvertExprToHLFIR.cpp b/flang/lib/Lower/ConvertExprToHLFIR.cpp --- a/flang/lib/Lower/ConvertExprToHLFIR.cpp +++ b/flang/lib/Lower/ConvertExprToHLFIR.cpp @@ -719,6 +719,7 @@ if (recordType.isDependentType()) TODO(getLoc(), "Designate derived type with length parameters in HLFIR"); mlir::Type fieldType = recordType.getType(partInfo.componentName); + assert(fieldType && "component name is not known"); mlir::Type fieldBaseType = hlfir::getFortranElementOrSequenceType(fieldType); partInfo.componentShape = genComponentShape(componentSym, fieldBaseType); diff --git a/flang/lib/Semantics/resolve-names.cpp b/flang/lib/Semantics/resolve-names.cpp --- a/flang/lib/Semantics/resolve-names.cpp +++ b/flang/lib/Semantics/resolve-names.cpp @@ -4354,6 +4354,10 @@ } else if (attrs.test(Attr::PARAMETER)) { // C882, C883 Say(name, "Missing initialization for parameter '%s'"_err_en_US); } + if (auto *scopeSymbol{currScope().symbol()}) + if (auto *details{scopeSymbol->detailsIf()}) + if (details->isDECStructure()) + details->add_component(symbol); } void DeclarationVisitor::Post(const parser::PointerDecl &x) { diff --git a/flang/test/Semantics/struct02.f90 b/flang/test/Semantics/struct02.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/struct02.f90 @@ -0,0 +1,21 @@ +! Test component name resolution with nested legacy DEC structures. +!RUN: %flang_fc1 -fdebug-dump-symbols %s | FileCheck %s + + structure /a/ + integer :: a_first_comp + structure /b/ b1, b2(100) + integer :: i + end structure + structure /c/ z + integer :: i + structure /d/ d1, d2(10) + real :: x + end structure + end structure + integer :: a_last_comp + end structure +end +! CHECK: /a/: DerivedType sequence components: a_first_comp,b1,b2,z,a_last_comp +! CHECK: /b/: DerivedType sequence components: i +! CHECK: /c/: DerivedType sequence components: i,d1,d2 +! CHECK: /d/: DerivedType sequence components: x