[gcc(refs/users/mikael/heads/refactor_descriptor_v291.01)] Extraction gfc_copy_assumed_rank_descriptor

Mikael Morin via Gcc-cvs <[email protected]>
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
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);
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.