PR fortran/89574 - ICE in conv_function_val, at fortran/trans-expr.c:3792
authorHarald Anlauf <anlauf@gmx.de>
Tue, 21 Jul 2020 19:37:30 +0000 (21:37 +0200)
committerHarald Anlauf <anlauf@gmx.de>
Tue, 21 Jul 2020 19:37:30 +0000 (21:37 +0200)
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.

gcc/fortran/trans-decl.c
gcc/testsuite/gfortran.dg/pr89574.f90 [new file with mode: 0644]

index 769ab20c82d6a8b5d279e50b728b723518c9a91f..45a739ac860ae6a0375c37c5426efd2df23ccb3c 100644 (file)
@@ -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 (file)
index 0000000..48dd068
--- /dev/null
@@ -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