https://gcc.gnu.org/g:f1c9ad561bbb5d831ab6edf2b810b29267140380
commit f1c9ad561bbb5d831ab6edf2b810b29267140380 Author: Mikael Morin <[email protected]> Date: Fri Sep 26 21:49:22 2025 +0200 Correction régression pr20257.f90 Diff: --- gcc/fortran/trans-array.cc | 21 +++++++++++++++++++++ gcc/fortran/trans-array.h | 1 + gcc/fortran/trans-descriptor.cc | 9 +++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index 2b770b2cb9b9..776d8de3162e 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -3207,6 +3207,27 @@ gfc_conv_array_stride (tree descriptor, int dim) return tmp; } +/* Get an expression for the array stride. */ + +tree +gfc_conv_array_stride_bytes (tree descriptor, int dim) +{ + tree type; + + type = TREE_TYPE (descriptor); + + tree raw_stride = gfc_conv_array_stride (descriptor, dim); + if (GFC_BYTES_STRIDES_ARRAY_TYPE_P (type)) + return raw_stride; + + tree element_type = gfc_get_element_type (type); + tree elt_size = TYPE_SIZE_UNIT (element_type); + if (elt_size == NULL_TREE) + elt_size = gfc_conv_descriptor_elem_len_get (descriptor); + + return fold_build2_loc (input_location, MULT_EXPR, gfc_array_index_type, + raw_stride, elt_size); +} /* Like gfc_conv_array_stride, but for the lower bound. */ diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h index 5362b4bbee51..0ca42a892197 100644 --- a/gcc/fortran/trans-array.h +++ b/gcc/fortran/trans-array.h @@ -164,6 +164,7 @@ tree gfc_conv_array_data (tree); tree gfc_conv_array_offset (tree); /* Return either an INT_CST or an expression for that part of the descriptor. */ tree gfc_conv_array_stride (tree, int); +tree gfc_conv_array_stride_bytes (tree, int); tree gfc_conv_array_lbound (tree, int); tree gfc_conv_array_ubound (tree, int); diff --git a/gcc/fortran/trans-descriptor.cc b/gcc/fortran/trans-descriptor.cc index 5b684cd0414e..11a2a0627b02 100644 --- a/gcc/fortran/trans-descriptor.cc +++ b/gcc/fortran/trans-descriptor.cc @@ -1849,7 +1849,7 @@ gfc_set_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr, bool subref) { gcc_assert (GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (dest)) - == GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (src))); + || !GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (src))); int ndim = info->ref ? info->ref->u.ar.dimen : rank; @@ -1916,7 +1916,12 @@ gfc_set_descriptor (stmtblock_t *block, tree dest, tree src, gfc_expr *src_expr, for (int n = 0; n < ndim; n++) { - tree stride = gfc_conv_array_stride (src, n); + tree stride; + if (GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (dest)) + == GFC_BYTES_STRIDES_ARRAY_TYPE_P (TREE_TYPE (src))) + stride = gfc_conv_array_stride (src, n); + else + stride = gfc_conv_array_stride_bytes (src, n); /* Work out the 1st element in the section. */ tree start;
