https://gcc.gnu.org/g:adc44bd18c07895123f6752956f417eebcaa5acb

commit adc44bd18c07895123f6752956f417eebcaa5acb
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 ccf8ab9e698e..49be412e609b 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 f2727f2ea071..f4838f2d48c7 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -8652,6 +8652,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
@@ -10393,7 +10395,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;

Reply via email to