https://gcc.gnu.org/g:783e51bc186d8610d456cf07cf2d480496955027

commit 783e51bc186d8610d456cf07cf2d480496955027
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Jul 23 16:34:39 2025 +0200

    Extraction gfc_copy_sequence_descriptor

Diff:
---
 gcc/fortran/trans-array.cc      | 18 +-----------------
 gcc/fortran/trans-array.h       |  1 +
 gcc/fortran/trans-descriptor.cc | 22 ++++++++++++++++++++++
 gcc/fortran/trans-descriptor.h  |  2 ++
 4 files changed, 26 insertions(+), 17 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 832e8fae8a36..6d291d95df5a 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8801,23 +8801,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, 
bool g77,
              && CLASS_DATA (fsym)->as->type == AS_EXPLICIT && !no_pack)
            {
              tree arr = gfc_create_var (TREE_TYPE (tmp), "parm");
-             gfc_conv_descriptor_data_set (&block, arr,
-                                           gfc_conv_descriptor_data_get (
-                                             se->expr));
-             gfc_conv_descriptor_lbound_set (&block, arr, gfc_index_zero_node,
-                                             gfc_index_zero_node);
-             gfc_conv_descriptor_ubound_set (
-               &block, arr, gfc_index_zero_node,
-               gfc_conv_descriptor_size (se->expr, expr->rank));
-             gfc_conv_descriptor_stride_set (
-               &block, arr, gfc_index_zero_node,
-               gfc_conv_descriptor_stride_get (se->expr, gfc_index_zero_node));
-             tree tmp2 = gfc_conv_descriptor_dtype_get (se->expr);
-             gfc_conv_descriptor_dtype_set (&block, arr, tmp2);
-             gfc_conv_descriptor_rank_set (&block, arr, 1);
-             gfc_conv_descriptor_span_set (&block, arr,
-                                           gfc_conv_descriptor_span_get (arr));
-             gfc_conv_descriptor_offset_set (&block, arr, gfc_index_zero_node);
+             gfc_copy_sequence_descriptor (&block, arr, se->expr, expr->rank);
              se->expr = arr;
            }
          gfc_class_array_data_assign (&block, tmp, se->expr, true);
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index d8f3364a2122..a7de99a5a4a4 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -191,3 +191,4 @@ void gfc_trans_string_copy (stmtblock_t *, tree, tree, int, 
tree, tree, int);
 tree gfc_conv_array_extent_dim (tree, tree, tree*);
 tree gfc_conv_descriptor_size (tree, int);
 tree gfc_conv_descriptor_cosize (tree, int, int);
+
diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc
index 64fed46c7ab2..4a6cca9cc2bb 100644
--- a/gcc/fortran/trans-descriptor.cc
+++ b/gcc/fortran/trans-descriptor.cc
@@ -26,6 +26,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "trans.h"
 #include "trans-const.h"
 #include "trans-types.h"
+#include "trans-array.h"
 
 
 
/******************************************************************************/
@@ -978,3 +979,24 @@ gfc_nullify_descriptor (stmtblock_t *block, tree descr)
 {
   gfc_conv_descriptor_data_set (block, descr, null_pointer_node); 
 }
+
+
+void
+gfc_copy_sequence_descriptor (stmtblock_t *block, tree dest, tree src, int 
rank)
+{
+  gfc_conv_descriptor_data_set (block, dest,
+                               gfc_conv_descriptor_data_get (src));
+  gfc_conv_descriptor_lbound_set (block, dest, gfc_index_zero_node,
+                                 gfc_index_zero_node);
+  gfc_conv_descriptor_ubound_set (block, dest, gfc_index_zero_node,
+                                 gfc_conv_descriptor_size (src, rank));
+  tree stride = gfc_conv_descriptor_stride_get (src, gfc_index_zero_node);
+  gfc_conv_descriptor_stride_set (block, dest, gfc_index_zero_node, stride);
+  gfc_conv_descriptor_dtype_set (block, dest,
+                                gfc_conv_descriptor_dtype_get (src));
+  gfc_conv_descriptor_rank_set (block, dest, 1);
+  gfc_conv_descriptor_span_set (block, dest,
+                               gfc_conv_descriptor_span_get (src));
+  gfc_conv_descriptor_offset_set (block, dest, gfc_index_zero_node);
+}
+
diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h
index 18b1f0109d3a..e5643b310de0 100644
--- a/gcc/fortran/trans-descriptor.h
+++ b/gcc/fortran/trans-descriptor.h
@@ -104,5 +104,7 @@ void gfc_conv_shift_descriptor (stmtblock_t *, tree, int);
 void gfc_conv_shift_descriptor (stmtblock_t *, tree, const gfc_array_ref &);
 /* Build a null array descriptor constructor.  */
 void gfc_nullify_descriptor (stmtblock_t *block, tree);
+void gfc_copy_sequence_descriptor (stmtblock_t *, tree, tree, int);
+
 
 #endif /* GFC_TRANS_DESCRIPTOR_H */

Reply via email to