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;

Reply via email to