http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59911
Bug ID: 59911 Summary: Improper warnings when expressing min int64_t as decimal literal. Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c Assignee: unassigned at gcc dot gnu.org Reporter: johngro at google dot com Created attachment 31926 --> http://gcc.gnu.org/bugzilla/attachment.cgi?id=31926&action=edit Simple test case preproc output. When attempting to express the minimum int64 value as a decimal literal, the compiler generates two warning indicating that the literal is too large and is being treated as unsigned. The assignment is permitted, and printf shows that the proper bit pattern is being assigned to the variable, but it is expected that no warning should be produced given a literal value which is in range for its data type. EXPECTED BEHAVIOR Code compiles with no warnings or error. ACTUAL BEHAVIOR The following 2 warnings are produced. warning: integer constant is so large that it is unsigned [enabled by default] warning: this decimal constant is unsigned only in ISO C90 [enabled by default] BASE SOURCE CODE """ #include <stdio.h> #include <stdint.h> int main(int argc, char** argv) { int64_t min_int64 = -9223372036854775808ll; int64_t not_quite_min_int64 = -9223372036854775807ll; int32_t min_int32 = -2147483648; printf("int32_t :: %20d 0x%x\n", min_int32, min_int32); printf("int64_t :: %20ld 0x%lx\n", min_int64, min_int64); printf("int64_t :: %20ld 0x%lx (not quite min)\n", not_quite_min_int64, not_quite_min_int64); } """ (sorry about inlining the .c file into the description; I couldn't figure out how to attach more than one file to the bug without using an archive) COMPILER COMMAND LINE gcc-4.8 /tmp/test_case.c && ./a.out COMPILER OUTPUT /tmp/test_case.c: In function ‘main’: /tmp/test_case.c:5:26: warning: integer constant is so large that it is unsigned [enabled by default] int64_t min_int64 = -9223372036854775808ll; ^ /tmp/test_case.c:5:5: warning: this decimal constant is unsigned only in ISO C90 [enabled by default] int64_t min_int64 = -9223372036854775808ll; ^ PROGRAM OUTPUT int32_t :: -2147483648 0x80000000 int64_t :: -9223372036854775808 0x8000000000000000 int64_t :: -9223372036854775807 0x8000000000000001 (not quite min) SYSTEM/COMPILER INFO (produced with "gcc-4.8 -v -save-temps=obj /tmp/test_case.c") Using built-in specs. COLLECT_GCC=gcc-4.8 COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Ubuntu 4.8.1-2ubuntu1~12.04' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-werror --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.8.1 (Ubuntu 4.8.1-2ubuntu1~12.04) COLLECT_GCC_OPTIONS='-v' '-save-temps=obj' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -E -quiet -v -imultilib . -imultiarch x86_64-linux-gnu /tmp/test_case.c -mtune=generic -march=x86-64 -fpch-preprocess -fstack-protector -o test_case.i ignoring nonexistent directory "/usr/local/include/x86_64-linux-gnu" ignoring nonexistent directory "/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../x86_64-linux-gnu/include" #include "..." search starts here: #include <...> search starts here: /usr/lib/gcc/x86_64-linux-gnu/4.8/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.8/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list. COLLECT_GCC_OPTIONS='-v' '-save-temps=obj' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/4.8/cc1 -fpreprocessed test_case.i -quiet -dumpbase test_case.c -mtune=generic -march=x86-64 -auxbase test_case -version -fstack-protector -o test_case.s GNU C (Ubuntu 4.8.1-2ubuntu1~12.04) version 4.8.1 (x86_64-linux-gnu) compiled by GNU C version 4.8.1, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 GNU C (Ubuntu 4.8.1-2ubuntu1~12.04) version 4.8.1 (x86_64-linux-gnu) compiled by GNU C version 4.8.1, GMP version 5.0.2, MPFR version 3.1.0-p3, MPC version 0.9 GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072 Compiler executable checksum: d26e260d813243f039cec9590f00f3e9 /tmp/test_case.c: In function ‘main’: /tmp/test_case.c:5:26: warning: integer constant is so large that it is unsigned [enabled by default] int64_t min_int64 = -9223372036854775808ll; ^ /tmp/test_case.c:5:5: warning: this decimal constant is unsigned only in ISO C90 [enabled by default] int64_t min_int64 = -9223372036854775808ll; ^ COLLECT_GCC_OPTIONS='-v' '-save-temps=obj' '-mtune=generic' '-march=x86-64' as -v --64 -o test_case.o test_case.s GNU assembler version 2.22 (x86_64-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.22 COMPILER_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/ LIBRARY_PATH=/usr/lib/gcc/x86_64-linux-gnu/4.8/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib/:/lib/x86_64-linux-gnu/:/lib/../lib/:/usr/lib/x86_64-linux-gnu/:/usr/lib/../lib/:/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../:/lib/:/usr/lib/ COLLECT_GCC_OPTIONS='-v' '-save-temps=obj' '-mtune=generic' '-march=x86-64' /usr/lib/gcc/x86_64-linux-gnu/4.8/collect2 --sysroot=/ --build-id --eh-frame-hdr -m elf_x86_64 --hash-style=gnu --as-needed -dynamic-linker /lib64/ld-linux-x86-64.so.2 -z relro /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crt1.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crti.o /usr/lib/gcc/x86_64-linux-gnu/4.8/crtbegin.o -L/usr/lib/gcc/x86_64-linux-gnu/4.8 -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../lib -L/lib/x86_64-linux-gnu -L/lib/../lib -L/usr/lib/x86_64-linux-gnu -L/usr/lib/../lib -L/usr/lib/gcc/x86_64-linux-gnu/4.8/../../.. test_case.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/x86_64-linux-gnu/4.8/crtend.o /usr/lib/gcc/x86_64-linux-gnu/4.8/../../../x86_64-linux-gnu/crtn.o