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);