[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