Hi Richard,
On 11/21/19 3:09 PM, Richard Biener wrote:
So I think what you'd need to do is make 'i' marked as TYPE_RESTRICT
then. I think we don't yet handle it but it means that bar() may not
modify 'i' but via 'i' (but it doesn't get 'i' as a parameter).
Okay, that would be then the attached patch. – I can confirm that it
does not work.
Tobias
diff --git a/gcc/fortran/trans-types.c b/gcc/fortran/trans-types.c
index 82666c48bec..2ffb8cf7529 100644
--- a/gcc/fortran/trans-types.c
+++ b/gcc/fortran/trans-types.c
@@ -3056,7 +3056,16 @@ gfc_get_function_type (gfc_symbol * sym, gfc_actual_arglist *actual_args)
type = build_pointer_type (type);
}
else
- type = gfc_sym_type (arg);
+ {
+ type = gfc_sym_type (arg);
+ /* FIXME: There can be some fine tuning, see fine print regarding
+ argument handling in the Fortran standard. Check whether
+ CLASS is handle correctly; check whether something goes wrong
+ if used with asynchronous I/O or ... */
+ if (!arg->attr.target && !arg->attr.pointer
+ && !arg->attr.asynchronous && !arg->attr.codimension)
+ type = build_qualified_type (type, TYPE_QUAL_RESTRICT);
+ }
/* Parameter Passing Convention
real function foo(i, y)
implicit none (type, external)
interface
subroutine print_i(i); integer, intent(in) :: i; end
subroutine bar(); end
end interface
integer :: i
real :: y
foo = 0.0
call print_i(i)
i = 5
call bar() ! < this prevents optimizing the sin(y) away
if (i == 5) return
foo = sin(y)
end