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++)
     {

Reply via email to