1! { dg-do run } 2! { dg-options "-Wall" } 3! Program to check corner cases for DO statements. 4program do_1 5 implicit none 6 integer i, j 7 8 ! limit=HUGE(i), step 1 9 j = 0 10 do i = HUGE(i) - 10, HUGE(i), 1 11 j = j + 1 12 end do 13 if (j .ne. 11) call abort 14 ! limit=HUGE(i), step > 1 15 j = 0 16 do i = HUGE(i) - 10, HUGE(i), 2 17 j = j + 1 18 end do 19 if (j .ne. 6) call abort 20 j = 0 21 do i = HUGE(i) - 9, HUGE(i), 2 22 j = j + 1 23 end do 24 if (j .ne. 5) call abort 25 26 ! Same again, but unknown loop step 27 if (test1(10, 1) .ne. 11) call abort 28 if (test1(10, 2) .ne. 6) call abort 29 if (test1(9, 2) .ne. 5) call abort 30 31 ! Zero iterations 32 j = 0 33 do i = 1, 0, 1 ! { dg-warning "executed zero times" } 34 j = j + 1 35 end do 36 if (j .ne. 0) call abort 37 j = 0 38 do i = 1, 0, 2 ! { dg-warning "executed zero times" } 39 j = j + 1 40 end do 41 if (j .ne. 0) call abort 42 j = 0 43 do i = 1, 2, -1 ! { dg-warning "executed zero times" } 44 j = j + 1 45 end do 46 if (j .ne. 0) call abort 47 call test2 (0, 1) 48 call test2 (0, 2) 49 call test2 (2, -1) 50 call test2 (2, -2) 51 52 ! Bound near smallest value 53 j = 0; 54 do i = -HUGE(i), -HUGE(i), 10 55 j = j + 1 56 end do 57 if (j .ne. 1) call abort 58contains 59! Returns the number of iterations performed. 60function test1(r, step) 61 implicit none 62 integer test1, r, step 63 integer k, n 64 k = 0 65 do n = HUGE(n) - r, HUGE(n), step 66 k = k + 1 67 end do 68 test1 = k 69end function 70 71subroutine test2 (lim, step) 72 implicit none 73 integer lim, step 74 integer k, n 75 k = 0 76 do n = 1, lim, step 77 k = k + 1 78 end do 79 if (k .ne. 0) call abort 80end subroutine 81end program 82