[patch, rfc] Clobber scalar intent(out) variables on entry
Thomas König
tk@tkoenig.net
Thu Sep 20 19:29:00 GMT 2018
Hi,
the patch below tries to clobber scalar intent(out) arguments
on procedure entry.
Index: trans-decl.c
===================================================================
--- trans-decl.c (Revision 264423)
+++ trans-decl.c (Arbeitskopie)
@@ -4143,6 +4143,19 @@ init_intent_out_dt (gfc_symbol * proc_sym, gfc_wra
gfc_add_expr_to_block (&init, tmp);
}
+ else if (f->sym->attr.dummy && !f->sym->attr.dimension
+ && f->sym->attr.intent == INTENT_OUT
+ && !f->sym->attr.codimension && !f->sym->attr.allocatable
+ && (f->sym->ts.type != BT_CLASS
+ || (!CLASS_DATA (f->sym)->attr.dimension
+ && !(CLASS_DATA (f->sym)->attr.codimension
+ && CLASS_DATA (f->sym)->attr.allocatable))))
+ {
+ tree t1, t2;
+ t1 = build_fold_indirect_ref_loc (input_location,
f->sym->backend_decl);
+ t2 = build_clobber (TREE_TYPE (t1));
+ gfc_add_modify (&init, t1, t2);
+ }
gfc_add_init_cleanup (block, gfc_finish_block (&init), NULL_TREE);
}
With this patch,
module x
contains
subroutine foo(a)
real, intent(out) :: a
a = 21.
a = a + 22.
end subroutine foo
end module x
generates, with -fdump-tree-original
foo (real(kind=4) & restrict a)
{
*a = {CLOBBER};
*a = 2.1e+1;
*a = *a + 2.2e+1;
}
Is this the right way to proceed?
(The if statement is not yet correct, so this version causes
regressions, that would have to be adjusted).
Regards
Thomas
More information about the Fortran
mailing list