https://gcc.gnu.org/g:bbccd012b215ee5f8e25e15adf5bd7d7a51e7e74

commit bbccd012b215ee5f8e25e15adf5bd7d7a51e7e74
Author: Mikael Morin <[email protected]>
Date:   Sun Aug 2 11:12:05 2026 +0200

    fortran: array descriptor: Move absent descriptor initialization [PR122521]
    
    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.

Diff:
---
 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 b2ef36070b67..8cee990206e4 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 ca1943fdaea0..79786c32ecdf 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 53cda9cc59aa..406189af1571 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));

Reply via email to