From 93755deb5c26a82106aa63280c492f9bda0679c2 Mon Sep 17 00:00:00 2001 From: Harald Anlauf Date: Sun, 31 Mar 2019 18:33:51 +0000 Subject: [PATCH] re PR fortran/83515 (ICE: Invalid expression in gfc_element_size) 2019-03-31 Harald Anlauf 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 | 9 +++++++++ gcc/fortran/target-memory.c | 1 + gcc/fortran/trans-types.c | 3 +++ gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gfortran.dg/pr85797.f90 | 33 +++++++++++++++++++++++++++++++++ 5 files changed, 52 insertions(+) create mode 100644 gcc/testsuite/gfortran.dg/pr85797.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index e80033a..61eb67b 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2019-03-31 Harald Anlauf + + 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 * dump-parse-tree.c (debug): Add for symbol_attribute *, diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index 09af2a5..1354c57 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -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. */ diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c index 9ae516b..22410b5 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -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 (); } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2377b1a..3c173b5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-03-31 Harald Anlauf + + PR fortran/83515 + PR fortran/85797 + * gfortran.dg/pr85797.f90: New test. + 2019-03-31 Rainer Orth * 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 index 0000000..fe6d96d --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr85797.f90 @@ -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 -- 2.7.4