fuzion
fuzion copied to clipboard
be/c: statically assert wrap around semantics
e.g. like:
_Static_assert((uint8_t) ((uint8_t) UINT8_MAX + (uint8_t) 7) == (uint8_t) 6 , "wrap around semantics failed.");
_Static_assert((uint16_t)((uint16_t)UINT16_MAX + (uint16_t)7) == (uint16_t)6 , "wrap around semantics failed.");
_Static_assert((uint32_t)((uint32_t)UINT32_MAX + (uint32_t)7) == (uint32_t)6 , "wrap around semantics failed.");
_Static_assert((uint64_t)((uint64_t)UINT64_MAX + (uint64_t)7) == (uint64_t)6 , "wrap around semantics failed.");
_Static_assert((uint8_t) ((uint8_t) 0 - (uint8_t) 7) == (uint8_t) (UINT8_MAX -6) , "wrap around semantics failed.");
_Static_assert((uint16_t)((uint16_t)0 - (uint16_t)7) == (uint16_t)(UINT16_MAX-6) , "wrap around semantics failed.");
_Static_assert((uint32_t)((uint32_t)0 - (uint32_t)7) == (uint32_t)(UINT32_MAX-6) , "wrap around semantics failed.");
_Static_assert((uint64_t)((uint64_t)0 - (uint64_t)7) == (uint64_t)(UINT64_MAX-6) , "wrap around semantics failed.");
_Static_assert((uint8_t) ((uint8_t) UINT8_MAX * (uint8_t) UINT8_MAX ) == (uint8_t) 1 , "wrap around semantics failed.");
_Static_assert((uint16_t)((uint16_t)UINT16_MAX * (uint16_t)UINT16_MAX) == (uint16_t)1 , "wrap around semantics failed.");
_Static_assert((uint32_t)((uint32_t)UINT32_MAX * (uint32_t)UINT32_MAX) == (uint32_t)1 , "wrap around semantics failed.");
_Static_assert((uint64_t)((uint64_t)UINT64_MAX * (uint64_t)UINT64_MAX) == (uint64_t)1 , "wrap around semantics failed.");
For unsigned, this is part of the C standard, so I do not see any need to check this. But having such tests as part of the Fuzion tests for integers would be good, then we would test all backends!