https://gcc.gnu.org/g:1cf83ca57ee19c672c6b385db2e7c0fac3d73de6

commit 1cf83ca57ee19c672c6b385db2e7c0fac3d73de6
Author: Mikael Morin <[email protected]>
Date:   Tue Oct 13 17:31:12 2026 +0200

    Sauvegarde modifs
    
    Correction attribut dimension
    
    Inversion dimension allocatable

Diff:
---
 gcc/fortran/symbol.cc     | 20 +++++++++++++-------
 gcc/fortran/trans-expr.cc |  3 ++-
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/gcc/fortran/symbol.cc b/gcc/fortran/symbol.cc
index 73f0280645d7..5adaba1e734c 100644
--- a/gcc/fortran/symbol.cc
+++ b/gcc/fortran/symbol.cc
@@ -5715,16 +5715,22 @@ gfc_dummy_requires_direct_arg (gfc_symbol *sym)
 {
   return sym->attr.dummy
         && sym->attr.target
-        && sym->attr.dimension
         && !sym->attr.value
         && !sym->attr.contiguous
-        && !sym->attr.pointer
-        && !sym->attr.allocatable
-        && sym->ts.type != BT_CLASS
+        && !IS_POINTER (sym)
         && sym->ts.type != BT_ASSUMED
-        && sym->as
-        && (sym->as->type == AS_ASSUMED_SHAPE
-            || sym->as->type == AS_ASSUMED_RANK);
+        && ((sym->ts.type == BT_CLASS
+             && sym->ts.u.derived->attr.is_class
+             && CLASS_DATA (sym)->attr.dimension
+             && !CLASS_DATA (sym)->attr.allocatable
+             && CLASS_DATA (sym)->as
+             && (CLASS_DATA (sym)->as->type == AS_ASSUMED_SHAPE
+                 || CLASS_DATA (sym)->as->type == AS_ASSUMED_RANK))
+            || (sym->attr.dimension
+                && !sym->attr.allocatable
+                && sym->as
+                && (sym->as->type == AS_ASSUMED_SHAPE
+                    || sym->as->type == AS_ASSUMED_RANK)));
 }
 
 
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 265bc1c02dd2..55c4e326b771 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -7152,7 +7152,8 @@ copy_in_out_allowed (gfc_symbol *fsym, gfc_expr *e, bool 
nodesc_arg)
   if (fsym == NULL || nodesc_arg || gfc_has_vector_subscript (e))
     return true;
 
-  if (gfc_dummy_requires_direct_arg (fsym))
+  if (fsym->ts.type != BT_CLASS
+      && gfc_dummy_requires_direct_arg (fsym))
     return false;
 
   return !(fsym->attr.pointer && !fsym->attr.contiguous && fsym->as

Reply via email to