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 <tkoe...@gcc.gnu.org> 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 <tkoe...@gcc.gnu.org> 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)