[Bug fortran/30146] Redefining do-variable in excecution cycle

dfranke at gcc dot gnu dot org gcc-bugzilla@gcc.gnu.org
Thu Apr 9 16:04:00 GMT 2009



------- Comment #5 from dfranke at gcc dot gnu dot org  2009-04-09 16:03 -------
(In reply to comment #4)
> This of cause fails if you change i. As the program is invalid and as I don't
> see any possibility to fix this in gfortran, I regard the problem of comment 3
> as INVALID/WONTFIX.

In the meantime we got -fwhole-file to check for interface mismatches. The
subroutine sub() in #3 does not specify INTENT for its dummy argument 'i', so
it's INOUT by default. Thus, if this code is compiled with -fwhole-file,
gfortran can/should raise an error?!

 * * *

I'm unsure how to implement this. The check for assignments to the
loop-variable, e.g.
  DO i = 1, ...
    i = <expr>
  END DO
is done during matching, using gfc_state_stack (see parse.c,
gfc_check_do_variable). This is by far too early for argument checking.

Generally, checks for INTENTs are done in interface.c(check_intents), called by
interface.c (gfc_procedure_use). This seems to be the place to add the check
for loop-variables. However, as it is valid to use the same variable as a
loop-variable and not, e.g.
  INTEGER :: i
  CALL set(i, 3)         ! valid
  DO i = ...
    CALL set(i, 3)       ! invalid
  END DO
  CALL set(i, 3)         ! valid
  CONTAINS
    SUBROUTINE set(j, n)
      INTEGER, INTENT(out) :: j
      INTEGER, INTENT(in)  :: n
      j = n
    END SUBROUTINE

we can not unconditionally add an attribute, say, is_loop_variable, to the
symbol of 'i' as it sometimes is not. One could temporarily flag the symbol as
loop-variable in resolve.c (gfc_resolve_iterator), but I'm lost where/how to
reset this flag afterwards.

Thoughts? Pointers?


-- 

dfranke at gcc dot gnu dot org changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |dfranke at gcc dot gnu dot
                   |                            |org


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



More information about the Gcc-bugs mailing list