https://gcc.gnu.org/g:598fd0fe2db86016659fad58c8a7f949c81a99ec
commit 598fd0fe2db86016659fad58c8a7f949c81a99ec Author: Mikael Morin <[email protected]> Date: Fri Sep 26 21:12:26 2025 +0200 Correction partielle régression class_result_10.f90 This reverts commit 98cd052e27ffdee2faee26c1f77618091ad5b4c3. Diff: --- gcc/fortran/trans-expr.cc | 4 +++- gcc/fortran/trans.cc | 16 +++++++++------- gcc/fortran/trans.h | 2 +- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index d6130bae5292..c2d5730a9d78 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -671,7 +671,7 @@ gfc_reset_len (stmtblock_t *block, gfc_expr *expr) for expressions other than variables. */ tree -gfc_get_class_from_gfc_expr (gfc_expr *e) +gfc_get_class_from_gfc_expr (gfc_expr *e, stmtblock_t *pre_block) { gfc_expr *class_expr; gfc_se cse; @@ -681,6 +681,8 @@ gfc_get_class_from_gfc_expr (gfc_expr *e) gfc_init_se (&cse, NULL); gfc_conv_expr (&cse, class_expr); gfc_free_expr (class_expr); + if (pre_block) + gfc_add_block_to_block (pre_block, &cse.pre); return cse.expr; } diff --git a/gcc/fortran/trans.cc b/gcc/fortran/trans.cc index 66c0bf28f06b..adb8eea70198 100644 --- a/gcc/fortran/trans.cc +++ b/gcc/fortran/trans.cc @@ -1422,14 +1422,14 @@ gfc_add_finalizer_call (stmtblock_t *block, gfc_expr *expr2, expr->corank = CLASS_DATA (expr2->symtree->n.sym)->as->corank; } - stmtblock_t tmp_block; - gfc_start_block (&tmp_block); - gfc_se final_se; gfc_init_se (&final_se, NULL); get_final_proc_ref (&final_se, expr, class_container); gfc_add_block_to_block (block, &final_se.pre); + stmtblock_t tmp_block; + gfc_start_block (&tmp_block); + gfc_se size_se; gfc_init_se (&size_se, NULL); get_elem_size (&size_se, expr, class_container); @@ -1507,8 +1507,6 @@ gfc_assignment_finalizer_call (gfc_se *lse, gfc_expr *expr1, bool init_flag) gfc_se se; gfc_symbol *sym = expr1->symtree->n.sym; gfc_ref *ref = expr1->ref; - stmtblock_t final_block; - gfc_init_block (&final_block); gfc_expr *finalize_expr; bool class_array_ref; @@ -1544,6 +1542,8 @@ gfc_assignment_finalizer_call (gfc_se *lse, gfc_expr *expr1, bool init_flag) if (!gfc_may_be_finalized (sym->ts)) return false; + stmtblock_t outer_block, final_block; + gfc_start_block (&outer_block); gfc_init_block (&final_block); bool finalizable = gfc_add_finalizer_call (&final_block, finalize_expr); gfc_free_expr (finalize_expr); @@ -1558,7 +1558,7 @@ gfc_assignment_finalizer_call (gfc_se *lse, gfc_expr *expr1, bool init_flag) { if (expr1->ts.type == BT_CLASS) { - ptr = gfc_get_class_from_gfc_expr (expr1); + ptr = gfc_get_class_from_gfc_expr (expr1, &outer_block); gcc_assert (ptr != NULL_TREE); ptr = gfc_class_data_get (ptr); if (lhs_attr.dimension) @@ -1577,6 +1577,7 @@ gfc_assignment_finalizer_call (gfc_se *lse, gfc_expr *expr1, bool init_flag) gfc_conv_expr (&se, expr1); ptr = gfc_build_addr_expr (NULL_TREE, se.expr); } + gfc_add_block_to_block (&outer_block, &se.pre); } cond = fold_build2_loc (input_location, NE_EXPR, logical_type_node, @@ -1597,7 +1598,8 @@ gfc_assignment_finalizer_call (gfc_se *lse, gfc_expr *expr1, bool init_flag) build_empty_stmt (input_location)); } - gfc_add_expr_to_block (&lse->finalblock, final_expr); + gfc_add_expr_to_block (&outer_block, final_expr); + gfc_add_expr_to_block (&lse->finalblock, gfc_finish_block (&outer_block)); return true; } diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h index 1cfe8824fecc..3dda2f2ecb96 100644 --- a/gcc/fortran/trans.h +++ b/gcc/fortran/trans.h @@ -473,7 +473,7 @@ void gfc_reset_vptr (stmtblock_t *, gfc_expr *, tree = NULL_TREE, gfc_symbol * = nullptr); void gfc_class_set_vptr (stmtblock_t *, tree, tree); void gfc_reset_len (stmtblock_t *, gfc_expr *); -tree gfc_get_class_from_gfc_expr (gfc_expr *); +tree gfc_get_class_from_gfc_expr (gfc_expr *, stmtblock_t *pre_block = nullptr); tree gfc_get_class_from_expr (tree); tree gfc_get_vptr_from_expr (tree); tree gfc_copy_class_to_class (tree, tree, tree, bool);
