checked_add :: (a: $T, b: T) -> result: T, overflow: bool #modify { if T.type == .INTEGER return; T = null; } { overflow: bool; result: T = a + b; info := type_info(T); if info.signed { // (+A) + (+B) = −C // (−A) + (−B) = +C if ((a > 0) && (b > 0) && (result < 0)) || ((a < 0) && (b < 0) && (result > 0)) { overflow = true; } } else { if result < a { overflow = true; } } return result, overflow; } checked_sub :: (a: $T, b: T) -> result: T, overflow: bool #modify { if T.type == .INTEGER return; T = null; } { overflow: bool; result: T = a - b; info := type_info(T); if info.signed { // (+A) − (−B) = −C // (−A) − (+B) = +C if ((a > 0) && (b < 0) && (result < 0)) || ((a < 0) && (b > 0) && (result > 0)) { overflow = true; } } else { if result > a { overflow = true; } } return result, overflow; }