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))