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 @@ -2254,6 +2254,7 @@ if (scope.IsDerivedType()) { if (Symbol * symbol{scope.FindComponent(name.source)}) { if (!symbol->has() && + !symbol->has() && !symbol->test(Symbol::Flag::ParentComp)) { return Resolve(name, symbol); } diff --git a/flang/test/Semantics/symbol23.f90 b/flang/test/Semantics/symbol23.f90 new file mode 100644 --- /dev/null +++ b/flang/test/Semantics/symbol23.f90 @@ -0,0 +1,42 @@ +! RUN: %python %S/test_symbols.py %s %flang_fc1 +! Regression test of name resolution bug +!DEF: /m Module +module m + !DEF: /m/base ABSTRACT, PUBLIC DerivedType + type, abstract :: base + contains + !DEF: /m/base/foo Generic + !DEF: /m/base/spec DEFERRED ProcBinding + generic :: foo => spec + !DEF: /m/iface ABSTRACT, PUBLIC (Subroutine) Subprogram + !REF: /m/base/spec + procedure(iface), deferred :: spec + end type + abstract interface + !REF: /m/iface + !DEF: /m/iface/this ObjectEntity CLASS(base) + subroutine iface (this) + !REF: /m/base + import :: base + !REF: /m/base + !REF: /m/iface/this + class(base) :: this + end subroutine + end interface + !REF: /m/base + !DEF: /m/ext PUBLIC DerivedType + type, extends(base) :: ext + contains + !DEF: /m/ext/spec ProcBinding + !DEF: /m/foo PUBLIC (Subroutine) Subprogram + procedure :: spec => foo + end type +contains + !REF: /m/foo + !DEF: /m/foo/this ObjectEntity CLASS(ext) + subroutine foo (this) + !REF: /m/ext + !REF: /m/foo/this + class(ext) :: this + end subroutine +end module