re PR fortran/83148 (ICE: crash_signal from toplev.c:325)
authorPaul Thomas <pault@gcc.gnu.org>
Fri, 23 Feb 2018 12:35:30 +0000 (12:35 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Fri, 23 Feb 2018 12:35:30 +0000 (12:35 +0000)
2018-02-23  Paul Thomas  <pault@gcc.gnu.org>

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  <pault@gcc.gnu.org>

PR fortran/83148
* gfortran.dg/class_68.f90: New test.

From-SVN: r257930

gcc/fortran/ChangeLog
gcc/fortran/trans-const.c
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/class_68.f90 [new file with mode: 0644]

index 3b56c37d96f17a6f5c333fb42351e0be76358941..c26c67f52ce84af303438147b75d954146c98065 100644 (file)
@@ -1,3 +1,11 @@
+2018-02-23  Paul Thomas  <pault@gcc.gnu.org>
+
+       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  <jb@gcc.gnu.org>
 
        PR fortran/84519
index 07950dc1ba9a25c275fa3cf4ce759e2bcdfce6c9..6b4e0de430decdfb0399f02b5e0969c256af703e 100644 (file)
@@ -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)
index 04e06efbe38b17f8b7c17500e6cf27d4a0ee455a..a93257c73bfd17f3c22360bc3154df865a22ec92 100644 (file)
@@ -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;
 
index 62b65bf8e1c3ead8095ed552cb7e135d1d517813..fca98ddd52b5821f36bade299e7048689bdc655a 100644 (file)
@@ -1,3 +1,8 @@
+2018-02-23  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/83148
+       * gfortran.dg/class_68.f90: New test.
+
 2018-02-22  Thomas Koenig  <tkoenig@gcc.gnu.org>
 
        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 (file)
index 0000000..fce30ea
--- /dev/null
@@ -0,0 +1,25 @@
+! { dg-do compile }
+!
+! Test the fix for PR83148.
+!
+! Contributed by Neil Carlson  <neil.n.carlson@gmail.com>
+!
+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
+