The following program should print "19==19", not "19==20".
It is a big switch/case with 'case ranges', whose values are 'unsigned long
long'. It wokrs for most values except the last range.
More details here:
http://groups.google.com/group/gnu.gcc/browse_thread/thread/e48be6e521697259#eacdee661f68b550


#include <stdio.h>

#define BIG_NUM 1000000000000000000ULL
static int foo( unsigned long long aLL )
{
    switch( aLL )
    {
        case BIG_NUM ... 9999999999999999999ULL : return 19 ; 
        default                                 : return 20 ;
    };
};

int main( int argC, const char ** argV )
{
    unsigned long long aLL = BIG_NUM ;

    printf("19 == %d\n", foo( aLL ) );
    return 0 ;
}; 

"this code does produce the value 19
on i686-pc-linux-gnu with gcc 2.95.3, 3.3.6, and 3.4.6,
but the value 20 with gcc 4.0.4, 4.1.2, and 4.2.2. "

It is taken from a sourceforge project:
http://itoa.cvs.sourceforge.net/*checkout*/itoa/itoa/itoa.c?revision=1.1.1.1


-- 
           Summary:  gcc 4.1.1 bug / case ranges / unsigned long long
           Product: gcc
           Version: 4.2.2
            Status: UNCONFIRMED
          Severity: major
          Priority: P3
         Component: c
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: remi dot chateauneu at gmail dot com
 GCC build triplet: i686-pc-linux-gnu
  GCC host triplet: i686-pc-linux-gnu
GCC target triplet: i686-pc-linux-gnu


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

Reply via email to