https://gcc.gnu.org/g:0c73d33178a4179955fd3f26ea628dcebe14ffa2
commit 0c73d33178a4179955fd3f26ea628dcebe14ffa2 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Thu Jul 31 15:19:35 2025 +0200 Déplacemement plus de code gfc_set_pdt_array_descriptor Diff: --- gcc/fortran/trans-array.cc | 19 ++++++++----------- gcc/fortran/trans-descriptor.cc | 8 +++++++- gcc/fortran/trans-descriptor.h | 2 +- 3 files changed, 16 insertions(+), 13 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 25b52b6da60f..1c2c66eeef44 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -10134,24 +10134,21 @@ structure_alloc_comps (gfc_symbol * der_type, tree decl, tree dest, if (c->attr.pdt_array) { - tree nelts = gfc_set_pdt_array_descriptor (&fnblock, comp, c->as, - pdt_param_list); - + tree elt_size; if (c->ts.type == BT_CLASS) { tmp = gfc_get_vptr_from_expr (comp); if (POINTER_TYPE_P (TREE_TYPE (tmp))) tmp = build_fold_indirect_ref_loc (input_location, tmp); - tmp = gfc_vptr_size_get (tmp); + elt_size = gfc_vptr_size_get (tmp); } else - tmp = TYPE_SIZE_UNIT (gfc_get_element_type (ctype)); - tmp = fold_convert (gfc_array_index_type, tmp); - tree size = fold_build2_loc (input_location, MULT_EXPR, - gfc_array_index_type, nelts, tmp); - size = gfc_evaluate_now (size, &fnblock); - tmp = gfc_call_malloc (&fnblock, NULL, size); - gfc_conv_descriptor_data_set (&fnblock, comp, tmp); + elt_size = TYPE_SIZE_UNIT (gfc_get_element_type (ctype)); + elt_size = fold_convert (gfc_array_index_type, elt_size); + + tree size = gfc_set_pdt_array_descriptor (&fnblock, comp, c->as, + pdt_param_list, + elt_size); if (c->initializer && c->initializer->rank) { diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 622358f6a12d..191e90449bb8 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -2389,7 +2389,7 @@ gfc_set_descriptor_for_assign_realloc (stmtblock_t *block, gfc_loopinfo *loop, tree gfc_set_pdt_array_descriptor (stmtblock_t *block, tree descr, gfc_array_spec *as, - gfc_actual_arglist *pdt_param_list) + gfc_actual_arglist *pdt_param_list, tree elt_size) { gfc_se tse; tree size = gfc_index_one_node; @@ -2432,5 +2432,11 @@ gfc_set_pdt_array_descriptor (stmtblock_t *block, tree descr, gfc_conv_descriptor_dtype_set (block, descr, gfc_get_dtype (TREE_TYPE (descr))); + size = fold_build2_loc (input_location, MULT_EXPR, + gfc_array_index_type, size, elt_size); + size = gfc_evaluate_now (size, block); + gfc_conv_descriptor_data_set (block, descr, + gfc_call_malloc (block, NULL, size)); + return size; } diff --git a/gcc/fortran/trans-descriptor.h b/gcc/fortran/trans-descriptor.h index 9f69bdfc3ac8..579cd17bbeb1 100644 --- a/gcc/fortran/trans-descriptor.h +++ b/gcc/fortran/trans-descriptor.h @@ -149,6 +149,6 @@ void gfc_set_descriptor_for_assign_realloc (stmtblock_t *, gfc_loopinfo *, gfc_expr *, gfc_expr *, tree, tree, tree, tree, bool); tree gfc_set_pdt_array_descriptor (stmtblock_t *, tree, gfc_array_spec *, - gfc_actual_arglist *); + gfc_actual_arglist *, tree); #endif /* GFC_TRANS_DESCRIPTOR_H */