2012-12-09 Thomas Koenig <tkoenig@gcc.gnu.org>
authortkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 9 Dec 2012 09:15:36 +0000 (09:15 +0000)
committertkoenig <tkoenig@138bc75d-0d04-0410-961f-82ee72b054a4>
Sun, 9 Dec 2012 09:15:36 +0000 (09:15 +0000)
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-09  Thomas Koenig  <tkoenig@gcc.gnu.org>

PR fortran/55593
* gfortran.dg/do_check_8.f90:  New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194329 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/fortran/ChangeLog
gcc/fortran/frontend-passes.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/do_check_8.f90 [new file with mode: 0644]

index 344c4e4..12d53ee 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-09  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/55593
+       * gfortran.dg/do_check_8.f90:  New test.
+
 2012-12-05  Tobias Burnus  <burnus@net-b.de>
 
        * resolve.c (generate_component_assignments): Fix memleak.
index 6679368..691862f 100644 (file)
@@ -1277,7 +1277,11 @@ doloop_code (gfc_code **c, int *walk_subtrees ATTRIBUTE_UNUSED,
       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.  */
index b1f6c99..823916a 100644 (file)
@@ -1,3 +1,8 @@
+2012-12-09  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       PR fortran/55593
+       * gfortran.dg/do_check_8.f90:  New test.
+
 2012-12-08  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gnat.dg/vect10.ad[sb]: New test.
diff --git a/gcc/testsuite/gfortran.dg/do_check_8.f90 b/gcc/testsuite/gfortran.dg/do_check_8.f90
new file mode 100644 (file)
index 0000000..458ae40
--- /dev/null
@@ -0,0 +1,59 @@
+! { 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" } }