[Patch, Fortran, committed] PR 78592: [7 Regression] ICE in gfc_find_specific_dtio_proc, at fortran/interface.c:4939

Janus Weil janus@gcc.gnu.org
Wed Nov 30 09:52:00 GMT 2016


Hi all,

I have just committed a completely obvious patch for this PR. All it
does is rearrange some expressions to avoid an ICE (see attachment):

https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=243005

Cheers,
Janus
-------------- next part --------------
Index: gcc/fortran/interface.c
===================================================================
--- gcc/fortran/interface.c	(revision 243004)
+++ gcc/fortran/interface.c	(working copy)
@@ -4933,15 +4933,15 @@ gfc_find_specific_dtio_proc (gfc_symbol *derived,
 	  && tb_io_st->n.sym
 	  && tb_io_st->n.sym->generic)
 	{
-	  gfc_interface *intr;
-	  for (intr = tb_io_st->n.sym->generic; intr; intr = intr->next)
+	  for (gfc_interface *intr = tb_io_st->n.sym->generic;
+	       intr && intr->sym && intr->sym->formal;
+	       intr = intr->next)
 	    {
 	      gfc_symbol *fsym = intr->sym->formal->sym;
-	      if (intr->sym && intr->sym->formal
-		  && ((fsym->ts.type == BT_CLASS
-		      && CLASS_DATA (fsym)->ts.u.derived == extended)
-		    || (fsym->ts.type == BT_DERIVED
-			&& fsym->ts.u.derived == extended)))
+	      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: gcc/testsuite/gfortran.dg/dtio_18.f90
===================================================================
--- gcc/testsuite/gfortran.dg/dtio_18.f90	(nonexistent)
+++ gcc/testsuite/gfortran.dg/dtio_18.f90	(working copy)
@@ -0,0 +1,15 @@
+! { dg-do compile }
+!
+! PR 78592: [7 Regression] ICE in gfc_find_specific_dtio_proc, at fortran/interface.c:4939
+!
+! Contributed by Gerhard Steinmetz <gerhard.steinmetz.fortran@t-online.de>
+
+program p
+   type t
+   end type
+   type(t) :: z
+   interface write(formatted)
+      module procedure wf    ! { dg-error "is neither function nor subroutine" }
+   end interface
+   print *, z
+end


More information about the Fortran mailing list