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
This commit is contained in:
Paul Thomas 2007-10-02 07:53:05 +00:00
parent e2d299684b
commit a7ca4d8d3d
4 changed files with 65 additions and 1 deletions

View 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

View 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++;

View 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

View File

@ -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" } }