Overflow Checks
Depending on compilation flags, built-in arithmetic operations may introduce overflow checks. We desugar them here.
#![allow(unused)]
fn main() {
$a + $b
// becomes, in debug mode:
{
let (res, overflow) = core::intrinsics::add_with_overflow($a, $b);
if overflow {
panic!("appropriate message")
}
res
}
}
We do similar checks for subtraction, multiplication, division, remainder, and right/left shifts. Some checks are not optional, like the zero check for division and remainder.
After this step, all built-in arithmetic operations are infallible.