#define is_unsigned(X) ((typeof(X))-1 > 0)
enum u {
U = 1U,
};
_Static_assert(sizeof(enum u) == sizeof(int), "size");
_Static_assert(is_unsigned(enum u), "enum u");
_Static_assert(is_unsigned(U) == 0, "value U");
enum v {
V = __INT_MAX__ + 1U,
};
_Static_assert(sizeof(enum v) == sizeof(int), "size");
_Static_assert(is_unsigned(enum v), "enum v");
_Static_assert(is_unsigned(V) == 1, "value V");
enum w {
W = __LONG_MAX__ + 1UL,
};
_Static_assert(sizeof(enum w) == sizeof(long), "size");
_Static_assert(is_unsigned(enum w), "enum w");
_Static_assert(is_unsigned(W) == 1, "value W");
enum x {
A = 1,
B = 0x100000000UL,
};
_Static_assert(sizeof(enum x) == sizeof(long), "size");
_Static_assert(is_unsigned(enum x), "enum x");
_Static_assert(sizeof(A) == sizeof(int), "size A");
_Static_assert(is_unsigned(A) == 0, "enum A");
_Static_assert(sizeof(B) == sizeof(long), "size B");
_Static_assert(is_unsigned(B) == 1, "enum B");
enum y {
C = 1,
D = 0x100000000L,
};
_Static_assert(sizeof(enum y) == sizeof(long), "size");
_Static_assert(is_unsigned(enum y), "enum y");
_Static_assert(sizeof(C) == sizeof(int), "size C");
_Static_assert(is_unsigned(C) == 0, "enum C");
_Static_assert(sizeof(D) == sizeof(long), "size D");
_Static_assert(is_unsigned(D) == 1, "enum D");