https://gcc.gnu.org/g:1c17ee63e24cabe599e1e627ce9128264cc1c1ae

commit 1c17ee63e24cabe599e1e627ce9128264cc1c1ae
Author: Mikael Morin <[email protected]>
Date:   Sun Jun 21 10:41:22 2026 +0200

    Extraction gfc_copy_assumed_rank_descriptor
    
    Correction compil'

Diff:
---
 gcc/fortran/trans-array.cc      | 20 +-------------------
 gcc/fortran/trans-descriptor.cc | 24 ++++++++++++++++++++++++
 gcc/fortran/trans-descriptor.h  |  1 +
 gcc/fortran/trans-expr.cc       | 26 ++------------------------
 4 files changed, 28 insertions(+), 43 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 4daa28b819a4..b5284f806947 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8380,25 +8380,7 @@ is_pointer (gfc_expr *e)
 void
 gfc_resize_assumed_rank_dim_field (gfc_se *se, stmtblock_t *block, tree desc)
 {
-  tree rank, dim_field, dim_size, copy_size, dst_ptr, src_ptr;
-
-  gfc_conv_descriptor_data_set (block, desc,
-                               gfc_conv_descriptor_data_get (se->expr));
-  gfc_conv_descriptor_offset_set (block, desc,
-                                 gfc_conv_descriptor_offset_get (se->expr));
-  gfc_conv_descriptor_dtype_set (block, desc,
-                                gfc_conv_descriptor_dtype_get (se->expr));
-  rank = fold_convert (size_type_node, gfc_conv_descriptor_rank_get 
(se->expr));
-  dim_field = gfc_get_descriptor_dimension (se->expr);
-  dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dim_field)));
-  copy_size = fold_build2_loc (input_location, MULT_EXPR,
-                              size_type_node, rank, dim_size);
-  dst_ptr = gfc_build_addr_expr (pvoid_type_node,
-                                gfc_get_descriptor_dimension (desc));
-  src_ptr = gfc_build_addr_expr (pvoid_type_node, dim_field);
-  gfc_add_expr_to_block (block, build_call_expr_loc (input_location,
-                        builtin_decl_explicit (BUILT_IN_MEMCPY),
-                        3, dst_ptr, src_ptr, copy_size));
+  gfc_copy_assumed_rank_descriptor (block, desc, se->expr);
 }
 
 /* Convert an array for passing as an actual parameter.  */
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 681570919002..0302edddf1af 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1635,6 +1635,30 @@ gfc_copy_descriptor (stmtblock_t *block, tree dest, tree 
src, tree ptr,
   gfc_conv_descriptor_data_set (block, dest, ptr);
 }
 
+void
+gfc_copy_assumed_rank_descriptor (stmtblock_t *block, tree dest, tree src)
+{
+  tree rank, dim_field, dim_size, copy_size, dst_ptr, src_ptr;
+
+  gfc_conv_descriptor_data_set (block, dest,
+                               gfc_conv_descriptor_data_get (src));
+  gfc_conv_descriptor_offset_set (block, dest,
+                                 gfc_conv_descriptor_offset_get (src));
+  gfc_conv_descriptor_dtype_set (block, dest,
+                                gfc_conv_descriptor_dtype_get (src));
+  rank = fold_convert (size_type_node, gfc_conv_descriptor_rank_get (src));
+  dim_field = gfc_get_descriptor_dimension (src);
+  dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dim_field)));
+  copy_size = fold_build2_loc (input_location, MULT_EXPR,
+                              size_type_node, rank, dim_size);
+  dst_ptr = gfc_build_addr_expr (pvoid_type_node,
+                                gfc_get_descriptor_dimension (dest));
+  src_ptr = gfc_build_addr_expr (pvoid_type_node, dim_field);
+  gfc_add_expr_to_block (block, build_call_expr_loc (input_location,
+                        builtin_decl_explicit (BUILT_IN_MEMCPY),
+                        3, dst_ptr, src_ptr, copy_size));
+}
+
 
 void
 gfc_conv_remap_descriptor (stmtblock_t *block, tree dest, int dest_rank,
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 03073ff649e3..685734dc5805 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -92,6 +92,7 @@ void gfc_copy_sequence_descriptor (stmtblock_t *, tree, tree, 
int);
 void gfc_copy_descriptor (stmtblock_t *, tree, tree, gfc_expr *, bool);
 void gfc_copy_descriptor (stmtblock_t *, tree, tree, tree, int);
 void gfc_copy_descriptor (stmtblock_t *, tree, tree, bool);
+void gfc_copy_assumed_rank_descriptor (stmtblock_t *, tree, tree);
 
 void gfc_conv_remap_descriptor (stmtblock_t *, tree, int, tree, gfc_typespec *,
                                bool, gfc_array_ref *, bool);
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index ce81c4405d52..1d19506ef975 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -926,30 +926,8 @@ gfc_conv_derived_to_class (gfc_se *parmse, gfc_expr *e, 
gfc_symbol *fsym,
                     dtype.rank dims; a full struct assign reads past the end.
                     Copy field-by-field with a runtime-sized dim[] memcpy.
                     PR fortran/60576.  */
-                 tree rank, dim_field, dim_size, copy_size, dst_ptr, src_ptr;
-
-                 gfc_conv_descriptor_data_set
-                   (&block, *derived_array,
-                    gfc_conv_descriptor_data_get (parmse->expr));
-                 gfc_conv_descriptor_offset_set
-                   (&block, *derived_array,
-                    gfc_conv_descriptor_offset_get (parmse->expr));
-                 tree dtype_val = gfc_conv_descriptor_dtype_get (parmse->expr);
-                 gfc_conv_descriptor_dtype_set (&block, *derived_array,
-                                                dtype_val);
-                 rank = gfc_conv_descriptor_rank_get (parmse->expr);
-                 rank = fold_convert (size_type_node, rank);
-                 dim_field = gfc_get_descriptor_dimension (parmse->expr);
-                 dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (dim_field)));
-                 copy_size = fold_build2_loc (input_location, MULT_EXPR,
-                                              size_type_node, rank, dim_size);
-                 dst_ptr = gfc_build_addr_expr
-                   (pvoid_type_node, gfc_get_descriptor_dimension 
(*derived_array));
-                 src_ptr = gfc_build_addr_expr (pvoid_type_node, dim_field);
-                 gfc_add_expr_to_block (&block,
-                     build_call_expr_loc (input_location,
-                                          builtin_decl_explicit 
(BUILT_IN_MEMCPY),
-                                          3, dst_ptr, src_ptr, copy_size));
+                 gfc_copy_assumed_rank_descriptor (&block , *derived_array,
+                                                   parmse->expr);
                }
              else
                gfc_add_modify (&block, *derived_array, parmse->expr);

Reply via email to