! { dg-do run }
|
! { dg-do run }
|
! Program to check corner cases for DO statements.
|
! Program to check corner cases for DO statements.
|
program do_1
|
program do_1
|
implicit none
|
implicit none
|
integer i, j
|
integer i, j
|
|
|
! limit=HUGE(i), step 1
|
! limit=HUGE(i), step 1
|
j = 0
|
j = 0
|
do i = HUGE(i) - 10, HUGE(i), 1
|
do i = HUGE(i) - 10, HUGE(i), 1
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 11) call abort
|
if (j .ne. 11) call abort
|
! limit=HUGE(i), step > 1
|
! limit=HUGE(i), step > 1
|
j = 0
|
j = 0
|
do i = HUGE(i) - 10, HUGE(i), 2
|
do i = HUGE(i) - 10, HUGE(i), 2
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 6) call abort
|
if (j .ne. 6) call abort
|
j = 0
|
j = 0
|
do i = HUGE(i) - 9, HUGE(i), 2
|
do i = HUGE(i) - 9, HUGE(i), 2
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 5) call abort
|
if (j .ne. 5) call abort
|
|
|
! Same again, but unknown loop step
|
! Same again, but unknown loop step
|
if (test1(10, 1) .ne. 11) call abort
|
if (test1(10, 1) .ne. 11) call abort
|
if (test1(10, 2) .ne. 6) call abort
|
if (test1(10, 2) .ne. 6) call abort
|
if (test1(9, 2) .ne. 5) call abort
|
if (test1(9, 2) .ne. 5) call abort
|
|
|
! Zero iterations
|
! Zero iterations
|
j = 0
|
j = 0
|
do i = 1, 0, 1
|
do i = 1, 0, 1
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 0) call abort
|
if (j .ne. 0) call abort
|
j = 0
|
j = 0
|
do i = 1, 0, 2
|
do i = 1, 0, 2
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 0) call abort
|
if (j .ne. 0) call abort
|
j = 0
|
j = 0
|
do i = 1, 2, -1
|
do i = 1, 2, -1
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 0) call abort
|
if (j .ne. 0) call abort
|
call test2 (0, 1)
|
call test2 (0, 1)
|
call test2 (0, 2)
|
call test2 (0, 2)
|
call test2 (2, -1)
|
call test2 (2, -1)
|
call test2 (2, -2)
|
call test2 (2, -2)
|
|
|
! Bound near smallest value
|
! Bound near smallest value
|
j = 0;
|
j = 0;
|
do i = -HUGE(i), -HUGE(i), 10
|
do i = -HUGE(i), -HUGE(i), 10
|
j = j + 1
|
j = j + 1
|
end do
|
end do
|
if (j .ne. 1) call abort
|
if (j .ne. 1) call abort
|
contains
|
contains
|
! Returns the number of iterations performed.
|
! Returns the number of iterations performed.
|
function test1(r, step)
|
function test1(r, step)
|
implicit none
|
implicit none
|
integer test1, r, step
|
integer test1, r, step
|
integer k, n
|
integer k, n
|
k = 0
|
k = 0
|
do n = HUGE(n) - r, HUGE(n), step
|
do n = HUGE(n) - r, HUGE(n), step
|
k = k + 1
|
k = k + 1
|
end do
|
end do
|
test1 = k
|
test1 = k
|
end function
|
end function
|
|
|
subroutine test2 (lim, step)
|
subroutine test2 (lim, step)
|
implicit none
|
implicit none
|
integer lim, step
|
integer lim, step
|
integer k, n
|
integer k, n
|
k = 0
|
k = 0
|
do n = 1, lim, step
|
do n = 1, lim, step
|
k = k + 1
|
k = k + 1
|
end do
|
end do
|
if (k .ne. 0) call abort
|
if (k .ne. 0) call abort
|
end subroutine
|
end subroutine
|
end program
|
end program
|
|
|