--- Begin Message ---
Package: gfortran
Version: 4:4.7.2-1exp1
Severity: normal
Comparision logic fails between "wrapped around" integers inside an inverted
while loop hack. This occurs only on optimisation level 2 and if the
loop does not have an upper limit.
I encountered this when trying to emperically check the integer
limits. Attached is a small example code and the unexpected output when
compiled with "gfortran -O2 ltbug.f". The last line should read
"( 127 < -128 )= F" and execution should terminate there, but instead
continues indefinitely.
-- System Information:
Debian Release: 7.0
APT prefers unstable
APT policy: (600, 'unstable'), (500, 'testing'), (400, 'stable'), (300, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386
Kernel: Linux 3.6.10.01 (SMP w/4 CPU cores)
Locale: LANG=en_CA.UTF-8, LC_CTYPE=en_CA.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Versions of packages gfortran depends on:
ii cpp 4:4.7.2-1exp1
ii gcc 4:4.7.2-1exp1
ii gfortran-4.7 4.7.2-4
gfortran recommends no packages.
Versions of packages gfortran suggests:
ii gfortran-doc 5:4
pn gfortran-multilib <none>
-- no debconf information
program main
implicit none
integer*1 amax,amin,atmp
integer i
amin=-128
atmp=amin-1
print*,'outside loops, logic is good'
print*,'(',atmp,'<',amin,')=',atmp.lt.amin
print*,'in finite loop, logic is good'
amin=0
do i=1,256
atmp=amin-1
print*,'(',atmp,'<',amin,')=',atmp.lt.amin
if ( atmp .lt. amin) then
amin=atmp
else
goto 100
end if
end do
100 continue
print*,'without loop index, logic is bad'
amin=0
do
atmp=amin-1
print*,'(',atmp,'<',amin,')=',atmp.lt.amin
if ( atmp .lt. amin) then
amin=atmp
else
goto 200
end if
end do
200 continue
stop
end program main
outside loops, logic is good
( 127 < -128 )= F
in finite loop, logic is good
( -1 < 0 )= T
( -2 < -1 )= T
( -3 < -2 )= T
( -4 < -3 )= T
( -5 < -4 )= T
( -6 < -5 )= T
( -7 < -6 )= T
( -8 < -7 )= T
( -9 < -8 )= T
( -10 < -9 )= T
( -11 < -10 )= T
( -12 < -11 )= T
( -13 < -12 )= T
( -14 < -13 )= T
( -15 < -14 )= T
( -16 < -15 )= T
( -17 < -16 )= T
( -18 < -17 )= T
( -19 < -18 )= T
( -20 < -19 )= T
( -21 < -20 )= T
( -22 < -21 )= T
( -23 < -22 )= T
( -24 < -23 )= T
( -25 < -24 )= T
( -26 < -25 )= T
( -27 < -26 )= T
( -28 < -27 )= T
( -29 < -28 )= T
( -30 < -29 )= T
( -31 < -30 )= T
( -32 < -31 )= T
( -33 < -32 )= T
( -34 < -33 )= T
( -35 < -34 )= T
( -36 < -35 )= T
( -37 < -36 )= T
( -38 < -37 )= T
( -39 < -38 )= T
( -40 < -39 )= T
( -41 < -40 )= T
( -42 < -41 )= T
( -43 < -42 )= T
( -44 < -43 )= T
( -45 < -44 )= T
( -46 < -45 )= T
( -47 < -46 )= T
( -48 < -47 )= T
( -49 < -48 )= T
( -50 < -49 )= T
( -51 < -50 )= T
( -52 < -51 )= T
( -53 < -52 )= T
( -54 < -53 )= T
( -55 < -54 )= T
( -56 < -55 )= T
( -57 < -56 )= T
( -58 < -57 )= T
( -59 < -58 )= T
( -60 < -59 )= T
( -61 < -60 )= T
( -62 < -61 )= T
( -63 < -62 )= T
( -64 < -63 )= T
( -65 < -64 )= T
( -66 < -65 )= T
( -67 < -66 )= T
( -68 < -67 )= T
( -69 < -68 )= T
( -70 < -69 )= T
( -71 < -70 )= T
( -72 < -71 )= T
( -73 < -72 )= T
( -74 < -73 )= T
( -75 < -74 )= T
( -76 < -75 )= T
( -77 < -76 )= T
( -78 < -77 )= T
( -79 < -78 )= T
( -80 < -79 )= T
( -81 < -80 )= T
( -82 < -81 )= T
( -83 < -82 )= T
( -84 < -83 )= T
( -85 < -84 )= T
( -86 < -85 )= T
( -87 < -86 )= T
( -88 < -87 )= T
( -89 < -88 )= T
( -90 < -89 )= T
( -91 < -90 )= T
( -92 < -91 )= T
( -93 < -92 )= T
( -94 < -93 )= T
( -95 < -94 )= T
( -96 < -95 )= T
( -97 < -96 )= T
( -98 < -97 )= T
( -99 < -98 )= T
( -100 < -99 )= T
( -101 < -100 )= T
( -102 < -101 )= T
( -103 < -102 )= T
( -104 < -103 )= T
( -105 < -104 )= T
( -106 < -105 )= T
( -107 < -106 )= T
( -108 < -107 )= T
( -109 < -108 )= T
( -110 < -109 )= T
( -111 < -110 )= T
( -112 < -111 )= T
( -113 < -112 )= T
( -114 < -113 )= T
( -115 < -114 )= T
( -116 < -115 )= T
( -117 < -116 )= T
( -118 < -117 )= T
( -119 < -118 )= T
( -120 < -119 )= T
( -121 < -120 )= T
( -122 < -121 )= T
( -123 < -122 )= T
( -124 < -123 )= T
( -125 < -124 )= T
( -126 < -125 )= T
( -127 < -126 )= T
( -128 < -127 )= T
( 127 < -128 )= F
without loop index, logic is bad
( -1 < 0 )= T
( -2 < -1 )= T
( -3 < -2 )= T
( -4 < -3 )= T
( -5 < -4 )= T
( -6 < -5 )= T
( -7 < -6 )= T
( -8 < -7 )= T
( -9 < -8 )= T
( -10 < -9 )= T
( -11 < -10 )= T
( -12 < -11 )= T
( -13 < -12 )= T
( -14 < -13 )= T
( -15 < -14 )= T
( -16 < -15 )= T
( -17 < -16 )= T
( -18 < -17 )= T
( -19 < -18 )= T
( -20 < -19 )= T
( -21 < -20 )= T
( -22 < -21 )= T
( -23 < -22 )= T
( -24 < -23 )= T
( -25 < -24 )= T
( -26 < -25 )= T
( -27 < -26 )= T
( -28 < -27 )= T
( -29 < -28 )= T
( -30 < -29 )= T
( -31 < -30 )= T
( -32 < -31 )= T
( -33 < -32 )= T
( -34 < -33 )= T
( -35 < -34 )= T
( -36 < -35 )= T
( -37 < -36 )= T
( -38 < -37 )= T
( -39 < -38 )= T
( -40 < -39 )= T
( -41 < -40 )= T
( -42 < -41 )= T
( -43 < -42 )= T
( -44 < -43 )= T
( -45 < -44 )= T
( -46 < -45 )= T
( -47 < -46 )= T
( -48 < -47 )= T
( -49 < -48 )= T
( -50 < -49 )= T
( -51 < -50 )= T
( -52 < -51 )= T
( -53 < -52 )= T
( -54 < -53 )= T
( -55 < -54 )= T
( -56 < -55 )= T
( -57 < -56 )= T
( -58 < -57 )= T
( -59 < -58 )= T
( -60 < -59 )= T
( -61 < -60 )= T
( -62 < -61 )= T
( -63 < -62 )= T
( -64 < -63 )= T
( -65 < -64 )= T
( -66 < -65 )= T
( -67 < -66 )= T
( -68 < -67 )= T
( -69 < -68 )= T
( -70 < -69 )= T
( -71 < -70 )= T
( -72 < -71 )= T
( -73 < -72 )= T
( -74 < -73 )= T
( -75 < -74 )= T
( -76 < -75 )= T
( -77 < -76 )= T
( -78 < -77 )= T
( -79 < -78 )= T
( -80 < -79 )= T
( -81 < -80 )= T
( -82 < -81 )= T
( -83 < -82 )= T
( -84 < -83 )= T
( -85 < -84 )= T
( -86 < -85 )= T
( -87 < -86 )= T
( -88 < -87 )= T
( -89 < -88 )= T
( -90 < -89 )= T
( -91 < -90 )= T
( -92 < -91 )= T
( -93 < -92 )= T
( -94 < -93 )= T
( -95 < -94 )= T
( -96 < -95 )= T
( -97 < -96 )= T
( -98 < -97 )= T
( -99 < -98 )= T
( -100 < -99 )= T
( -101 < -100 )= T
( -102 < -101 )= T
( -103 < -102 )= T
( -104 < -103 )= T
( -105 < -104 )= T
( -106 < -105 )= T
( -107 < -106 )= T
( -108 < -107 )= T
( -109 < -108 )= T
( -110 < -109 )= T
( -111 < -110 )= T
( -112 < -111 )= T
( -113 < -112 )= T
( -114 < -113 )= T
( -115 < -114 )= T
( -116 < -115 )= T
( -117 < -116 )= T
( -118 < -117 )= T
( -119 < -118 )= T
( -120 < -119 )= T
( -121 < -120 )= T
( -122 < -121 )= T
( -123 < -122 )= T
( -124 < -123 )= T
( -125 < -124 )= T
( -126 < -125 )= T
( -127 < -126 )= T
( -128 < -127 )= T
( 127 < -128 )= T
...
--- End Message ---