From: Mikael Morin <[email protected]>
Fortran-tested on aarch64-unknown-linux-gnu. OK for mainline?
-- >8 --
After the previous change, the `formal_ptr' argument of
gfc_conv_subref_array_arg is false everywhere the function is used.
Remove it.
The argument was controling the generation of one-based array descriptor
bounds when the dummy argument had the pointer attribute, which is excluded
in the contexts where the function is used, that is when a copy-in and/or
copy-out of the argument is to be generated. Remove that as well.
gcc/fortran/ChangeLog:
* trans.h (gfc_conv_subref_array_arg): Remove argument formal_ptr.
* trans-expr.cc (gfc_conv_subref_array_arg): Likewise. Remove
code depending on the argument being true.
(gfc_conv_gfc_desc_to_cfi_desc, gfc_conv_procedure_call): Update
callers.
* trans-array.cc (gfc_conv_array_parameter): Likewise.
* trans-io.cc (set_internal_unit, gfc_trans_transfer): Likewise.
* trans-stmt.cc (trans_associate_var,
forall_make_variable_temp): Likewise.
---
gcc/fortran/trans-array.cc | 2 +-
gcc/fortran/trans-expr.cc | 62 ++++++--------------------------------
gcc/fortran/trans-io.cc | 4 +--
gcc/fortran/trans-stmt.cc | 4 +--
gcc/fortran/trans.h | 2 +-
5 files changed, 16 insertions(+), 58 deletions(-)
diff --git a/gcc/fortran/trans-array.cc b/gcc/fortran/trans-array.cc
index 3e3e88012ef..b8bf90680de 100644
--- a/gcc/fortran/trans-array.cc
+++ b/gcc/fortran/trans-array.cc
@@ -9371,7 +9371,7 @@ gfc_conv_array_parameter (gfc_se *se, gfc_expr *expr,
bool g77,
{
gfc_conv_subref_array_arg (se, expr, g77,
fsym ? fsym->attr.intent : INTENT_INOUT,
- false, fsym, proc_name, sym, true);
+ fsym, proc_name, sym, true);
return;
}
diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc
index 9ebab865210..b186033c3fe 100644
--- a/gcc/fortran/trans-expr.cc
+++ b/gcc/fortran/trans-expr.cc
@@ -5555,10 +5555,10 @@ gfc_apply_interface_mapping (gfc_interface_mapping *
mapping,
after the function call. */
void
gfc_conv_subref_array_arg (gfc_se *se, gfc_expr * expr, int g77,
- sym_intent intent, bool formal_ptr,
- const gfc_symbol *fsym, const char *proc_name,
- gfc_symbol *sym, bool check_contiguous,
- bool deep_copy, bool span_only)
+ sym_intent intent, const gfc_symbol *fsym,
+ const char *proc_name, gfc_symbol *sym,
+ bool check_contiguous, bool deep_copy,
+ bool span_only)
{
gfc_se lse;
gfc_se rse;
@@ -5571,7 +5571,6 @@ gfc_conv_subref_array_arg (gfc_se *se, gfc_expr * expr,
int g77,
tree tmp_index;
tree tmp;
tree base_type;
- tree size;
stmtblock_t body;
int n;
int dimen;
@@ -5824,46 +5823,6 @@ class_array_fcn:
if (expr->ts.type == BT_CHARACTER)
parmse->string_length = expr->ts.u.cl->backend_decl;
- /* Determine the offset for pointer formal arguments and set the
- lbounds to one. */
- if (formal_ptr)
- {
- size = gfc_index_one_node;
- offset = gfc_index_zero_node;
- for (n = 0; n < dimen; n++)
- {
- tmp = gfc_conv_descriptor_ubound_get (parmse->expr,
- gfc_rank_cst[n]);
- tmp = fold_build2_loc (input_location, PLUS_EXPR,
- gfc_array_index_type, tmp,
- gfc_index_one_node);
- gfc_conv_descriptor_ubound_set (&parmse->pre,
- parmse->expr,
- gfc_rank_cst[n],
- tmp);
- gfc_conv_descriptor_lbound_set (&parmse->pre,
- parmse->expr,
- gfc_rank_cst[n],
- gfc_index_one_node);
- size = gfc_evaluate_now (size, &parmse->pre);
- offset = fold_build2_loc (input_location, MINUS_EXPR,
- gfc_array_index_type,
- offset, size);
- offset = gfc_evaluate_now (offset, &parmse->pre);
- tmp = fold_build2_loc (input_location, MINUS_EXPR,
- gfc_array_index_type,
- rse.loop->to[n], rse.loop->from[n]);
- tmp = fold_build2_loc (input_location, PLUS_EXPR,
- gfc_array_index_type,
- tmp, gfc_index_one_node);
- size = fold_build2_loc (input_location, MULT_EXPR,
- gfc_array_index_type, size, tmp);
- }
-
- gfc_conv_descriptor_offset_set (&parmse->pre, parmse->expr,
- offset);
- }
-
/* We want either the address for the data or the address of the descriptor,
depending on the mode of passing array arguments. */
if (g77)
@@ -6248,7 +6207,7 @@ gfc_conv_gfc_desc_to_cfi_desc (gfc_se *parmse, gfc_expr
*e, gfc_symbol *fsym)
bool optional = fsym->attr.optional;
fsym->attr.optional = 0;
gfc_conv_subref_array_arg (&se, e, false, fsym->attr.intent,
- false, fsym, fsym->ns->proc_name->name,
+ fsym, fsym->ns->proc_name->name,
NULL, /* check_contiguous= */ true);
fsym->attr.optional = optional;
}
@@ -8301,7 +8260,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
the copy is suppressed and a null pointer passed when an
optional actual argument is absent. */
gfc_conv_subref_array_arg (&parmse, e, nodesc_arg, INTENT_IN,
- false, fsym, sym->name,
+ fsym, sym->name,
e->expr_type == EXPR_VARIABLE
? e->symtree->n.sym : NULL,
false, true);
@@ -8322,7 +8281,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
bool whole_span = is_whole_span_addressed_dummy (e);
gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
fsym ? fsym->attr.intent : INTENT_INOUT,
- false, fsym, sym->name, NULL, whole_span, false,
+ fsym, sym->name, NULL, whole_span, false,
whole_span
&& dummy_accepts_strided_arg (fsym,
nodesc_arg));
@@ -8345,7 +8304,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
is converted to a temporary, which is passed and then
written back after the procedure call. */
gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
- fsym->attr.intent, false);
+ fsym->attr.intent);
else if (gfc_is_class_array_function (e)
&& fsym && fsym->ts.type == BT_DERIVED
@@ -8355,8 +8314,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
intent in. */
{
e->must_finalize = 1;
- gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
- INTENT_IN, false);
+ gfc_conv_subref_array_arg (&parmse, e, nodesc_arg, INTENT_IN);
}
else if (fsym && fsym->attr.contiguous
&& (fsym->attr.target
@@ -8366,7 +8324,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym,
&& e->rank != -1)
{
gfc_conv_subref_array_arg (&parmse, e, nodesc_arg,
- fsym->attr.intent, false);
+ fsym->attr.intent);
}
else
{
diff --git a/gcc/fortran/trans-io.cc b/gcc/fortran/trans-io.cc
index 94a782f3af7..73f5a5ac0dc 100644
--- a/gcc/fortran/trans-io.cc
+++ b/gcc/fortran/trans-io.cc
@@ -944,7 +944,7 @@ set_internal_unit (stmtblock_t * block, stmtblock_t *
post_block,
/* Use a temporary for components of arrays of derived types
or substring array references. */
gfc_conv_subref_array_arg (&se, e, 0,
- last_dt == READ ? INTENT_IN : INTENT_OUT, false);
+ last_dt == READ ? INTENT_IN : INTENT_OUT);
tmp = build_fold_indirect_ref_loc (input_location,
se.expr);
se.expr = gfc_build_addr_expr (pchar_type_node, tmp);
@@ -2697,7 +2697,7 @@ gfc_trans_transfer (gfc_code * code)
if (seen_vector && last_dt == READ)
{
/* Create a temp, read to that and copy it back. */
- gfc_conv_subref_array_arg (&se, expr, 0, INTENT_OUT, false);
+ gfc_conv_subref_array_arg (&se, expr, 0, INTENT_OUT);
tmp = se.expr;
}
else
diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc
index 6f515753740..acdc56a485e 100644
--- a/gcc/fortran/trans-stmt.cc
+++ b/gcc/fortran/trans-stmt.cc
@@ -2063,7 +2063,7 @@ trans_associate_var (gfc_symbol *sym, gfc_wrapped_block
*block)
gfc_se init;
gcc_assert (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (sym->backend_decl)));
gfc_init_se (&init, NULL);
- gfc_conv_subref_array_arg (&init, e, false, INTENT_INOUT, false);
+ gfc_conv_subref_array_arg (&init, e, false, INTENT_INOUT);
init.expr = build_fold_indirect_ref_loc (input_location, init.expr);
gfc_add_modify (&init.pre, sym->backend_decl, init.expr);
gfc_add_init_cleanup (block, gfc_finish_block (&init.pre),
@@ -4157,7 +4157,7 @@ forall_make_variable_temp (gfc_code *c, stmtblock_t *pre,
stmtblock_t *post)
if (old_sym->attr.dimension)
{
gfc_init_se (&tse, NULL);
- gfc_conv_subref_array_arg (&tse, e, 0, INTENT_IN, false);
+ gfc_conv_subref_array_arg (&tse, e, 0, INTENT_IN);
gfc_add_block_to_block (pre, &tse.pre);
gfc_add_block_to_block (post, &tse.post);
tse.expr = build_fold_indirect_ref_loc (input_location, tse.expr);
diff --git a/gcc/fortran/trans.h b/gcc/fortran/trans.h
index bcb466ffe8f..19b49dbf817 100644
--- a/gcc/fortran/trans.h
+++ b/gcc/fortran/trans.h
@@ -560,7 +560,7 @@ int gfc_is_intrinsic_libcall (gfc_expr *);
int gfc_conv_procedure_call (gfc_se *, gfc_symbol *, gfc_actual_arglist *,
gfc_expr *, vec<tree, va_gc> *);
-void gfc_conv_subref_array_arg (gfc_se *, gfc_expr *, int, sym_intent, bool,
+void gfc_conv_subref_array_arg (gfc_se *, gfc_expr *, int, sym_intent,
const gfc_symbol *fsym = NULL,
const char *proc_name = NULL,
gfc_symbol *sym = NULL,
--
2.53.0