https://gcc.gnu.org/bugzilla/show_bug.cgi?id=62096
--- Comment #4 from Travis Vitek ---
I believe the underlying type of the unscoped enumeration `E' should be `int'.
According to 7.2 paragraph 7, the underlying type is
.. implementation-defined which integral type is used
as the underlying type except that the underlying
type shall not be larger than int unless the value
of an enumerator cannot fit in an int or unsigned int.
I've modified my test case slightly to verify that it is `int'.
[vitek@sidewinder] 71 % cat t.cpp
#include
enum E {
E_val = 1,
};
enum U {
U_val = 4294967295,
};
inline constexpr E operator~(E e)
{
return E(~static_cast(e));
}
#define DEFINE_DETECT(T) const char* detect(T) { return #T; }
DEFINE_DETECT(bool)
DEFINE_DETECT(char)
DEFINE_DETECT(signed char)
DEFINE_DETECT(unsigned char)
DEFINE_DETECT(wchar_t)
DEFINE_DETECT(short)
DEFINE_DETECT(int)
DEFINE_DETECT(long)
DEFINE_DETECT(long long)
DEFINE_DETECT(unsigned int)
DEFINE_DETECT(unsigned short)
DEFINE_DETECT(unsigned long)
DEFINE_DETECT(unsigned long long)
int main()
{
printf ("%s\n", detect(E_val));
printf ("%s\n", detect(U_val));
int eval = ~E_val;
int uval = ~U_val;
(void) eval;
(void) uval;
}
[vitek@sidewinder] 72 % g++ --pedantic -std=c++11 t.cpp
t.cpp: In function 'int main()':
t.cpp:41:17: warning: overflow in implicit constant conversion [-Woverflow]
int eval = ~E_val;
^
[vitek@sidewinder] 73 % ./a.out
int
unsigned int
[vitek@sidewinder] 74 %
If the underlying type of `E' is `int', then there should be no overflow when
converting back from `E' to `int', right? What am I missing?