Hello world,
the attached patch fixes a regression introduced with the recent
checking for DO loop variables when they are used with a generic
subroutine where the generic name matches one of the actual names.
Regression-tested. OK for trunk?
Thomas
2012-12-08 Thomas Koenig <[email protected]>
PR fortran/55593
* frontend-passes.c (doloop_code): Use resolved_sym
instead of n.sym->formal for formal argument list
to get the correct version for all generic subroutines.
2012-12-08 Thomas Koenig <[email protected]>
PR fortran/55593
* gfortran.dg/do_check_8.f90: New test.
! { dg-do compile }
! PR 55593 - bogus error with generic subroutines
module foo
implicit none
interface sub
subroutine sub2(i)
integer, intent(in) :: i
end subroutine sub2
subroutine sub(i)
integer, dimension(:), intent(out) :: i
end subroutine sub
end interface sub
interface tub2
subroutine tub2(i)
integer, intent(in) :: i
end subroutine tub2
subroutine tub(i)
integer, dimension(:), intent(out) :: i
end subroutine tub
end interface tub2
interface func
integer function ifunc(i)
integer, intent(in) :: i
end function ifunc
integer function func(i)
integer, intent(in) :: i(:)
end function func
end interface func
interface igunc
integer function igunc(i)
integer, intent(in) :: i
end function igunc
integer function gunc(i)
integer, intent(in) :: i(:)
end function gunc
end interface igunc
end module foo
program main
use foo
implicit none
integer :: i
do i=1,10
call sub(i)
call tub2(i)
end do
do i=1,10
print *,func(i)
print *,igunc(i)
end do
do undeclared=1,10 ! { dg-error "has no IMPLICIT type" }
call sub(undeclared)
end do
end program main
! { dg-final { cleanup-modules "foo" } }
Index: frontend-passes.c
===================================================================
--- frontend-passes.c (Revision 193793)
+++ frontend-passes.c (Arbeitskopie)
@@ -1277,8 +1277,12 @@ doloop_code (gfc_code **c, int *walk_subtrees ATTR
break;
case EXEC_CALL:
- f = co->symtree->n.sym->formal;
+ if (co->resolved_sym == NULL)
+ break;
+
+ f = co->resolved_sym->formal;
+
/* Withot a formal arglist, there is only unknown INTENT,
which we don't check for. */
if (f == NULL)