From: Harald Anlauf Date: Sun, 31 Mar 2019 19:21:37 +0000 (+0000) Subject: backport: re PR fortran/83515 (ICE: Invalid expression in gfc_element_size) X-Git-Tag: releases/gcc-7.5.0~508 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79ee9522004951439518c4f99ac2988ec01c1a5c;p=thirdparty%2Fgcc.git backport: re PR fortran/83515 (ICE: Invalid expression in gfc_element_size) 2019-03-31 Harald Anlauf Backport from trunk 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: r270047 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 03ae0852d418..832f2c75e382 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,13 @@ +2019-03-31 Harald Anlauf + + Backport from trunk + 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-25 Janus Weil PR fortran/71861 diff --git a/gcc/fortran/target-memory.c b/gcc/fortran/target-memory.c index d239cf114e12..f4890aa06c43 100644 --- a/gcc/fortran/target-memory.c +++ b/gcc/fortran/target-memory.c @@ -111,6 +111,7 @@ gfc_element_size (gfc_expr *e) 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 385be8a2c97d..a010cf85d300 100644 --- a/gcc/fortran/trans-types.c +++ b/gcc/fortran/trans-types.c @@ -1157,6 +1157,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 cdcb617ca6a6..d6c7e3b8357b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,10 @@ +2019-03-31 Harald Anlauf + + Backport from trunk + PR fortran/83515 + PR fortran/85797 + * gfortran.dg/pr85797.f90: New test. + 2019-02-26 Richard Biener Backport from mainline diff --git a/gcc/testsuite/gfortran.dg/pr85797.f90 b/gcc/testsuite/gfortran.dg/pr85797.f90 new file mode 100644 index 000000000000..fe6d96d6e304 --- /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