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

Reply via email to