https://gcc.gnu.org/g:54cd73b0a54be8461d47ba705ea7c4a39ad7dc61
commit 54cd73b0a54be8461d47ba705ea7c4a39ad7dc61 Author: Mikael Morin <mik...@gcc.gnu.org> Date: Fri May 2 15:31:33 2025 +0200 Correction régression class_allocate_19 Diff: --- gcc/fortran/trans-array.cc | 17 +++++++++++++---- gcc/fortran/trans-descriptor.cc | 5 +++-- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index b3c5aff9d303..a5b1c52719b7 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -5512,8 +5512,8 @@ gfc_set_delta (gfc_loopinfo *loop) static tree -descriptor_element_size (tree descriptor, tree expr3_elem_size, - gfc_expr *expr3) +descriptor_element_size (tree descriptor, gfc_typespec *explicit_ts, + tree expr3_elem_size, gfc_expr *expr3) { tree type; tree tmp; @@ -5544,7 +5544,15 @@ descriptor_element_size (tree descriptor, tree expr3_elem_size, } } else - tmp = TYPE_SIZE_UNIT (gfc_get_element_type (type)); + { + tree element_type; + if (explicit_ts) + element_type = gfc_typenode_for_spec (explicit_ts); + else + element_type = gfc_get_element_type (type); + + tmp = TYPE_SIZE_UNIT (element_type); + } /* Convert to size_t. */ return fold_convert (size_type_node, tmp); @@ -5778,7 +5786,8 @@ gfc_array_allocate (gfc_se * se, gfc_expr * expr, tree status, tree errmsg, gfc_init_block (&set_descriptor_block); - element_size = descriptor_element_size (se->expr, expr3_elem_size, expr3); + element_size = descriptor_element_size (se->expr, explicit_ts, + expr3_elem_size, expr3); tree empty_array_cond; /* Take the corank only from the actual ref and not from the coref. The diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 5f40e0e5f8c2..dff7bbb87d83 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -3281,9 +3281,10 @@ gfc_descr_init_count (tree descriptor, int rank, int corank, gfc_expr ** lower, else gfc_conv_descriptor_dtype_set (pblock, descriptor, gfc_get_dtype (type)); + gfc_conv_descriptor_elem_len_set (pblock, descriptor, element_size); + tree empty_cond = logical_false_node; - spacing = gfc_conv_descriptor_elem_len_get (descriptor); - spacing = fold_convert_loc (input_location, gfc_array_index_type, spacing); + spacing = fold_convert_loc (input_location, gfc_array_index_type, element_size); for (n = 0; n < rank; n++) {