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:
parent
19047e4a03
commit
ecd3b73c6d
5 changed files with 60 additions and 2 deletions
|
@ -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
|
||||
|
|
|
@ -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 ();
|
||||
|
|
|
@ -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. */
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
36
gcc/testsuite/gfortran.dg/entry_18.f90
Normal file
36
gcc/testsuite/gfortran.dg/entry_18.f90
Normal 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" } }
|
Loading…
Add table
Reference in a new issue