diff options
author | Mikael Morin <mikael@gcc.gnu.org> | 2023-07-17 14:13:09 +0200 |
---|---|---|
committer | Mikael Morin <mikael@gcc.gnu.org> | 2023-07-17 14:13:09 +0200 |
commit | 607c841ea427c21c9c502461e5673f1f9113c1d2 (patch) | |
tree | ee42e555f3a7a790f9e162a36bc99634aed6a889 | |
parent | dee3518b7fed0cba45018bac1e4f4549e6ec69a2 (diff) | |
download | gcc-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.cc | 27 |
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) { |