aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMikael Morin <mikael@gcc.gnu.org>2023-07-17 14:13:09 +0200
committerMikael Morin <mikael@gcc.gnu.org>2023-07-17 14:13:09 +0200
commit607c841ea427c21c9c502461e5673f1f9113c1d2 (patch)
treeee42e555f3a7a790f9e162a36bc99634aed6a889
parentdee3518b7fed0cba45018bac1e4f4549e6ec69a2 (diff)
downloadgcc-607c841ea427c21c9c502461e5673f1f9113c1d2.zip
gcc-607c841ea427c21c9c502461e5673f1f9113c1d2.tar.gz
gcc-607c841ea427c21c9c502461e5673f1f9113c1d2.tar.bz2
fortran: Outline final procedure pointer evaluation
gcc/fortran/ChangeLog: * trans.cc (get_final_proc_ref): New function. (gfc_build_final_call): Outline the pointer evaluation code to get_final_proc_ref.
-rw-r--r--gcc/fortran/trans.cc27
1 files changed, 21 insertions, 6 deletions
diff --git a/gcc/fortran/trans.cc b/gcc/fortran/trans.cc
index 387d66a..3235476 100644
--- a/gcc/fortran/trans.cc
+++ b/gcc/fortran/trans.cc
@@ -1085,6 +1085,21 @@ gfc_call_free (tree var)
}
+/* Generate the data reference to the finalization procedure pointer passed as
+ argument in FINAL_WRAPPER. */
+
+static void
+get_final_proc_ref (gfc_se *se, gfc_expr *final_wrapper)
+{
+ gcc_assert (final_wrapper->expr_type == EXPR_VARIABLE);
+
+ gfc_conv_expr (se, final_wrapper);
+
+ if (POINTER_TYPE_P (TREE_TYPE (se->expr)))
+ se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
+}
+
+
/* Build a call to a FINAL procedure, which finalizes "var". */
static tree
@@ -1092,19 +1107,19 @@ gfc_build_final_call (gfc_typespec ts, gfc_expr *final_wrapper, gfc_expr *var,
bool fini_coarray, gfc_expr *class_size)
{
stmtblock_t block;
+ gfc_se final_se;
gfc_se se;
tree final_fndecl, array, size, tmp;
symbol_attribute attr;
- gcc_assert (final_wrapper->expr_type == EXPR_VARIABLE);
gcc_assert (var);
gfc_start_block (&block);
- gfc_init_se (&se, NULL);
- gfc_conv_expr (&se, final_wrapper);
- final_fndecl = se.expr;
- if (POINTER_TYPE_P (TREE_TYPE (final_fndecl)))
- final_fndecl = build_fold_indirect_ref_loc (input_location, final_fndecl);
+
+ gfc_init_se (&final_se, NULL);
+ get_final_proc_ref (&final_se, final_wrapper);
+ gfc_add_block_to_block (&block, &final_se.pre);
+ final_fndecl = final_se.expr;
if (ts.type == BT_DERIVED)
{