]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
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 d6ae6dc7178adefc1c5189d6780f02f803aabd82..f35b0dc945655b2879516b39a16818ec7f9f37d2 100644 (file)
@@ -1,3 +1,9 @@
+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
index e25389f94bea30e42b868c1836e232b9931ed75d..a507137441f57934b9a7d5155025432b786cc9d3 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 1cc26f816a5e2b2c4e26a16f3689290e5792b2f3..8bc1d28b99bfb94cbfd15ab24f8362bc4d6c5e34 100644 (file)
@@ -1,3 +1,8 @@
+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
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" } }