https://gcc.gnu.org/g:79818220cff77a11d732ab7bff2a327cf8d8e8b6

commit 79818220cff77a11d732ab7bff2a327cf8d8e8b6
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Sat Jan 4 17:43:49 2025 +0100

    Correction régression sizeof_6

Diff:
---
 gcc/fortran/trans-array.cc | 15 ++++++++++++++-
 gcc/fortran/trans-expr.cc  |  5 +++--
 gcc/fortran/trans.h        |  2 +-
 3 files changed, 18 insertions(+), 4 deletions(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index d42575c38485..5d56a12ebf71 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -9901,8 +9901,21 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr, 
bool g77,
          if (maybe_shift && !keep_descriptor_lower_bound (expr))
            conv_shift_descriptor (&block, se->expr, expr->rank);
 
+         bool assumed_rank_fsym;
+         if (fsym
+             && ((fsym->ts.type == BT_CLASS
+                  && CLASS_DATA (fsym)->as
+                  && CLASS_DATA (fsym)->as->type == AS_ASSUMED_RANK)
+                 || (fsym->ts.type != BT_CLASS
+                     && fsym->as
+                     && fsym->as->type == AS_ASSUMED_RANK)))
+           assumed_rank_fsym = true;
+         else
+           assumed_rank_fsym = false;
+
          tmp = gfc_class_data_get (ctree);
-         gfc_copy_sequence_descriptor (block, tmp, se->expr);
+         gfc_copy_sequence_descriptor (block, tmp, se->expr,
+                                       assumed_rank_fsym);
 
          /* Handle optional.  */
          if (fsym && fsym->attr.optional && sym && sym->attr.optional)
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 09a8fc9dd5dd..5dff9692f0ba 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -847,13 +847,14 @@ descriptor_rank (tree descriptor)
 
 
 void
-gfc_copy_sequence_descriptor (stmtblock_t &block, tree lhs_desc, tree rhs_desc)
+gfc_copy_sequence_descriptor (stmtblock_t &block, tree lhs_desc, tree rhs_desc,
+                             bool assumed_rank_lhs)
 {
   int lhs_rank = descriptor_rank (lhs_desc);
   int rhs_rank = descriptor_rank (rhs_desc);
   tree desc;
 
-  if (lhs_rank == rhs_rank)
+  if (assumed_rank_lhs || lhs_rank == rhs_rank)
     desc = rhs_desc;
   else
     {
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index 544cf3fb6497..2ad3a98cf4f6 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -465,7 +465,7 @@ void gfc_finalize_tree_expr (gfc_se *, gfc_symbol *, 
symbol_attribute, int);
 bool gfc_assignment_finalizer_call (gfc_se *, gfc_expr *, bool);
 
 void gfc_class_array_data_assign (stmtblock_t *, tree, tree, bool);
-void gfc_copy_sequence_descriptor (stmtblock_t &, tree, tree);
+void gfc_copy_sequence_descriptor (stmtblock_t &, tree, tree, bool);
 void gfc_conv_derived_to_class (gfc_se *, gfc_expr *, gfc_symbol *fsym, tree,
                                bool, bool, const char *, tree * = nullptr);
 void gfc_conv_class_to_class (gfc_se *, gfc_expr *, gfc_typespec, bool, bool,

Reply via email to