diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2007-10-02 07:53:05 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2007-10-02 07:53:05 +0000 |
commit | a7ca4d8d3d7caa24e708267d8a6560eb6faf809a (patch) | |
tree | 351f992681af4a467247bdc3af7bd97396f7e3b9 /gcc | |
parent | e2d299684b33efc10cb3eeb773cb1780af0b5719 (diff) | |
download | gcc-a7ca4d8d3d7caa24e708267d8a6560eb6faf809a.zip gcc-a7ca4d8d3d7caa24e708267d8a6560eb6faf809a.tar.gz gcc-a7ca4d8d3d7caa24e708267d8a6560eb6faf809a.tar.bz2 |
re PR fortran/33550 (ICE (segfault) when USEing ambiguous symbols)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/decl.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/ambiguous_reference_1.f90 | 50 |
4 files changed, 65 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d6ae6dc..f35b0dc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -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 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index e25389f..a507137 100644 --- a/gcc/fortran/decl.c +++ b/gcc/fortran/decl.c @@ -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++; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1cc26f8..8bc1d28 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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 index 0000000..93b155e --- /dev/null +++ b/gcc/testsuite/gfortran.dg/ambiguous_reference_1.f90 @@ -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" } } |