re PR fortran/83515 (ICE: Invalid expression in gfc_element_size)
authorHarald Anlauf <anlauf@gmx.de>
Sun, 31 Mar 2019 18:33:51 +0000 (18:33 +0000)
committerHarald Anlauf <anlauf@gcc.gnu.org>
Sun, 31 Mar 2019 18:33:51 +0000 (18:33 +0000)
2019-03-31  Harald Anlauf  <anlauf@gmx.de>

PR fortran/83515
PR fortran/85797
* trans-types.c (gfc_typenode_for_spec): Handle conversion for
procedure pointers.
* target-memory.c (gfc_element_size): Handle size determination
for procedure pointers.

PR fortran/83515
PR fortran/85797
* gfortran.dg/pr85797.f90: New test.

From-SVN: r270045

gcc/fortran/ChangeLog
gcc/fortran/target-memory.c
gcc/fortran/trans-types.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/pr85797.f90 [new file with mode: 0644]

index e80033a..61eb67b 100644 (file)
@@ -1,3 +1,12 @@
+2019-03-31  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/83515
+       PR fortran/85797
+       * trans-types.c (gfc_typenode_for_spec): Handle conversion for
+       procedure pointers.
+       * target-memory.c (gfc_element_size): Handle size determination
+       for procedure pointers.
+
 2019-03-31  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        * dump-parse-tree.c (debug):  Add for symbol_attribute *,
index 09af2a5..1354c57 100644 (file)
@@ -120,6 +120,7 @@ gfc_element_size (gfc_expr *e, size_t *siz)
     case BT_CLASS:
     case BT_VOID:
     case BT_ASSUMED:
+    case BT_PROCEDURE:
       {
        /* Determine type size without clobbering the typespec for ISO C
           binding types.  */
index 9ae516b..22410b5 100644 (file)
@@ -1194,6 +1194,9 @@ gfc_typenode_for_spec (gfc_typespec * spec, int codim)
            basetype = pfunc_type_node;
        }
        break;
+    case BT_PROCEDURE:
+      basetype = pfunc_type_node;
+      break;
     default:
       gcc_unreachable ();
     }
index 2377b1a..3c173b5 100644 (file)
@@ -1,3 +1,9 @@
+2019-03-31  Harald Anlauf  <anlauf@gmx.de>
+
+       PR fortran/83515
+       PR fortran/85797
+       * gfortran.dg/pr85797.f90: New test.
+
 2019-03-31  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        * gcc.dg/attr-aligned-3.c: Enable on *-*-solaris2.*.
diff --git a/gcc/testsuite/gfortran.dg/pr85797.f90 b/gcc/testsuite/gfortran.dg/pr85797.f90
new file mode 100644 (file)
index 0000000..fe6d96d
--- /dev/null
@@ -0,0 +1,33 @@
+! { dg-do compile }
+! { dg-options "-Wall" }
+! PR fortran/83515 - ICE: Invalid expression in gfc_element_size 
+! PR fortran/85797 - ICE in gfc_element_size, at fortran/target-memory.c:126
+
+subroutine a
+  c = transfer (a, b)           ! { dg-warning "Non-RECURSIVE procedure" }
+end
+
+recursive subroutine d
+  c = transfer (d, b)
+end
+
+recursive subroutine e
+  k = transfer (transfer (e, e), 1)
+end
+
+subroutine f
+  use, intrinsic :: iso_c_binding
+  integer(c_intptr_t) :: b, c
+  c = transfer (transfer (b, a), b)
+end
+
+module m
+contains
+  function f () result (z)      ! { dg-warning "Return value" }
+    class(*), pointer :: z
+  end function f
+  recursive subroutine s (q)
+    procedure(f) :: q
+    call s (q)
+  end subroutine s
+end