http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49733

--- Comment #4 from Tobias Burnus <burnus at gcc dot gnu.org> 2011-07-13 
14:42:43 UTC ---
(In reply to comment #3)
> is
[...]
> invalid then?

Yes, the does not even have the correct syntax. I assume you means something
like:

module m
  integer :: global
end module m

program main
  use m
  implicit none
  call test(global)
contains
  subroutine mod_global()
    global = 7
  end subroutine mod_global
  subroutine mod2(y)
    integer :: y
    y = 9
  end subroutine mod2
  subroutine test(x)
    integer :: x
    x = 5
    call mod_global() ! Invalid, modifies "x"
    global = 8  ! Also invalid
    call mod2(global) ! Ditto.
    print *, x  ! May print 5, 7, 8, 9, or other garbage
  end subroutine
end program main

 ! or even
 ! sub (non_aliasing_var)
   if (non_aliasing_var /= 5) call foobar()

Well, "call sub (non_aliasing_var)" *may* modify "non_aliasing_var" - but it
may not modify a global variable directly, if it is associated with the actual
argument.

(And for recursion: That's only allowed if the procedure is marked as
RECURSIVE.)


As written, the Fortran standard states (quote in comment 0):

If A is used as actual argument to the dummy argument D then:

a) Anything which *modifies* "A" should only be done by using explicitly "D",
unless "D" is a POINTER or "D" has the TARGET attribute (and some other
conditions).

b) Anything which *reads* "A": If the value is modified through "D", only "D"
may be used to access the value. (With same exceptions for TARGET and POINTER -
and, of course, only applying until the function with the dummy "D" returns).

Reply via email to