re PR fortran/78592 (ICE in gfc_find_specific_dtio_proc, at fortran/interface.c:4939)
authorJanus Weil <janus@gcc.gnu.org>
Sun, 18 Dec 2016 11:03:41 +0000 (12:03 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Sun, 18 Dec 2016 11:03:41 +0000 (12:03 +0100)
2016-12-18  Janus Weil  <janus@gcc.gnu.org>

PR fortran/78592
* interfac.c (gfc_find_specific_dtio_proc): Fixup for r243005, making
sure that the generic list is followed through until the end.

2016-12-18  Janus Weil  <janus@gcc.gnu.org>

PR fortran/78592
* gfortran.dg/dtio_21.f90: New test.

From-SVN: r243783

gcc/fortran/ChangeLog
gcc/fortran/interface.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/dtio_21.f90 [new file with mode: 0644]

index 7bb3bbc87da0d2221ce767cb9cc856e457dffec9..693d51fd5ba07fc8b5a8278d6d65e6f4a437ca7e 100644 (file)
@@ -1,9 +1,13 @@
+2016-12-18  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/78592
+       * interfac.c (gfc_find_specific_dtio_proc): Fixup for r243005, making
+       sure that the generic list is followed through until the end.
+
 2016-12-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        PR fortran/78239
-       * decl.c (char_len_param_value):  Actually commit
-       previous change.
-
+       * decl.c (char_len_param_value): Actually commit previous change.
 
 2016-12-17  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
index 6e61aec1d01210986e486d7b30c69027aebc12cc..6264aba39164f4e6489453d4a2922a01c241fd6a 100644 (file)
@@ -4949,17 +4949,19 @@ gfc_find_specific_dtio_proc (gfc_symbol *derived, bool write, bool formatted)
          && tb_io_st->n.sym->generic)
        {
          for (gfc_interface *intr = tb_io_st->n.sym->generic;
-              intr && intr->sym && intr->sym->formal;
-              intr = intr->next)
+              intr && intr->sym; intr = intr->next)
            {
-             gfc_symbol *fsym = intr->sym->formal->sym;
-             if ((fsym->ts.type == BT_CLASS
-                  && CLASS_DATA (fsym)->ts.u.derived == extended)
-                 || (fsym->ts.type == BT_DERIVED
-                     && fsym->ts.u.derived == extended))
+             if (intr->sym->formal)
                {
-                 dtio_sub = intr->sym;
-                 break;
+                 gfc_symbol *fsym = intr->sym->formal->sym;
+                 if ((fsym->ts.type == BT_CLASS
+                     && CLASS_DATA (fsym)->ts.u.derived == extended)
+                     || (fsym->ts.type == BT_DERIVED
+                         && fsym->ts.u.derived == extended))
+                   {
+                     dtio_sub = intr->sym;
+                     break;
+                   }
                }
            }
        }
index c7bf548ed3c80af6adcf20e05c33e5f90c528c74..6583316bbf4f7fd5c8294ad187daaf4d4634f18b 100644 (file)
@@ -1,3 +1,8 @@
+2016-12-18  Janus Weil  <janus@gcc.gnu.org>
+
+       PR fortran/78592
+       * gfortran.dg/dtio_21.f90: New test.
+
 2016-12-17  Steven G. Kargl  <kargl@gcc.gnu.org>
 
        PR fortran/78746
diff --git a/gcc/testsuite/gfortran.dg/dtio_21.f90 b/gcc/testsuite/gfortran.dg/dtio_21.f90
new file mode 100644 (file)
index 0000000..8bfe3aa
--- /dev/null
@@ -0,0 +1,30 @@
+! { dg-do compile }
+!
+! PR 78592: [7 Regression] ICE in gfc_find_specific_dtio_proc, at fortran/interface.c:4939
+!
+! Contributed by Mikael Morin <morin-mikael@orange.fr>
+
+program p
+   type t
+   end type
+   type(t) :: z
+   type, extends(t) :: t2
+   end type
+   class(t2), allocatable :: z2
+   interface write(formatted)
+      procedure wf2
+      module procedure wf   ! { dg-error "is neither function nor subroutine" }
+   end interface
+   print *, z
+   allocate(z2)
+   print *, z2
+  contains
+   subroutine wf2(this, a, b, c, d, e)
+      class(t2), intent(in) :: this
+      integer, intent(in) :: a
+      character, intent(in) :: b
+      integer, intent(in) :: c(:)
+      integer, intent(out) :: d
+      character, intent(inout) :: e
+   end subroutine wf2
+end