$ cat a.f90 
  integer(kind=1) :: i
  integer(kind=8) :: c = 0

  do i = -huge(i), huge(i), 2
    c = c + 1
  end do
  print *, c
  end
$ gfortran a.f90 && ./a.out
                    0

I think it has to do with the comment on top of gfc_trans_do:

   TODO: Large loop counts
   The code above assumes the loop count fits into a signed integer kind,
   i.e. Does not work for loop counts > 2^31 for integer(kind=4) variables
   We must support the full range.

Actually, I was looking at this code, saw the comment, and designed the
testcase to trigger the bug :)  It doesn't show up using a step of 1, because
in that case we'd go into gfc_trans_simple_do. I think the loop count and other
related quantities should be made unsigned, and the loop count should be
changed from
  count = (to + step - from) / step
to something else that cannot overflow.


-- 
           Summary: Wrong code for do loop with large interation count
           Product: gcc
           Version: 4.3.0
            Status: UNCONFIRMED
          Keywords: wrong-code
          Severity: normal
          Priority: P3
         Component: fortran
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: fxcoudert at gcc dot gnu dot org


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

Reply via email to