fuzion icon indicating copy to clipboard operation
fuzion copied to clipboard

be/c: statically assert wrap around semantics

Open michaellilltokiwa opened this issue 1 year ago • 1 comments

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.");

michaellilltokiwa avatar Apr 29 '24 06:04 michaellilltokiwa

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!

fridis avatar Apr 29 '24 06:04 fridis