------- Comment #4 from kargl at gcc dot gnu dot org 2008-12-12 22:58 ------- (In reply to comment #3) > What is about the obsolescent DO related part? Do we need to do > something there > (from F95, B.2): > > "Shared DO termination and termination on a statement other than END DO or > CONTINUE use an END DO or a CONTINUE statement for each DO statement." >
AFAICT, gfortran in resolve.c(resolve_branch) makes no distinction between a block do construct and a nonblock do construct. The issue Harald raised is jumping from some location inside the do-loop to a labeled end-do. Before CYCLE, this was a common way to skip to the end of the loop. I'm surprise that this hasn't come up before. In playing around with various Do---ENDDO and IF---ENDIF constructs, I've found that gfortran considerd ENDDO to be a part of its do block and ENDIF is not part of its if block. I haven't read the standard to determine if these are the correct semantics, but sure looks weird to me. troutmask:sgk[207] cat e.f90 program a i = 1 goto 1 if (i == 1) then i = i + 1 1 end if goto 2 do i = 1, 3 j = i 2 end do end program a troutmask:sgk[208] gfortran43 -c e.f90 e.f90:12.1: 2 end do 1 e.f90:9.8: goto 2 2 Warning: Label at (1) is not in the same block as the GOTO statement at (2) -- http://gcc.gnu.org/bugzilla/show_bug.cgi?id=38507