https://gcc.gnu.org/g:5d3ebfb00d4a5d5de6a1409da314d168a99dd7d5

commit 5d3ebfb00d4a5d5de6a1409da314d168a99dd7d5
Author: Mikael Morin <mik...@gcc.gnu.org>
Date:   Wed Apr 30 12:07:30 2025 +0200

    Correction régression strarray_4

Diff:
---
 gcc/fortran/trans-array.cc |  2 ++
 gcc/fortran/trans-decl.cc  | 17 ++++++++++++++++-
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 748b31059491..f3915526daf3 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -6162,6 +6162,8 @@ gfc_trans_array_bounds (tree type, gfc_symbol * sym, tree 
* poffset,
 
   int dim;
 
+  gfc_trans_vla_type_sizes (sym, pblock);
+
   as = IS_CLASS_COARRAY_OR_ARRAY (sym) ? CLASS_DATA (sym)->as : sym->as;
 
   tree eltype = gfc_get_element_type (type);
diff --git a/gcc/fortran/trans-decl.cc b/gcc/fortran/trans-decl.cc
index 9b91cc29d395..99c53fab755a 100644
--- a/gcc/fortran/trans-decl.cc
+++ b/gcc/fortran/trans-decl.cc
@@ -4391,6 +4391,21 @@ gfc_trans_assign_aux_var (gfc_symbol * sym, 
gfc_wrapped_block * block)
   gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
 }
 
+
+static bool
+decl_ref_or_const_like_p (tree t)
+{
+  if (TREE_CONSTANT (t) || DECL_P (t))
+    return true;
+
+  if (TREE_CODE (t) == SAVE_EXPR
+      || TREE_CODE (t) == NON_LVALUE_EXPR)
+    return decl_ref_or_const_like_p (TREE_OPERAND (t, 0));
+  else
+    return false;
+}
+
+
 static void
 gfc_trans_vla_one_sizepos (tree *tp, tree root_decl, stmtblock_t *body)
 {
@@ -4398,7 +4413,7 @@ gfc_trans_vla_one_sizepos (tree *tp, tree root_decl, 
stmtblock_t *body)
 
   if (t == NULL || t == error_mark_node)
     return;
-  if (TREE_CONSTANT (t) || DECL_P (t))
+  if (decl_ref_or_const_like_p (t))
     return;
 
   if (contains_placeholder_p (t))

Reply via email to