https://gcc.gnu.org/g:84e887425aa1f1fe662032419ba482ca51bfcb3c
commit 84e887425aa1f1fe662032419ba482ca51bfcb3c Author: Mikael Morin <mik...@gcc.gnu.org> Date: Wed May 14 22:23:14 2025 +0200 Correction régression pr117797 Diff: --- gcc/fortran/trans-array.cc | 5 +++++ gcc/fortran/trans-expr.cc | 9 ++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc index a9f7430dbddb..0172bf419a66 100644 --- a/gcc/fortran/trans-array.cc +++ b/gcc/fortran/trans-array.cc @@ -2800,6 +2800,9 @@ gfc_add_loop_ss_code (gfc_loopinfo * loop, gfc_ss * ss, bool subscript, && se.expr && GFC_CLASS_TYPE_P (TREE_TYPE (se.expr))) { + if (!ss->info->class_container + && se.class_container) + ss->info->class_container = se.class_container; tree tmp = gfc_class_data_get (se.expr); info->descriptor = tmp; info->data = gfc_conv_descriptor_data_get (tmp); @@ -3622,6 +3625,8 @@ gfc_conv_scalarized_array_ref (gfc_se * se, gfc_array_ref * ar, bool tmp_array = gfc_array_info *info = &ss->info->data.array; se->expr = build_array_ref_dim (ss, index, info->lbound[ss->dim[n]], info->spacing[ss->dim[n]], tmp_array); + if (ss->info->class_container) + se->class_container = ss->info->class_container; } diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index cc2a817a5df7..fc34084d9238 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -8666,6 +8666,8 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, one is necessary to ensure no memory leakage. */ se->expr = gfc_evaluate_now (se->expr, &se->pre); + se->class_container = se->expr; + /* Finalize the result, if necessary. */ attr = expr->value.function.esym ? CLASS_DATA (expr->value.function.esym->result)->attr @@ -10407,7 +10409,12 @@ trans_class_vptr_len_assignment (stmtblock_t *block, gfc_expr * le, if (!DECL_P (rse->expr)) { if (re->ts.type == BT_CLASS && !GFC_CLASS_TYPE_P (TREE_TYPE (rse->expr))) - class_expr = gfc_get_class_from_expr (rse->expr); + { + if (rse->class_container) + class_expr = rse->class_container; + else + class_expr = gfc_get_class_from_expr (rse->expr); + } if (rse->loop) pre = &rse->loop->pre;