enum-sign-gcc.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. // For enum's underlying/compatible type:
  2. // std C: unspecified
  3. // GCC: 'unsigned int' if no negative values,
  4. // otherwise 'int' (see GCC manul 4.9).
  5. // But also accept ulong, long
  6. // For the type of the enumerators:
  7. // std C: 'int'
  8. // GCC: 'int' if the value fit in a 'int'
  9. // otherwise same as the enum underlying type?
  10. //
  11. // The following tests match GCC's choices
  12. #define is_unsigned(X) ((typeof(X))-1 > 0)
  13. enum u {
  14. U = 1U, // fit in 'int'
  15. // no negatives
  16. };
  17. _Static_assert(sizeof(enum u) == sizeof(int), "size");
  18. _Static_assert(is_unsigned(enum u), "enum u");
  19. _Static_assert(is_unsigned(U) == 0, "value U"); // fail
  20. enum v {
  21. V = __INT_MAX__ + 1U, // doesn't fit in 'int'
  22. // no negatives
  23. };
  24. _Static_assert(sizeof(enum v) == sizeof(int), "size");
  25. _Static_assert(is_unsigned(enum v), "enum v");
  26. _Static_assert(is_unsigned(V) == 1, "value V");
  27. enum w {
  28. W = __LONG_MAX__ + 1UL, // doesn't fit in 'long'
  29. };
  30. _Static_assert(sizeof(enum w) == sizeof(long), "size");
  31. _Static_assert(is_unsigned(enum w), "enum w");
  32. _Static_assert(is_unsigned(W) == 1, "value W");
  33. enum x {
  34. A = 1, // fit in 'int'
  35. B = 0x100000000UL, // doesn't fit in int
  36. };
  37. _Static_assert(sizeof(enum x) == sizeof(long), "size");
  38. _Static_assert(is_unsigned(enum x), "enum x");
  39. _Static_assert(sizeof(A) == sizeof(int), "size A"); // fail
  40. _Static_assert(is_unsigned(A) == 0, "enum A"); // fail
  41. _Static_assert(sizeof(B) == sizeof(long), "size B");
  42. _Static_assert(is_unsigned(B) == 1, "enum B");
  43. enum y {
  44. C = 1, // fit in 'int'
  45. D = 0x100000000L, // doesn't fit in int
  46. };
  47. _Static_assert(sizeof(enum y) == sizeof(long), "size");
  48. _Static_assert(is_unsigned(enum y), "enum y");
  49. _Static_assert(sizeof(C) == sizeof(int), "size C"); // fail
  50. _Static_assert(is_unsigned(C) == 0, "enum C"); // fail
  51. _Static_assert(sizeof(D) == sizeof(long), "size D");
  52. _Static_assert(is_unsigned(D) == 1, "enum D");
  53. /*
  54. * check-name: enum-sign-gcc
  55. * check-command: sparse -m64 $file
  56. * check-assert: sizeof(long) == 8
  57. */