re PR fortran/33550 (ICE (segfault) when USEing ambiguous symbols)
authorPaul Thomas <pault@gcc.gnu.org>
Tue, 2 Oct 2007 07:53:05 +0000 (07:53 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Tue, 2 Oct 2007 07:53:05 +0000 (07:53 +0000)
2007-10-02  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/33550
* decl.c (get_proc_name): Return rc if rc is non-zero; ie. if
the name is a reference to an ambiguous symbol.

2007-10-02  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/33550
* gfortran.dg/ambiguous_reference_1.f90: New test.

From-SVN: r128949

gcc/fortran/ChangeLog
gcc/fortran/decl.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/ambiguous_reference_1.f90 [new file with mode: 0644]

index d6ae6dc..f35b0dc 100644 (file)
@@ -1,5 +1,11 @@
 2007-10-02  Paul Thomas  <pault@gcc.gnu.org>
 
+       PR fortran/33550
+       * decl.c (get_proc_name): Return rc if rc is non-zero; ie. if
+       the name is a reference to an ambiguous symbol.
+
+2007-10-02  Paul Thomas  <pault@gcc.gnu.org>
+
        PR fortran/31154
        PR fortran/31229
        PR fortran/33334
index e25389f..a507137 100644 (file)
@@ -672,7 +672,7 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
 {
   gfc_symtree *st;
   gfc_symbol *sym;
-  int rc;
+  int rc = 0;
 
   /* Module functions have to be left in their own namespace because
      they have potentially (almost certainly!) already been referenced.
@@ -709,6 +709,9 @@ get_proc_name (const char *name, gfc_symbol **result, bool module_fcn_entry)
   else
     rc = gfc_get_symbol (name, gfc_current_ns->parent, result);
 
+  if (rc)
+    return rc;
+
   sym = *result;
   gfc_current_ns->refs++;
 
index 1cc26f8..8bc1d28 100644 (file)
@@ -1,5 +1,10 @@
 2007-10-02  Paul Thomas  <pault@gcc.gnu.org>
 
+       PR fortran/33550
+       * gfortran.dg/ambiguous_reference_1.f90: New test.
+
+2007-10-02  Paul Thomas  <pault@gcc.gnu.org>
+
        PR fortran/31154
        PR fortran/31229
        PR fortran/33334
diff --git a/gcc/testsuite/gfortran.dg/ambiguous_reference_1.f90 b/gcc/testsuite/gfortran.dg/ambiguous_reference_1.f90
new file mode 100644 (file)
index 0000000..93b155e
--- /dev/null
@@ -0,0 +1,50 @@
+! { dg-do compile }
+! Tests the fix for PR33550, in which an ICE would occur, instead of
+! the abiguous reference error.
+!
+! Found at
+! http://groups.google.com/group/comp.lang.fortran/browse_thread/thread/1abc1549a6a164f1/
+! by James Van Buskirk:
+!
+module M1
+   real x
+end module M1
+
+module M2
+   contains
+      subroutine y
+      end subroutine y
+end module M2
+
+module M3
+   use M2, x => y
+end module M3
+
+module M4
+   use M1
+   use M3
+end module M4
+
+module M5
+   use M4             ! 'x' is ambiguous here but is not referred to
+end module M5
+
+module M6
+   use M5             ! ditto
+end module M6
+
+program test
+   use M1
+   use M3
+   interface
+      function x(z)   ! { dg-error "ambiguous reference" }
+      end function x  ! { dg-error "Expecting END INTERFACE" }
+   end interface
+
+   write(*,*) 'Hello, world!'
+end program test
+
+function x(z)
+   x = z
+end function x
+! { dg-final { cleanup-modules "m1 m2 m3 m4 m5 m6" } }