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

Reply via email to