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 */