On 07/13/2011 03:46 PM, Tobias Burnus wrote:
On 07/13/2011 03:27 PM, Ian Lance Taylor wrote:
[...]
it doesn't say anything about functions, and in general a call to a
function can change any memory pointed to by any pointer.

I misread the paragraph - in particular the last sentence. In Fortran that's not the case. Fortran alias rules says that a dummy argument may only be modified through the dummy argument, i.e. for

   subroutine foo(a, b)  ! "a" and "b" are passed by reference
     integer :: a, b
     a = 5
     b = 6
     call bar()

the value of "a" is neither modified by "b = 6" nor by "call bar()". Exception: If "a" is a target (i.e. some pointer may point to it) or "a" is a POINTER.

Thus, in my test case, the function call does not may change the value - and, thus, the "if" block can be optimized away.

See quote of the Fortran standard at
  http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49733#c0

Seemingly, in C only the first case, Fortran's "b = 5" (C: "*b = 5"), would be guaranteed to be not affected if "a" (and "b") are "restrict", while the function call can change the value.


In that sense, I do not seem to need a new flags for asynchronous/coarrays - which are handled by TYPE_QUAL_RESTRICT, but I need a new flag for normal (noncoarray, nonasychronous) variables, which are passed by value or are allocatable - and where a function call won't affect the value.

Tobias

Reply via email to