https://gcc.gnu.org/g:14977e9b3a33fc9c2e5f0073349d66bf7a9e8d28

commit 14977e9b3a33fc9c2e5f0073349d66bf7a9e8d28
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Apr 23 19:33:01 2025 +0200

    Correction régression der_array_3

Diff:
---
 gcc/fortran/trans-array.cc | 11 ++++++-----
 gcc/fortran/trans-array.h  |  2 ++
 gcc/fortran/trans-io.cc    |  2 ++
 3 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index f5b13d9effba..0b0fcb36c8ea 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -4154,12 +4154,13 @@ evaluate_bound (stmtblock_t *block, tree *bounds, 
gfc_expr ** values,
 }
 
 
-static void
-conv_array_lbound_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
+void
+gfc_conv_array_lbound_spacing (stmtblock_t * block, gfc_ss * ss, int dim)
 {
   gfc_array_info *info;
 
-  gcc_assert (ss->info->type == GFC_SS_SECTION);
+  gcc_assert (ss->info->type == GFC_SS_SECTION
+             || ss->info->type == GFC_SS_COMPONENT);
 
   info = &ss->info->data.array;
   tree desc = info->descriptor;
@@ -4511,13 +4512,13 @@ done:
          for (n = 0; n < ss->dimen; n++)
            {
              gfc_conv_section_startstride (&outer_loop->pre, ss, ss->dim[n]);
-             conv_array_lbound_spacing (&outer_loop->pre, ss, ss->dim[n]);
+             gfc_conv_array_lbound_spacing (&outer_loop->pre, ss, ss->dim[n]);
            }
          if (loop->parent == nullptr)
            for (n = 0; n < GFC_MAX_DIMENSIONS; n++)
              if (info->subscript[n]
                  && info->subscript[n]->info->type == GFC_SS_SCALAR)
-               conv_array_lbound_spacing (&outer_loop->pre, ss, n);
+               gfc_conv_array_lbound_spacing (&outer_loop->pre, ss, n);
          break;
 
        case GFC_SS_INTRINSIC:
diff --git a/gcc/fortran/trans-array.h b/gcc/fortran/trans-array.h
index d52c1a859459..5b2c6ecffdb4 100644
--- a/gcc/fortran/trans-array.h
+++ b/gcc/fortran/trans-array.h
@@ -122,6 +122,8 @@ gfc_ss *gfc_get_scalar_ss (gfc_ss *, gfc_expr *);
 
 bool gfc_scalar_elemental_arg_saved_as_reference (gfc_ss_info *);
 
+void gfc_conv_array_lbound_spacing (stmtblock_t *, gfc_ss *, int);
+
 /* Calculates the lower bound and stride of array sections.  */
 void gfc_conv_ss_startstride (gfc_loopinfo *);
 
diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc
index 147aff5f7118..f0f397de45dd 100644
--- a/gcc/fortran/trans-io.cc
+++ b/gcc/fortran/trans-io.cc
@@ -2199,6 +2199,8 @@ transfer_array_component (tree expr, gfc_component * cm, 
locus * where)
                   cm->as->lower[n]->value.integer);
          mpz_add_ui (ss_array->shape[n], ss_array->shape[n], 1);
        }
+
+      gfc_conv_array_lbound_spacing (&block, ss, n);
     }
 
   /* Once we got ss, we use scalarizer to create the loop.  */

Reply via email to