When checking for an external procedure from the same file, do not
consider symbols from different modules.
gcc/fortran/
PR fortran/89574
* trans-decl.c (gfc_get_extern_function_decl): Check whether a
symbol belongs to a different module.
if (gsym && !gsym->bind_c)
gsym = NULL;
}
- else
+ else if (sym->module == NULL)
{
gsym = gfc_find_gsymbol (gfc_gsym_root, sym->name);
if (gsym && gsym->bind_c)
gsym = NULL;
}
+ else
+ {
+ /* Procedure from a different module. */
+ gsym = NULL;
+ }
if (gsym && !gsym->defined)
gsym = NULL;
--- /dev/null
+! { dg-do compile }
+! PR fortran/89574 - ICE in conv_function_val, at fortran/trans-expr.c:3792
+
+module mod1
+contains
+ subroutine init
+ end subroutine
+end module
+
+module mod2
+contains
+ subroutine init
+ end subroutine
+end module
+
+module init
+ use mod1, only : test_init1 => init
+ use mod2, only : test_init2 => init
+ implicit none
+contains
+ subroutine sub
+ call test_init1
+ call test_init2
+ call init
+ contains
+ subroutine init
+ end subroutine
+ end subroutine
+end module