about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorCorey Richardson <corey@octayn.net>2015-01-06 00:56:30 -0500
committerFelix S. Klock II <pnkfelix@pnkfx.org>2015-03-03 12:09:07 +0100
commitcdfff9db35d037c51dfd5c2bac2174f651294adb (patch)
tree92ffb0978f93db6b8a74531b1f3abef2ab599e6f /src/libcore
parent00ccc7af1eb9091de7f24edf9eacb3da119d5b27 (diff)
downloadrust-cdfff9db35d037c51dfd5c2bac2174f651294adb.tar.gz
rust-cdfff9db35d037c51dfd5c2bac2174f651294adb.zip
rustc: implement arithmetic overflow checking
Adds overflow checking to integer addition, multiplication, and subtraction
when `-Z force-overflow-checks` is true, or if `--cfg ndebug` is not passed to
the compiler. On overflow, it panics with `arithmetic operation overflowed`.
Also adds `overflowing_add`, `overflowing_sub`, and `overflowing_mul`
intrinsics for doing unchecked arithmetic.

[breaking-change]
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/intrinsics.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/libcore/intrinsics.rs b/src/libcore/intrinsics.rs
index 1ca243134cc..ed129136091 100644
--- a/src/libcore/intrinsics.rs
+++ b/src/libcore/intrinsics.rs
@@ -546,3 +546,14 @@ extern "rust-intrinsic" {
     /// Performs checked `u64` multiplication.
     pub fn u64_mul_with_overflow(x: u64, y: u64) -> (u64, bool);
 }
+
+// SNAP 880fb89
+#[cfg(not(stage0))]
+extern "rust-intrinsic" {
+    /// Returns (a + b) mod 2^N, where N is the width of N in bits.
+    pub fn overflowing_add<T>(a: T, b: T) -> T;
+    /// Returns (a - b) mod 2^N, where N is the width of N in bits.
+    pub fn overflowing_sub<T>(a: T, b: T) -> T;
+    /// Returns (a * b) mod 2^N, where N is the width of N in bits.
+    pub fn overflowing_mul<T>(a: T, b: T) -> T;
+}