re PR fortran/37583 (ICE "insert_bbt(): Duplicate key" for self-calling ENTRY subprogram)

2008-09-21  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/37583
	* decl.c (scalarize_intrinsic_call): Both subroutines and
	functions can give a true for get_proc_mame's last argument so
	remove the &&gfc_current_ns->proc_name->attr.function.
	resolve.c (resolve_actual_arglist): Add check for recursion by
	reference to procedure as actual argument.

2008-09-21  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/37583
	* gfortran.dg/entry_18.f90: New test.

From-SVN: r140532
This commit is contained in:
Paul Thomas 2008-09-21 19:58:23 +00:00
parent 19047e4a03
commit ecd3b73c6d
5 changed files with 60 additions and 2 deletions

View file

@ -1,3 +1,12 @@
2008-09-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/37583
* decl.c (scalarize_intrinsic_call): Both subroutines and
functions can give a true for get_proc_mame's last argument so
remove the &&gfc_current_ns->proc_name->attr.function.
resolve.c (resolve_actual_arglist): Add check for recursion by
reference to procedure as actual argument.
2008-09-21 Daniel Kraft <d@domob.eu>
PR fortran/35846

View file

@ -4639,8 +4639,7 @@ gfc_match_entry (void)
created symbols attached to the current namespace. */
if (get_proc_name (name, &entry,
gfc_current_ns->parent != NULL
&& module_procedure
&& gfc_current_ns->proc_name->attr.function))
&& module_procedure))
return MATCH_ERROR;
proc = gfc_current_block ();

View file

@ -1176,6 +1176,15 @@ resolve_actual_arglist (gfc_actual_arglist *arg, procedure_type ptype,
/* Just in case a specific was found for the expression. */
sym = e->symtree->n.sym;
if (sym->attr.entry && sym->ns->entries
&& sym->ns == gfc_current_ns
&& !sym->ns->entries->sym->attr.recursive)
{
gfc_error ("Reference to ENTRY '%s' at %L is recursive, but procedure "
"'%s' is not declared as RECURSIVE",
sym->name, &e->where, sym->ns->entries->sym->name);
}
/* If the symbol is the function that names the current (or
parent) scope, then we really have a variable reference. */

View file

@ -1,3 +1,8 @@
2008-09-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/37583
* gfortran.dg/entry_18.f90: New test.
2008-09-21 Daniel Kraft <d@domob.eu>
PR fortran/35846

View file

@ -0,0 +1,36 @@
! { dg-do compile }
! Test fix for PR37583, in which:
! (i) the reference to glocal prior to the ENTRY caused an internal
! error and
! (ii) the need for a RECURSIVE attribute was ignored.
!
! Contributed by Arjen Markus <arjen.markus@wldelft.nl>
!
module gsub
contains
recursive subroutine suba( g ) ! prefix with "RECURSIVE"
interface
real function g(x)
real x
end function
end interface
real :: x, y
call mysub( glocala )
return
entry glocala( x, y )
y = x
end subroutine
subroutine subb( g )
interface
real function g(x)
real x
end function
end interface
real :: x, y
call mysub( glocalb ) ! { dg-error "is recursive" }
return
entry glocalb( x, y )
y = x
end subroutine
end module
! { dg-final { cleanup-modules "gsub" } }