https://gcc.gnu.org/g:0c73d33178a4179955fd3f26ea628dcebe14ffa2

commit 0c73d33178a4179955fd3f26ea628dcebe14ffa2
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Thu Jul 31 15:19:35 2025 +0200

    Déplacemement plus de code gfc_set_pdt_array_descriptor

Diff:
---
 gcc/fortran/trans-array.cc      | 19 ++++++++-----------
 gcc/fortran/trans-descriptor.cc |  8 +++++++-
 gcc/fortran/trans-descriptor.h  |  2 +-
 3 files changed, 16 insertions(+), 13 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 25b52b6da60f..1c2c66eeef44 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -10134,24 +10134,21 @@ structure_alloc_comps (gfc_symbol * der_type, tree 
decl, tree dest,
 
          if (c->attr.pdt_array)
            {
-             tree nelts = gfc_set_pdt_array_descriptor (&fnblock, comp, c->as,
-                                                        pdt_param_list);
-
+             tree elt_size;
              if (c->ts.type == BT_CLASS)
                {
                  tmp = gfc_get_vptr_from_expr (comp);
                  if (POINTER_TYPE_P (TREE_TYPE (tmp)))
                    tmp = build_fold_indirect_ref_loc (input_location, tmp);
-                 tmp = gfc_vptr_size_get (tmp);
+                 elt_size = gfc_vptr_size_get (tmp);
                }
              else
-               tmp = TYPE_SIZE_UNIT (gfc_get_element_type (ctype));
-             tmp = fold_convert (gfc_array_index_type, tmp);
-             tree size = fold_build2_loc (input_location, MULT_EXPR,
-                                          gfc_array_index_type, nelts, tmp);
-             size = gfc_evaluate_now (size, &fnblock);
-             tmp = gfc_call_malloc (&fnblock, NULL, size);
-             gfc_conv_descriptor_data_set (&fnblock, comp, tmp);
+               elt_size = TYPE_SIZE_UNIT (gfc_get_element_type (ctype));
+             elt_size = fold_convert (gfc_array_index_type, elt_size);
+
+             tree size = gfc_set_pdt_array_descriptor (&fnblock, comp, c->as,
+                                                       pdt_param_list,
+                                                       elt_size);
 
              if (c->initializer && c->initializer->rank)
                {
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 622358f6a12d..191e90449bb8 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -2389,7 +2389,7 @@ gfc_set_descriptor_for_assign_realloc (stmtblock_t 
*block, gfc_loopinfo *loop,
 tree
 gfc_set_pdt_array_descriptor (stmtblock_t *block, tree descr,
                              gfc_array_spec *as,
-                             gfc_actual_arglist *pdt_param_list)
+                             gfc_actual_arglist *pdt_param_list, tree elt_size)
 {
   gfc_se tse;
   tree size = gfc_index_one_node;
@@ -2432,5 +2432,11 @@ gfc_set_pdt_array_descriptor (stmtblock_t *block, tree 
descr,
   gfc_conv_descriptor_dtype_set (block, descr,
                                 gfc_get_dtype (TREE_TYPE (descr)));
 
+  size = fold_build2_loc (input_location, MULT_EXPR,
+                         gfc_array_index_type, size, elt_size);
+  size = gfc_evaluate_now (size, block);
+  gfc_conv_descriptor_data_set (block, descr,
+                               gfc_call_malloc (block, NULL, size));
+
   return size;
 }
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 9f69bdfc3ac8..579cd17bbeb1 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -149,6 +149,6 @@ void gfc_set_descriptor_for_assign_realloc (stmtblock_t *, 
gfc_loopinfo *,
                                            gfc_expr *, gfc_expr *, tree, tree,
                                            tree, tree, bool);
 tree gfc_set_pdt_array_descriptor (stmtblock_t *, tree, gfc_array_spec *,
-                                  gfc_actual_arglist *);
+                                  gfc_actual_arglist *, tree);
 
 #endif /* GFC_TRANS_DESCRIPTOR_H */

Reply via email to