https://gcc.gnu.org/g:b1d55e6ff5b4fdb6795783d640fc874d42f52a34

commit b1d55e6ff5b4fdb6795783d640fc874d42f52a34
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Mon Mar 17 12:24:46 2025 +0100

    Déplacement class_array_data_assign

Diff:
---
 gcc/fortran/trans-descriptor.cc | 43 +++++++++++++++++++++++++++++++++++++++++
 gcc/fortran/trans-descriptor.h  |  2 ++
 gcc/fortran/trans-expr.cc       | 43 -----------------------------------------
 gcc/fortran/trans.h             |  1 -
 4 files changed, 45 insertions(+), 44 deletions(-)

diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index d41e2f079306..f8b2bf93afd7 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -3492,4 +3492,47 @@ gfc_set_contiguous_array (stmtblock_t *block, tree desc, 
tree size,
 }
 
 
+void
+gfc_class_array_data_assign (stmtblock_t *block, tree lhs_desc, tree rhs_desc,
+                            bool)
+{
+  tree tmp, tmp2, type;
+
+  gfc_conv_descriptor_data_set (block, lhs_desc,
+                               gfc_conv_descriptor_data_get (rhs_desc));
+  gfc_conv_descriptor_offset_set (block, lhs_desc,
+                                 gfc_conv_descriptor_offset_get (rhs_desc));
+
+  gfc_conv_descriptor_dtype_set (block, lhs_desc,
+                                gfc_conv_descriptor_dtype_get (rhs_desc));
+
+  /* Assign the dimension as range-ref.  */
+  tmp = gfc_conv_descriptor_dimensions_get (lhs_desc);
+  tmp2 = gfc_conv_descriptor_dimensions_get (rhs_desc);
+
+  int rank = gfc_descriptor_rank (lhs_desc);
+  int rank2 = gfc_descriptor_rank (rhs_desc);
+  if (rank == GFC_MAX_DIMENSIONS && rank2 != GFC_MAX_DIMENSIONS)
+    type = TREE_TYPE (tmp2);
+  else if (rank2 == GFC_MAX_DIMENSIONS && rank != GFC_MAX_DIMENSIONS)
+    type = TREE_TYPE (tmp);
+  else
+    {
+      int corank = GFC_TYPE_ARRAY_CORANK (TREE_TYPE (lhs_desc));
+      int corank2 = GFC_TYPE_ARRAY_CORANK (TREE_TYPE (rhs_desc));
+      if (corank > 0 && corank2 == 0)
+       type = TREE_TYPE (tmp2);
+      else if (corank2 > 0 && corank == 0)
+       type = TREE_TYPE (tmp);
+      else
+       {
+         gcc_assert (TREE_TYPE (tmp) == TREE_TYPE (tmp2));
+         type = TREE_TYPE (tmp);
+       }
+    }
+
+  tmp = gfc_conv_descriptor_dimensions_get (rhs_desc, type);
+  gfc_conv_descriptor_dimensions_set (block, lhs_desc, tmp);
+}
+
 
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 8b404928ab2f..009f6a30a126 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -106,4 +106,6 @@ gfc_copy_descriptor_info (stmtblock_t *, tree, tree, int, 
gfc_ss *);
 void
 gfc_set_contiguous_array (stmtblock_t *block, tree desc, tree size,
                          tree data_ptr);
+void
+gfc_class_array_data_assign (stmtblock_t *, tree, tree, bool);
 
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index a0153918c315..6c44efad5ddf 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -804,49 +804,6 @@ gfc_get_vptr_from_expr (tree expr)
 }
 
 
-void
-gfc_class_array_data_assign (stmtblock_t *block, tree lhs_desc, tree rhs_desc,
-                            bool)
-{
-  tree tmp, tmp2, type;
-
-  gfc_conv_descriptor_data_set (block, lhs_desc,
-                               gfc_conv_descriptor_data_get (rhs_desc));
-  gfc_conv_descriptor_offset_set (block, lhs_desc,
-                                 gfc_conv_descriptor_offset_get (rhs_desc));
-
-  gfc_conv_descriptor_dtype_set (block, lhs_desc,
-                                gfc_conv_descriptor_dtype_get (rhs_desc));
-
-  /* Assign the dimension as range-ref.  */
-  tmp = gfc_conv_descriptor_dimensions_get (lhs_desc);
-  tmp2 = gfc_conv_descriptor_dimensions_get (rhs_desc);
-
-  int rank = gfc_descriptor_rank (lhs_desc);
-  int rank2 = gfc_descriptor_rank (rhs_desc);
-  if (rank == GFC_MAX_DIMENSIONS && rank2 != GFC_MAX_DIMENSIONS)
-    type = TREE_TYPE (tmp2);
-  else if (rank2 == GFC_MAX_DIMENSIONS && rank != GFC_MAX_DIMENSIONS)
-    type = TREE_TYPE (tmp);
-  else
-    {
-      int corank = GFC_TYPE_ARRAY_CORANK (TREE_TYPE (lhs_desc));
-      int corank2 = GFC_TYPE_ARRAY_CORANK (TREE_TYPE (rhs_desc));
-      if (corank > 0 && corank2 == 0)
-       type = TREE_TYPE (tmp2);
-      else if (corank2 > 0 && corank == 0)
-       type = TREE_TYPE (tmp);
-      else
-       {
-         gcc_assert (TREE_TYPE (tmp) == TREE_TYPE (tmp2));
-         type = TREE_TYPE (tmp);
-       }
-    }
-
-  tmp = gfc_conv_descriptor_dimensions_get (rhs_desc, type);
-  gfc_conv_descriptor_dimensions_set (block, lhs_desc, tmp);
-}
-
 /* Takes a derived type expression and returns the address of a temporary
    class object of the 'declared' type.  If opt_vptr_src is not NULL, this is
    used for the temporary class object.
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 1e43760cb708..3a35401355b4 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -463,7 +463,6 @@ bool gfc_add_comp_finalizer_call (stmtblock_t *, tree, 
gfc_component *, bool);
 void gfc_finalize_tree_expr (gfc_se *, gfc_symbol *, symbol_attribute, int);
 bool gfc_assignment_finalizer_call (gfc_se *, gfc_expr *, bool);
 
-void gfc_class_array_data_assign (stmtblock_t *, tree, tree, bool);
 void gfc_conv_remap_descriptor (stmtblock_t *, tree, tree, int, const 
gfc_array_ref &);
 void gfc_conv_derived_to_class (gfc_se *, gfc_expr *, gfc_symbol *fsym, tree,
                                bool, bool, const char *, tree * = nullptr);

Reply via email to