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



--- Comment #14 from Dominique d'Humieres <dominiq at lps dot ens.fr> 
2013-02-12 18:21:53 UTC ---

(In reply to comment #13)

> Please also split the testcase - it contains

> several tests and only one has invalid overflow.



Actually there are three of them

(a)



program do_1

  implicit none

  integer i, j



  ! limit=HUGE(i), step 1

  j = 0

  do i = HUGE(i) - 10, HUGE(i), 1

    j = j + 1

  end do

!  print *, i

  if (j .ne. 11) call abort

end program



(b)



program do_1

  implicit none

  integer i, j



  ! limit=HUGE(i), step > 1

  j = 0

  do i = HUGE(i) - 10, HUGE(i), 2

    j = j + 1

  end do

  if (j .ne. 6) call abort

!  print *, i

end program



(c)



program do_1

  implicit none

  integer i, j



  ! limit=HUGE(i), step > 1

  j = 0

  do i = HUGE(i) - 9, HUGE(i), 2

    j = j + 1

  end do

!  print *, i

  if (j .ne. 5) call abort



end program



Only (a) aborts and only if the PRINT is commented. (b) and (c) don't abort

even in the PRINT is uncommented.



Finally I have tested



program do_1

  implicit none

  integer i, j, i1, i2, i3, j1, j2, j3



  ! limit=HUGE(i), step 1

  j = 0

  do i = HUGE(i) - 10, HUGE(i), 1

    j = j + 1

  end do

  i1 = i

  j1 = j

!  if (j .ne. 11) call abort

  ! limit=HUGE(i), step > 1

  j = 0

  do i = HUGE(i) - 10, HUGE(i), 2

    j = j + 1

  end do

  i2 = i

  j2 = j

!  if (j .ne. 6) call abort

  j = 0

  do i = HUGE(i) - 9, HUGE(i), 2

    j = j + 1

  end do

  i3 = i

  j3 = j

!  if (j .ne. 5) call abort



  ! Same again, but unknown loop step

  if (test1(10, 1) .ne. 11) call abort

  if (test1(10, 2) .ne. 6) call abort

  if (test1(9, 2) .ne. 5) call abort



  print *, i3, j3

  if (j3 .ne. 5) call abort

  print *, i2, j2

  if (j2 .ne. 6) call abort

  print *, i1, j1

  if (j1 .ne. 11) call abort

contains

! Returns the number of iterations performed.

function test1(r, step)

  implicit none

  integer test1, r, step

  integer k, n

  k = 0

  do n = HUGE(n) - r, HUGE(n), step

    k = k + 1

  end do

  print *, n, k

  test1 = k

end function



end program



which shows that a contained function is enough to hide the invalid behavior,

which detected for the three loops when put together.

Reply via email to