As Fortran allows to rename a symbol on use, we need to be careful to
check whether a name we are looking for is a global one or belongs to
a different module. Check for this condition.
Regtested on x86_64-pc-linux-gnu.
OK for master / backports after some time for a proper burn-in?
Thanks,
Harald
PR fortran/89574 - ICE in conv_function_val, at fortran/trans-expr.c:3792
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.
diff --git a/gcc/fortran/trans-decl.c b/gcc/fortran/trans-decl.c
index 769ab20c82d..45a739ac860 100644
--- a/gcc/fortran/trans-decl.c
+++ b/gcc/fortran/trans-decl.c
@@ -2090,12 +2090,17 @@ gfc_get_extern_function_decl (gfc_symbol * sym, gfc_actual_arglist *actual_args)
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;
diff --git a/gcc/testsuite/gfortran.dg/pr89574.f90 b/gcc/testsuite/gfortran.dg/pr89574.f90
new file mode 100644
index 00000000000..48dd0680a48
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/pr89574.f90
@@ -0,0 +1,29 @@
+! { 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