[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:f9a2c04f902e169d0d59b48ed57bf8a202a8c64d

commit f9a2c04f902e169d0d59b48ed57bf8a202a8c64d
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 9f19f93a2c52..6ec51b3ef9e7 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 ea3f0545208b..2260b8c0bb26 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.