https://gcc.gnu.org/g:271891e8d240a4c8943e97325873ebdd5d20ca6d

commit 271891e8d240a4c8943e97325873ebdd5d20ca6d
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat Aug 9 17:29:22 2025 +0200

    Introduction gfc_create_null_actual_descriptor

Diff:
---
 gcc/fortran/trans-descriptor.cc | 35 +++++++++++++++++++++++++++++++++++
 gcc/fortran/trans-descriptor.h  |  2 ++
 gcc/fortran/trans-expr.cc       | 21 +++++++--------------
 3 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index d2956c9fe3b3..ce039581346d 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -770,3 +770,38 @@ gfc_init_descriptor_variable (stmtblock_t *block, 
gfc_symbol *sym, tree descr)
 {
   return gfc_init_descriptor_variable (block, sym, nullptr, descr);
 }
+
+
+tree
+gfc_create_null_actual_descriptor (stmtblock_t *block, gfc_typespec *ts,
+                                  symbol_attribute attr, int rank)
+{
+  tree etype = gfc_typenode_for_spec (ts);
+
+  enum gfc_array_kind akind;
+
+  if (attr.pointer)
+    akind = GFC_ARRAY_POINTER_CONT;
+  else if (attr.allocatable)
+    akind = GFC_ARRAY_ALLOCATABLE;
+  else
+    akind = GFC_ARRAY_ASSUMED_SHAPE_CONT;
+
+  tree lower[GFC_MAX_DIMENSIONS];
+  tree upper[GFC_MAX_DIMENSIONS];
+  memset (&lower, 0, rank * sizeof (lower[0]));
+  memset (&upper, 0, rank * sizeof (upper[0]));
+
+  tree type = gfc_get_array_type_bounds (etype, 0, 0, lower, upper, 1,
+                                        akind, !(attr.pointer || attr.target));
+  tree desc = gfc_create_var (type, "desc");
+  DECL_ARTIFICIAL (desc) = 1;
+
+  gfc_conv_descriptor_dtype_set (block, desc,
+                                gfc_get_dtype_rank_type (rank, etype));
+  gfc_conv_descriptor_data_set (block, desc, null_pointer_node);
+  gfc_conv_descriptor_span_set (block, desc,
+                               gfc_conv_descriptor_elem_len_get (desc));
+
+  return desc;
+}
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index b323d28b9592..bd205c13b99c 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -97,6 +97,8 @@ void gfc_init_absent_descriptor (stmtblock_t *block, tree 
descr);
 /* Build a null array descriptor constructor.  */
 void gfc_nullify_descriptor (stmtblock_t *block, tree);
 void gfc_init_static_descriptor (tree descr);
+tree gfc_create_null_actual_descriptor (stmtblock_t *, gfc_typespec *,
+                                       symbol_attribute, int);
 
 void gfc_init_descriptor_variable (stmtblock_t *block, gfc_symbol *sym, tree 
descr);
 
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index b5143e535dfd..579c226e5fb4 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -6646,8 +6646,8 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, 
gfc_symbol * fsym)
          if (fsym->as && fsym->as->type == AS_ASSUMED_RANK)
            {
              tree tmp = parmse->expr;
-             tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr);
-             gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank);
+             tmp = gfc_create_null_actual_descriptor (&parmse->pre, &e->ts,
+                                                      fsym->attr, e->rank);
              parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
            }
          else
@@ -6699,26 +6699,19 @@ conv_null_actual (gfc_se * parmse, gfc_expr * e, 
gfc_symbol * fsym)
        {
          tree tmp = parmse->expr;
 
-         tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, gfc_expr_attr (e));
-         gfc_conv_descriptor_rank_set (&parmse->pre, tmp, e->rank);
-         gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node);
+         tmp = gfc_create_null_actual_descriptor (&parmse->pre, &e->ts,
+                                                  fsym->attr, e->rank);
          parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
        }
       else
        /* MOLD is not present.  Use attributes from dummy argument, which is
           not allowed to be assumed-rank.  */
        {
-         int dummy_rank;
          tree tmp = parmse->expr;
 
-         if ((fsym->attr.allocatable || fsym->attr.pointer)
-             && fsym->attr.intent == INTENT_UNKNOWN)
-           fsym->attr.intent = INTENT_IN;
-         tmp = gfc_conv_scalar_to_descriptor (parmse, tmp, fsym->attr);
-         dummy_rank = fsym->as ? fsym->as->rank : 0;
-         if (dummy_rank > 0)
-           gfc_conv_descriptor_rank_set (&parmse->pre, tmp, dummy_rank);
-         gfc_conv_descriptor_data_set (&parmse->pre, tmp, null_pointer_node);
+         int dummy_rank = fsym->as ? fsym->as->rank : 0;
+         tmp = gfc_create_null_actual_descriptor (&parmse->pre, &fsym->ts,
+                                                  fsym->attr, dummy_rank);
          parmse->expr = gfc_build_addr_expr (NULL_TREE, tmp);
        }
     }

Reply via email to