https://gcc.gnu.org/g:9e2bcd29e32ccb9b57026c6e42b22ca280c57907

commit 9e2bcd29e32ccb9b57026c6e42b22ca280c57907
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat May 17 18:38:46 2025 +0200

    Correction régression class_dummy_7

Diff:
---
 gcc/fortran/trans-array.cc | 16 +++++++++++++++-
 gcc/fortran/trans-decl.cc  |  2 +-
 gcc/fortran/trans-expr.cc  | 17 ++++++++++++-----
 3 files changed, 28 insertions(+), 7 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 0e478e1d3121..569e72563653 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -6281,7 +6281,21 @@ gfc_trans_array_bounds (tree type, gfc_symbol * sym, 
tree * poffset,
   offset = gfc_index_zero_node;
   tree spacing = GFC_TYPE_ARRAY_SPACING (type, 0);
   if (spacing && VAR_P (spacing))
-    gfc_add_modify (pblock, spacing, elem_len);
+    {
+      tree spacing0;
+      if (sym->ts.type == BT_CLASS
+         && DECL_LANG_SPECIFIC (sym->backend_decl)
+         && GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl))
+       {
+         tree class_desc = GFC_DECL_SAVED_DESCRIPTOR (sym->backend_decl);
+         tree array_desc = gfc_class_data_get (class_desc);
+         spacing0 = gfc_conv_array_spacing (array_desc, 0);
+       }
+      else
+       spacing0 = elem_len;
+
+      gfc_add_modify (pblock, spacing, spacing0);
+    }
   for (dim = 0; dim < as->rank; dim++)
     {
       /* Evaluate non-constant array bound expressions.
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 92a0ccdb3588..a16487106046 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -1345,7 +1345,7 @@ gfc_build_dummy_array_decl (gfc_symbol * sym, tree dummy)
         are not repacked.  */
       if (!flag_repack_arrays || sym->attr.target)
        {
-         if (as->type == AS_ASSUMED_SIZE)
+         if (as->type == AS_ASSUMED_SIZE && !is_classarray)
            packed = PACKED_FULL;
        }
       else
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index ba32bd9bfd07..9f0c3211b452 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -3068,13 +3068,20 @@ gfc_maybe_dereference_var (gfc_symbol *sym, tree var, 
bool descriptor_only_p,
   else if (!sym->attr.value)
     {
       /* Dereference temporaries for class array dummy arguments.  */
-      if (sym->attr.dummy && is_classarray
-         && GFC_ARRAY_TYPE_P (TREE_TYPE (var)))
+      if (sym->attr.dummy && is_classarray)
        {
-         if (!descriptor_only_p)
-           var = GFC_DECL_SAVED_DESCRIPTOR (var);
+         bool dereference = false;
+         if (TREE_CODE (TREE_TYPE (var)) == REFERENCE_TYPE)
+           dereference = true;
+         else if (GFC_ARRAY_TYPE_P (TREE_TYPE (var)))
+           {
+             dereference = true;
+             if (!descriptor_only_p)
+               var = GFC_DECL_SAVED_DESCRIPTOR (var);
+           }
 
-         var = build_fold_indirect_ref_loc (input_location, var);
+         if (dereference)
+           var = build_fold_indirect_ref_loc (input_location, var);
        }
 
       /* Dereference non-character scalar dummy arguments.  */

Reply via email to