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 ...