[flang] Fix module file generation when generic shadows derived type (#78618)

Fortran allows the name of a generic interface to be the same as the
name of a derived type or specific procedure. When this happens, it
causes the code in module file generation to miss the symbol of a
derived type when scanning for symbols in initialization expressions
that need to be imported. Fix.
This commit is contained in:
Peter Klausler
2024-01-25 14:53:52 -08:00
committed by GitHub
parent a3bbe627d2
commit 7f542662ce
2 changed files with 38 additions and 0 deletions

View File

@@ -183,6 +183,13 @@ static void HarvestInitializerSymbols(
if (symbol->scope()) {
HarvestInitializerSymbols(set, *symbol->scope());
}
} else if (const auto &generic{symbol->detailsIf<GenericDetails>()};
generic && generic->derivedType()) {
const Symbol &dtSym{*generic->derivedType()};
CHECK(dtSym.has<DerivedTypeDetails>());
if (dtSym.scope()) {
HarvestInitializerSymbols(set, *dtSym.scope());
}
} else if (IsNamedConstant(*symbol) || scope.IsDerivedType()) {
if (const auto *object{symbol->detailsIf<ObjectEntityDetails>()}) {
if (object->init()) {

View File

@@ -0,0 +1,31 @@
! RUN: %python %S/test_modfile.py %s %flang_fc1
module m
use iso_c_binding, only: c_ptr, c_null_ptr
type foo
type(c_ptr) :: p = c_null_ptr
end type
interface foo ! same name as derived type
procedure f
end interface
contains
type(foo) function f()
end
end
!Expect: m.mod
!module m
!use,intrinsic::__fortran_builtins,only:__builtin_c_ptr
!use,intrinsic::iso_c_binding,only:c_ptr
!use,intrinsic::iso_c_binding,only:c_null_ptr
!private::__builtin_c_ptr
!type::foo
!type(c_ptr)::p=__builtin_c_ptr(__address=0_8)
!end type
!interface foo
!procedure::f
!end interface
!contains
!function f()
!type(foo)::f
!end
!end