https://gcc.gnu.org/g:31853d6e1e1d7e7a93f16648600d080b5752a371

commit 31853d6e1e1d7e7a93f16648600d080b5752a371
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Apr 30 12:29:42 2025 +0200

    Correction régression array_assignment_5

Diff:
---
 gcc/fortran/trans-array.cc | 38 +++++++++++++++++++++++++-------------
 1 file changed, 25 insertions(+), 13 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index f3915526daf3..d9cf89cb4ebc 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -2826,22 +2826,34 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, 
bool subscript,
                    && ss_info->expr->ts.type != BT_CLASS)
                  {
                    tree type = gfc_typenode_for_spec (&ss_info->expr->ts);
-                   tree spacing = fold_convert_loc (input_location,
-                                                    gfc_array_index_type, 
-                                                    TYPE_SIZE_UNIT (type));
-                   spacing = gfc_evaluate_now (spacing, &outer_loop->pre);
-
-                   for (n = 0; n < ss_info->expr->rank; n++)
+                   if (TYPE_SIZE_UNIT (type) == NULL_TREE)
+                     {
+                       for (n = 0; n < ss_info->expr->rank; n++)
+                         {
+                           tree spacing = gfc_conv_descriptor_spacing_get 
(info->descriptor,
+                                                                           
gfc_rank_cst[n]);
+                           info->spacing[n] = gfc_evaluate_now (spacing, 
&outer_loop->pre);
+                         }
+                     }
+                   else
                      {
-                       info->spacing[n] = spacing;
+                       tree spacing = fold_convert_loc (input_location,
+                                                        gfc_array_index_type, 
+                                                        TYPE_SIZE_UNIT (type));
+                       spacing = gfc_evaluate_now (spacing, &outer_loop->pre);
 
-                       tree extent = gfc_conv_descriptor_extent_get 
(info->descriptor,
-                                                                     
gfc_rank_cst[n]);
+                       for (n = 0; n < ss_info->expr->rank; n++)
+                         {
+                           info->spacing[n] = spacing;
 
-                       spacing = fold_build2_loc (input_location, MULT_EXPR,
-                                                  gfc_array_index_type, 
spacing,
-                                                  extent);
-                       spacing = gfc_evaluate_now (spacing, &outer_loop->pre);
+                           tree extent = gfc_conv_descriptor_extent_get 
(info->descriptor,
+                                                                         
gfc_rank_cst[n]);
+
+                           spacing = fold_build2_loc (input_location, 
MULT_EXPR,
+                                                      gfc_array_index_type, 
spacing,
+                                                      extent);
+                           spacing = gfc_evaluate_now (spacing, 
&outer_loop->pre);
+                         }
                      }
                  }
              }

Reply via email to