https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89904

kargl at gcc dot gnu.org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |kargl at gcc dot gnu.org

--- Comment #11 from kargl at gcc dot gnu.org ---
(In reply to Thomas Koenig from comment #10)
> (In reply to anlauf from comment #9)
> 
> > If you start from the full testcase, and remove - starting from the end -
> > block for block: first module m, then subroutine f, then subroutine e,
> > then subroutine d, what does trigger the ICE?
> 
> This segfaults on gcc135 (POWER9):
> 
> [tkoenig@gcc135 ~]$ cat a.f90
> recursive subroutine e
>   k = transfer (transfer (e, e), 1)
> end
> [tkoenig@gcc135 ~]$ gfortran -O a.f90
> Im Durchlauf GIMPLE: ccp
> a.f90:3:0:
> 
>     3 | end
>       | 
> interner Compiler-Fehler: in fold_convert_loc, bei fold-const.c:2552
>

This is solved by

Index: gcc/fortran/check.c
===================================================================
--- gcc/fortran/check.c (revision 270064)
+++ gcc/fortran/check.c (working copy)
@@ -5551,6 +5551,20 @@ gfc_check_transfer (gfc_expr *source, gfc_expr *mold, 
       return false;
     }

+  if (mold->ts.type == BT_PROCEDURE
+      && mold->symtree->n.sym->attr.subroutine == 1)
+    {
+      gfc_error("Stupidity occurring at %L", &mold->where);
+      return false;
+    }
+
+  if (source->ts.type == BT_PROCEDURE
+      && source->symtree->n.sym->attr.subroutine == 1)
+    {
+      gfc_error("Stupidity occurring at %L", &source->where);
+      return false;
+    }
+
   if (size != NULL)
     {
       if (!type_check (size, 2, BT_INTEGER))

Reply via email to