https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61568
Bug ID: 61568 Summary: unscoped enums different types differ from __underlying_type Product: gcc Version: 4.8.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: myriachan at cox dot net If you have an unscoped, unfixed-type enum whose members exist solely within [0...INT_MAX], the enum type is considered "signed int", but the "__underlying_type" intrinsic operator returns "unsigned int". As a result, the following paradoxical C++ code compiles when it should not. (This also occurs if you use type_traits and std::underlying type instead of the intrinsic directly.) This may be a duplicate of bug 58559. template <typename T> struct type_is_unsigned_int { static const bool value = false; }; template <> struct type_is_unsigned_int<unsigned int> { static const bool value = true; }; enum unscoped_unfixed_size_enum { some_enum_name = 0, }; static_assert( static_cast<unscoped_unfixed_size_enum>(-1) < static_cast<unscoped_unfixed_size_enum>(0), "This assert doesn't fire, indicating that the enum is signed."); static_assert( static_cast<__underlying_type(unscoped_unfixed_size_enum)>(-1) > static_cast<__underlying_type(unscoped_unfixed_size_enum)>(0), "But neither does this one! It's inconsistent."); static_assert( type_is_unsigned_int<__underlying_type(unscoped_unfixed_size_enum)>::value, "The exact type in the implementation is, in fact, \"unsigned int\".");