[Bug fortran/89174] [8/9 Regression] Allocation segfault with CLASS(*) MOLD

tkoenig at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Sun Feb 24 12:31:00 GMT 2019


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89174

--- Comment #10 from Thomas Koenig <tkoenig at gcc dot gnu.org> ---
This seems to work:

Index: trans-expr.c
===================================================================
--- trans-expr.c        (Revision 269161)
+++ trans-expr.c        (Arbeitskopie)
@@ -352,7 +352,7 @@ gfc_vptr_size_get (tree vptr)
    of refs following.  */

 gfc_expr *
-gfc_find_and_cut_at_last_class_ref (gfc_expr *e)
+gfc_find_and_cut_at_last_class_ref (gfc_expr *e, bool is_mold)
 {
   gfc_expr *base_expr;
   gfc_ref *ref, *class_ref, *tail = NULL, *array_ref;
@@ -394,7 +394,10 @@ gfc_expr *
       e->ref = NULL;
     }

-  base_expr = gfc_copy_expr (e);
+  if (is_mold)
+    base_expr = gfc_expr_to_initialize (e);
+  else
+    base_expr = gfc_copy_expr (e);

   /* Restore the original tail expression.  */
   if (class_ref)
Index: trans-stmt.c
===================================================================
--- trans-stmt.c        (Revision 269161)
+++ trans-stmt.c        (Arbeitskopie)
@@ -6641,7 +6641,7 @@ gfc_trans_allocate (gfc_code * code)
          /* Use class_init_assign to initialize expr.  */
          gfc_code *ini;
          ini = gfc_get_code (EXEC_INIT_ASSIGN);
-         ini->expr1 = gfc_find_and_cut_at_last_class_ref (expr);
+         ini->expr1 = gfc_find_and_cut_at_last_class_ref (expr, true);
          tmp = gfc_trans_class_init_assign (ini);
          gfc_free_statements (ini);
          gfc_add_expr_to_block (&block, tmp);
Index: trans.h
===================================================================
--- trans.h     (Revision 269161)
+++ trans.h     (Arbeitskopie)
@@ -412,7 +412,7 @@ tree gfc_class_data_get (tree);
 tree gfc_class_vptr_get (tree);
 tree gfc_class_len_get (tree);
 tree gfc_class_len_or_zero_get (tree);
-gfc_expr * gfc_find_and_cut_at_last_class_ref (gfc_expr *);
+gfc_expr * gfc_find_and_cut_at_last_class_ref (gfc_expr *, bool is_mold =
false);
 /* Get an accessor to the class' vtab's * field, when a class handle is
    available.  */
 tree gfc_class_vtab_hash_get (tree);


More information about the Gcc-bugs mailing list