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

             Bug #: 55540
           Summary: The C++ literal -9223372036854775808 is misinterpreted
    Classification: Unclassified
           Product: gcc
           Version: 4.8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassig...@gcc.gnu.org
        ReportedBy: l...@mit.edu


The literal -9223372036854775808LL has type __int128 and says "warning: integer
constant is so large that it is unsigned [enabled by default]".  Both of these
properties of that literal are incorrect, and, for good measure, they are
inconsistent with each other.

This is demonstrated in this C++11 code (for clarity -- a similar test in C++98
would show similar results):

#include <type_traits>
#include <limits>

// Using -9223372036854775807 instead works.

constexpr auto n = -9223372036854775808;
static_assert(n == std::numeric_limits<long long>::min(), "This test passes");

// This line assumes that long is 64-bit.
static_assert(std::is_same<decltype(n), const long>::value, "n has the wrong
type");

template<typename T>
struct what_is_t
{
  static_assert(sizeof(T) != sizeof(T), "This is n's type");
};

what_is_t<decltype(n)> x;


which produces this output:

$ g++-trunk -std=gnu++0x big_negative_literal.cc
big_negative_literal.cc:6:21: warning: integer constant is so large that it is
unsigned [enabled by default]
 constexpr auto n = -9223372036854775808;
                     ^
big_negative_literal.cc:10:1: error: static assertion failed: n has the wrong
type
 static_assert(std::is_same<decltype(n), const long>::value, "n has the wrong
type");
 ^
big_negative_literal.cc: In instantiation of ‘struct what_is_t<const
__int128>’:
big_negative_literal.cc:18:24:   required from here
big_negative_literal.cc:15:3: error: static assertion failed: This is n's type
   static_assert(sizeof(T) != sizeof(T), "This is n's type");
   ^

Quoting from [lex.icon]:

The type of an integer literal is the first of the corresponding list in Table
6 in which its value can be represented.

The first type with this property is long int (if 64-bits) or long long int
(otherwise).

The warning is totally incorrect: the literal may be large, but it both is and
should be *signed*.

Reply via email to