extern int puts(const char *); int main() { signed short ffff8000 = 0xffff8000; if ((unsigned int)ffff8000 >= 0x100000000uLL) { puts("FAIL"); } return 0; }
% gcc --version gcc (GCC) 4.2.4 (Ubuntu 4.2.4-1ubuntu4) Copyright (C) 2007 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. % gcc -w test.c % ./a.out FAIL Also reproduces with gcc-snapshot (Ubuntu 20090125-0ubuntu1) 4.3.3. -- Summary: Bad codegen with signed short cast to unsigned int, then promoted to unsigned long long Product: gcc Version: unknown Status: UNCONFIRMED Severity: normal Priority: P3 Component: c AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: foo at mailinator dot com http://gcc.gnu.org/bugzilla/show_bug.cgi?id=42544