diff --git a/flang/lib/Lower/Bridge.cpp b/flang/lib/Lower/Bridge.cpp --- a/flang/lib/Lower/Bridge.cpp +++ b/flang/lib/Lower/Bridge.cpp @@ -204,9 +204,11 @@ info.loc, dtName, parent ? Fortran::lower::mangle::mangleName(*parent) : ""); auto insertPt = builder.saveInsertionPoint(); - + const Fortran::semantics::Scope *scope = info.typeSpec->scope(); + if (!scope) + scope = info.typeSpec->typeSymbol().scope(); Fortran::semantics::SymbolVector bindings = - Fortran::semantics::CollectBindings(*info.typeSpec->scope()); + Fortran::semantics::CollectBindings(*scope); if (!bindings.empty()) builder.createBlock(&dt.getRegion()); diff --git a/flang/test/Lower/dispatch.f90 b/flang/test/Lower/dispatch.f90 --- a/flang/test/Lower/dispatch.f90 +++ b/flang/test/Lower/dispatch.f90 @@ -39,6 +39,16 @@ procedure(nopass_defferred), deferred, nopass :: nopassd end type + type :: node + type(node_ptr), pointer :: n(:) + end type + type :: use_node + type(node) :: n + end type + type :: node_ptr + type(node_ptr), pointer :: n + end type + contains ! ------------------------------------------------------------------------------ @@ -341,4 +351,8 @@ ! CHECK: fir.call @_QMcall_dispatchPtbp_pass_arg0 ! CHECK: fir.call @_QMcall_dispatchPtbp_pass_arg1 + subroutine use_node_test(n) + type(use_node) :: n + end subroutine + end module