From eb4a91451a293020a497e5dc1d41667af8b16eea Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 8 Jan 2019 10:46:04 +0000 Subject: [PATCH] re PR fortran/88611 (ICE in eliminate_stmt, at tree-ssa-sccvn.c:5011) 2019-01-08 Richard Biener PR fortran/88611 * trans-expr.c (gfc_conv_initializer): For ISOCBINDING_NULL_* directly build the expected GENERIC tree. * gfortran.dg/pr88611.f90: New testcase. From-SVN: r267721 --- gcc/fortran/ChangeLog | 6 ++++++ gcc/fortran/trans-expr.c | 19 ++++++------------- gcc/testsuite/ChangeLog | 6 ++++++ gcc/testsuite/gfortran.dg/pr88611.f90 | 14 ++++++++++++++ 4 files changed, 32 insertions(+), 13 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/pr88611.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ba95a26e6ae..73d47da9832 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2019-01-08 Richard Biener + + PR fortran/88611 + * trans-expr.c (gfc_conv_initializer): For ISOCBINDING_NULL_* + directly build the expected GENERIC tree. + 2019-01-07 Thomas Koenig Harald Anlauf Tobias Burnus diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 27eb2d2ee38..c45752e516a 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -7086,19 +7086,12 @@ gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type, if (expr != NULL && expr->ts.type == BT_DERIVED && expr->ts.is_iso_c && expr->ts.u.derived) { - gfc_symbol *derived = expr->ts.u.derived; - - /* The derived symbol has already been converted to a (void *). Use - its kind. */ - if (derived->ts.kind == 0) - derived->ts.kind = gfc_default_integer_kind; - expr = gfc_get_int_expr (derived->ts.kind, NULL, 0); - expr->ts.f90_type = derived->ts.f90_type; - - gfc_init_se (&se, NULL); - gfc_conv_constant (&se, expr); - gcc_assert (TREE_CODE (se.expr) != CONSTRUCTOR); - return se.expr; + if (TREE_CODE (type) == ARRAY_TYPE) + return build_constructor (type, NULL); + else if (POINTER_TYPE_P (type)) + return build_int_cst (type, 0); + else + gcc_unreachable (); } if (array && !procptr) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 14a59446eb3..ff3e09dd9ad 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2019-01-08 Richard Biener + + PR fortran/88611 + * trans-expr.c (gfc_conv_initializer): For ISOCBINDING_NULL_* + directly build the expected GENERIC tree. + 2019-01-08 Sam Tebbs * gcc.target/aarch64/(return_address_sign_1.c, diff --git a/gcc/testsuite/gfortran.dg/pr88611.f90 b/gcc/testsuite/gfortran.dg/pr88611.f90 new file mode 100644 index 00000000000..9847bc3c897 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/pr88611.f90 @@ -0,0 +1,14 @@ +! { dg-do run } +! { dg-options "-fdefault-integer-8 -fno-tree-forwprop -O3 -fno-tree-ccp" } +! PR 82869 +! A temp variable of type logical was incorrectly transferred +! to the I/O library as a logical type of a different kind. +program pr82869_8 + use, intrinsic :: iso_c_binding + type(c_ptr) :: p = c_null_ptr + character(len=4) :: s + write (s, *) c_associated(p), c_associated(c_null_ptr) + if (s /= ' F F') then + STOP 1 + end if +end program pr82869_8 -- 2.30.2