From c287dea0c4a9319979288995e449c09184528a2f Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Fri, 23 Feb 2018 12:35:30 +0000 Subject: [PATCH] re PR fortran/83148 (ICE: crash_signal from toplev.c:325) 2018-02-23 Paul Thomas PR fortran/83148 * trans-const.c : Clean up some whitespace issues. * trans-expr.c (gfc_conv_initializer): If an iso_c_binding derived type has a kind value of zero, set it to the default integer kind. 2018-02-23 Paul Thomas PR fortran/83148 * gfortran.dg/class_68.f90: New test. From-SVN: r257930 --- gcc/fortran/ChangeLog | 8 ++++++++ gcc/fortran/trans-const.c | 16 ++++++++-------- gcc/fortran/trans-expr.c | 2 ++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gfortran.dg/class_68.f90 | 25 +++++++++++++++++++++++++ 5 files changed, 48 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/class_68.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 3b56c37d96f..c26c67f52ce 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-02-23 Paul Thomas + + PR fortran/83148 + * trans-const.c : Clean up some whitespace issues. + * trans-expr.c (gfc_conv_initializer): If an iso_c_binding + derived type has a kind value of zero, set it to the default + integer kind. + 2018-02-23 Janne Blomqvist PR fortran/84519 diff --git a/gcc/fortran/trans-const.c b/gcc/fortran/trans-const.c index 07950dc1ba9..6b4e0de430d 100644 --- a/gcc/fortran/trans-const.c +++ b/gcc/fortran/trans-const.c @@ -133,7 +133,7 @@ gfc_build_localized_cstring_const (const char *msgid) /* Return a string constant with the given length. Used for static - initializers. The constant will be padded or truncated to match + initializers. The constant will be padded or truncated to match length. */ tree @@ -303,7 +303,7 @@ gfc_conv_constant_to_tree (gfc_expr * expr) /* If it is has a prescribed memory representation, we build a string constant and VIEW_CONVERT to its type. */ - + switch (expr->ts.type) { case BT_INTEGER: @@ -389,12 +389,12 @@ gfc_conv_constant (gfc_se * se, gfc_expr * expr) if (expr->ts.type == BT_DERIVED && expr->ts.u.derived && expr->ts.u.derived->attr.is_iso_c) { - if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR - || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR) - { - /* Create a new EXPR_CONSTANT expression for our local uses. */ - expr = gfc_get_int_expr (gfc_default_integer_kind, NULL, 0); - } + if (expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_PTR + || expr->symtree->n.sym->intmod_sym_id == ISOCBINDING_NULL_FUNPTR) + { + /* Create a new EXPR_CONSTANT expression for our local uses. */ + expr = gfc_get_int_expr (gfc_default_integer_kind, NULL, 0); + } } if (expr->expr_type != EXPR_CONSTANT) diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 04e06efbe38..a93257c73bf 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6868,6 +6868,8 @@ gfc_conv_initializer (gfc_expr * expr, gfc_typespec * ts, tree type, /* 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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 62b65bf8e1c..fca98ddd52b 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-02-23 Paul Thomas + + PR fortran/83148 + * gfortran.dg/class_68.f90: New test. + 2018-02-22 Thomas Koenig PR fortran/59781 diff --git a/gcc/testsuite/gfortran.dg/class_68.f90 b/gcc/testsuite/gfortran.dg/class_68.f90 new file mode 100644 index 00000000000..fce30eac197 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/class_68.f90 @@ -0,0 +1,25 @@ +! { dg-do compile } +! +! Test the fix for PR83148. +! +! Contributed by Neil Carlson +! +module fhypre + use iso_c_binding, only: c_ptr, c_null_ptr + use iso_c_binding, only: hypre_obj => c_ptr, hypre_null_obj => c_null_ptr + private + public :: hypre_obj, hypre_null_obj +end module + +module hypre_hybrid_type + use fhypre + type hypre_hybrid + type(hypre_obj) :: solver = hypre_null_obj + end type hypre_hybrid +end module + + use hypre_hybrid_type + class(hypre_hybrid), allocatable :: x + allocate (x) +end + -- 2.30.2