https://gcc.gnu.org/g:06c5b3924d3229d56a88922d6a7659779df8614f

commit 06c5b3924d3229d56a88922d6a7659779df8614f
Author: Mikael Morin <[email protected]>
Date:   Sun Sep 20 11:28:17 2026 +0200

    Correction class_result_10

Diff:
---
 gcc/fortran/trans-array.cc | 51 ++++++++++++++++++++++++++--------------------
 1 file changed, 29 insertions(+), 22 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 30d6e7c9f8f5..9e8c770598dc 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -8823,28 +8823,35 @@ gfc_conv_expr_descriptor (gfc_se *se, gfc_expr *expr)
       desc = parm;
     }
 
-  /* For class arrays add the class tree into the saved descriptor to
-     enable getting of _vptr and the like.  */
-  if (expr->expr_type == EXPR_VARIABLE && VAR_P (desc)
-      && IS_CLASS_ARRAY (expr->symtree->n.sym))
-    {
-      gfc_allocate_lang_decl (desc);
-      GFC_DECL_SAVED_DESCRIPTOR (desc) =
-         DECL_LANG_SPECIFIC (expr->symtree->n.sym->backend_decl) ?
-           GFC_DECL_SAVED_DESCRIPTOR (expr->symtree->n.sym->backend_decl)
-         : expr->symtree->n.sym->backend_decl;
-    }
-  else if (expr->expr_type == EXPR_ARRAY && VAR_P (desc)
-          && IS_CLASS_ARRAY (expr))
-    {
-      tree vtype;
-      gfc_allocate_lang_decl (desc);
-      tmp = gfc_create_var (expr->ts.u.derived->backend_decl, "class");
-      GFC_DECL_SAVED_DESCRIPTOR (desc) = tmp;
-      vtype = gfc_class_vptr_get (tmp);
-      gfc_add_modify (&se->pre, vtype,
-                     gfc_build_addr_expr (TREE_TYPE (vtype),
-                                     gfc_find_vtab (&expr->ts)->backend_decl));
+  /* For class arrays set a reference to the class container to enable getting
+     of _vptr and the like.  */
+  if (IS_CLASS_ARRAY (expr))
+    {
+      tree class_ref = NULL_TREE;
+      if (info && info->descriptor
+         && TREE_CODE (info->descriptor) == COMPONENT_REF)
+       class_ref = TREE_OPERAND (info->descriptor, 0);
+      else if (expr->expr_type == EXPR_VARIABLE
+              && IS_CLASS_ARRAY (expr->symtree->n.sym))
+       {
+         if (DECL_P (expr->symtree->n.sym->backend_decl)
+             && GFC_DECL_SAVED_DESCRIPTOR (expr->symtree->n.sym->backend_decl))
+           class_ref = GFC_DECL_SAVED_DESCRIPTOR 
(expr->symtree->n.sym->backend_decl);
+         else
+           class_ref = expr->symtree->n.sym->backend_decl;
+       }
+      else if (expr->expr_type == EXPR_ARRAY)
+       {
+         tree vtype;
+         tmp = gfc_create_var (expr->ts.u.derived->backend_decl, "class");
+         class_ref = tmp;
+         vtype = gfc_class_vptr_get (tmp);
+         gfc_add_modify (&se->pre, vtype,
+                         gfc_build_addr_expr (TREE_TYPE (vtype),
+                                         gfc_find_vtab 
(&expr->ts)->backend_decl));
+       }
+      if (class_ref)
+       se->class_container = class_ref;
     }
   if (!se->direct_byref || se->byref_noassign)
     {

Reply via email to