https://gcc.gnu.org/g:7c777e483078907481fdd21f49acefdccc6b1184
commit 7c777e483078907481fdd21f49acefdccc6b1184 Author: Mikael Morin <[email protected]> Date: Tue Sep 8 21:16:30 2026 +0200 fortran: Conclude non-pointer in copy-in/copy-out cases Explicitly pass false as `formal_ptr' argument to gfc_conv_subref_array_arg. The function gfc_conv_subref_array_arg implements copy-in/copy-out for argument association. It has a `formal_ptr' argument indicating whether the dummy has the pointer argument. But copy-in/copy-out is used in contexts where we can exclude any pointer dummy, so the argument can be guessed to be false. In this change, every hunk is independant of each other and has a specific context reasoning permitting the replacement of the argument by an explicit false. In gfc_conv_gfc_desc_to_cfi_desc, if the dummy is assumed-size or explicit- shape array, it must not have the pointer attribute (F2023, C834). Otherwise, it is contiguous which for pointers requires the actual argument to be simply contiguous (F2023, C1550). But as the actual argument isn't in the context of the call, the dummy must not have the pointer attribute. In the first gfc_conv_procedure_call hunk, the condition used as argument is explicitly used negated in the guarding condition before. In the two next gfc_conv_procedure_call hunks, the actual argument is polymorphic and associated with a non-polymorphic derived type dummy. But that is explicitly disallowed for pointers, for which same declared type and same polymorphicness are required (F2023, 15.5.2.6). So the dummy must not have the pointer attribute. In the last gfc_conv_procedure_call hunk, the dummy has the contiguous attribute, which for pointers require the actual argument to be simply contiguous (F2023, C1550). But the actual argument isn't, so the dummy must not have the pointer attribute. In the trans_associate_var function, the symbol is an associate name, so it doesn't have the pointer attribute (11.1.3.3). gcc/fortran/ChangeLog: * trans-expr.cc (gfc_conv_gfc_desc_to_cfi_desc, gfc_conv_procedure_call): Explicitly pass false as `formal_ptr' argument to gfc_conv_subref_array_arg. * trans-stmt.cc (trans_associate_var): Likewise. Diff: --- gcc/fortran/trans-expr.cc | 16 ++++++---------- gcc/fortran/trans-stmt.cc | 3 +-- 2 files changed, 7 insertions(+), 12 deletions(-) diff --git a/gcc/fortran/trans-expr.cc b/gcc/fortran/trans-expr.cc index a2b8f12ede36..9ebab8652106 100644 --- a/gcc/fortran/trans-expr.cc +++ b/gcc/fortran/trans-expr.cc @@ -6248,9 +6248,8 @@ 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, - fsym->attr.pointer, fsym, - fsym->ns->proc_name->name, NULL, - /* check_contiguous= */ true); + false, fsym, fsym->ns->proc_name->name, + NULL, /* check_contiguous= */ true); fsym->attr.optional = optional; } else @@ -8323,8 +8322,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, - fsym && fsym->attr.pointer, fsym, sym->name, - NULL, whole_span, false, + false, fsym, sym->name, NULL, whole_span, false, whole_span && dummy_accepts_strided_arg (fsym, nodesc_arg)); @@ -8347,8 +8345,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, - fsym->attr.pointer); + fsym->attr.intent, false); else if (gfc_is_class_array_function (e) && fsym && fsym->ts.type == BT_DERIVED @@ -8359,7 +8356,7 @@ gfc_conv_procedure_call (gfc_se * se, gfc_symbol * sym, { e->must_finalize = 1; gfc_conv_subref_array_arg (&parmse, e, nodesc_arg, - INTENT_IN, fsym->attr.pointer); + INTENT_IN, false); } else if (fsym && fsym->attr.contiguous && (fsym->attr.target @@ -8369,8 +8366,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, - fsym->attr.pointer); + fsym->attr.intent, false); } else { diff --git a/gcc/fortran/trans-stmt.cc b/gcc/fortran/trans-stmt.cc index 2a87176ffa9f..6f515753740e 100644 --- a/gcc/fortran/trans-stmt.cc +++ b/gcc/fortran/trans-stmt.cc @@ -2063,8 +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, - sym && sym->attr.pointer); + gfc_conv_subref_array_arg (&init, e, false, INTENT_INOUT, false); 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),
