http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50066
Bug #: 50066 Summary: [4.7 Regression] Bad signed long to unsigned long long conversion Classification: Unclassified Product: gcc Version: 4.7.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: middle-end AssignedTo: unassig...@gcc.gnu.org ReportedBy: hjl.to...@gmail.com On Linux/ia32, I got [hjl@gnu-6 gmp-1]$ cat x.c #include <stdio.h> #include <stdlib.h> #include <limits.h> extern unsigned long long foo (long); int main () { unsigned long long val = foo (LONG_MIN); printf ("0x%llx\n", val); if (val != 0x80000000) abort (); return 0; } [hjl@gnu-6 gmp-1]$ cat foo.c unsigned long long foo (signed long int val) { return (unsigned long long) (unsigned long int) (val >= 0 ? val : -val); } [hjl@gnu-6 gmp-1]$ make /export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -m32 -O2 -c -o foo.o foo.c /export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -m32 -O2 -c -o x.o x.c /export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc -B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -m32 -O2 -o x foo.o x.o ./x 0xffffffff80000000 make: *** [all] Aborted (core dumped) [hjl@gnu-6 gmp-1]$