From: Mikael Morin <[email protected]>

Fortran-tested on aarch64-unknown-linux-gnu.  OK for mainline?

-- >8 --

Absent assumed shape arguments are represented by array descriptors whose
data pointer field is initialized to null.  Move the code generating that
initialization to its own function in trans-descriptor.cc.

        PR fortran/122521

gcc/fortran/ChangeLog:

        * trans-expr.cc (gfc_conv_derived_to_class): Move absent array
        descriptor initialization ...
        * trans-descriptor.cc (gfc_init_absent_descriptor): ... here as a
        new function.
        * trans-descriptor.h (gfc_init_absent_descriptor): New declaration.
---
 gcc/fortran/trans-descriptor.cc | 10 ++++++++++
 gcc/fortran/trans-descriptor.h  |  1 +
 gcc/fortran/trans-expr.cc       |  5 ++---
 3 files changed, 13 insertions(+), 3 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index b2ef36070b6..8cee990206e 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -736,6 +736,16 @@ gfc_init_result_descriptor (stmtblock_t *block, tree descr)
 }
 
 
+/* Add code to BLOCK initializing array descriptor DESCR so that it represents
+   an absent actual argument associated with an optional dummy.  */
+
+void
+gfc_init_absent_descriptor (stmtblock_t *block, tree descr)
+{
+  gfc_conv_descriptor_data_set (block, descr, null_pointer_node);
+}
+
+
 /* For an array descriptor, get the total number of elements.  This is just
    the product of the extents along from_dim to to_dim.  */
 
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index ca1943fdaea..79786c32ecd 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -65,6 +65,7 @@ tree gfc_build_null_descriptor (tree type);
 
 void gfc_nullify_descriptor (stmtblock_t *block, tree);
 void gfc_init_result_descriptor (stmtblock_t *block, tree descr);
+void gfc_init_absent_descriptor (stmtblock_t *block, tree descr);
 
 tree gfc_conv_descriptor_size (tree, int);
 tree gfc_conv_descriptor_cosize (tree, int, int);
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 53cda9cc59a..406189af157 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -1069,10 +1069,9 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, 
gfc_symbol *fsym,
              tmp = gfc_finish_block (&block);
 
              gfc_init_block (&block);
-             gfc_conv_descriptor_data_set (&block, ctree, null_pointer_node);
+             gfc_init_absent_descriptor (&block, ctree);
              if (derived_array && *derived_array != NULL_TREE)
-               gfc_conv_descriptor_data_set (&block, *derived_array,
-                                             null_pointer_node);
+               gfc_init_absent_descriptor (&block, *derived_array);
 
              tmp = build3_v (COND_EXPR, cond_optional, tmp,
                              gfc_finish_block (&block));
-- 
2.53.0

Reply via email to