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. */