diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d6ae6dc7178a..f35b0dc94565 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2007-10-02 Paul Thomas + + 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 PR fortran/31154 diff --git a/gcc/fortran/decl.c b/gcc/fortran/decl.c index e25389f94bea..a507137441f5 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 1cc26f816a5e..8bc1d28b99bf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-10-02 Paul Thomas + + PR fortran/33550 + * gfortran.dg/ambiguous_reference_1.f90: New test. + 2007-10-02 Paul Thomas 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 index 000000000000..93b155ef56df --- /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" } }