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

commit af1af2456e8fff63e1b8b7bdf72b37c7a0b831c6
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 e66637de70b8..562aa5c72d34 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -1620,6 +1620,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 947902e83a84..ad385cc645e2 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -90,6 +90,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 bdcf97a82d3c..624d7d5d286e 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.