aboutsummaryrefslogtreecommitdiff
path: root/test/behavior
diff options
context:
space:
mode:
authorJakub Konka <kubkon@jakubkonka.com>2022-05-04 23:12:59 +0200
committerJakub Konka <kubkon@jakubkonka.com>2022-05-05 21:43:36 +0200
commit3cef23129a37676cfd1e86efbc20d6089d7812e5 (patch)
tree2a377fd7f775006bb17b9657ff3f7caf96de4cfe /test/behavior
parentd112cd52f36cbb00e18009417044ab1e4496dd80 (diff)
downloadzig-3cef23129a37676cfd1e86efbc20d6089d7812e5.tar.gz
zig-3cef23129a37676cfd1e86efbc20d6089d7812e5.zip
test: test more int sizes for @mulWithOverflow builtin
Diffstat (limited to 'test/behavior')
-rw-r--r--test/behavior/math.zig155
1 files changed, 154 insertions, 1 deletions
diff --git a/test/behavior/math.zig b/test/behavior/math.zig
index 7a60ec8417..fdf8eb6a3f 100644
--- a/test/behavior/math.zig
+++ b/test/behavior/math.zig
@@ -664,7 +664,7 @@ test "small int addition" {
try expect(result == 0);
}
-test "@mulWithOverflow" {
+test "basic @mulWithOverflow" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
var result: u8 = undefined;
@@ -683,6 +683,159 @@ test "@mulWithOverflow" {
try expect(result == 236);
}
+// TODO migrate to this for all backends once they handle more cases
+test "extensive @mulWithOverflow" {
+ if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO
+ if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO
+
+ {
+ var a: u8 = 3;
+ var b: u8 = 85;
+ var res: u8 = undefined;
+
+ try expect(!@mulWithOverflow(u8, a, b, &res));
+ try expect(res == 255);
+
+ b = 86;
+ try expect(@mulWithOverflow(u8, a, b, &res));
+ try expect(res == 2);
+ }
+
+ {
+ var a: i8 = 3;
+ var b: i8 = -42;
+ var res: i8 = undefined;
+ try expect(!@mulWithOverflow(i8, a, b, &res));
+ try expect(res == -126);
+
+ b = -43;
+ try expect(@mulWithOverflow(i8, a, b, &res));
+ try expect(res == 127);
+ }
+
+ {
+ var a: u16 = 3;
+ var b: u16 = 0x5555;
+ var res: u16 = undefined;
+ try expect(!@mulWithOverflow(u16, a, b, &res));
+ try expect(res == 0xffff);
+
+ b = 0x5556;
+ try expect(@mulWithOverflow(u16, a, b, &res));
+ try expect(res == 2);
+ }
+
+ {
+ var a: i16 = 3;
+ var b: i16 = -0x2aaa;
+ var res: i16 = undefined;
+ try expect(!@mulWithOverflow(i16, a, b, &res));
+ try expect(res == -0x7ffe);
+
+ b = -0x2aab;
+ try expect(@mulWithOverflow(i16, a, b, &res));
+ try expect(res == 0x7fff);
+ }
+
+ {
+ var a: u30 = 3;
+ var b: u30 = 0x15555555;
+ var res: u30 = undefined;
+ try expect(!@mulWithOverflow(u30, a, b, &res));
+ try expect(res == 0x3fffffff);
+
+ b = 0x15555556;
+ try expect(@mulWithOverflow(u30, a, b, &res));
+ try expect(res == 2);
+ }
+
+ {
+ var a: i30 = 3;
+ var b: i30 = -0xaaaaaaa;
+ var res: i30 = undefined;
+ try expect(!@mulWithOverflow(i30, a, b, &res));
+ try expect(res == -0x1ffffffe);
+
+ b = -0xaaaaaab;
+ try expect(@mulWithOverflow(i30, a, b, &res));
+ try expect(res == 0x1fffffff);
+ }
+
+ {
+ var a: u32 = 3;
+ var b: u32 = 0x55555555;
+ var res: u32 = undefined;
+ try expect(!@mulWithOverflow(u32, a, b, &res));
+ try expect(res == 0xffffffff);
+
+ b = 0x55555556;
+ try expect(@mulWithOverflow(u32, a, b, &res));
+ try expect(res == 2);
+ }
+
+ {
+ var a: i32 = 3;
+ var b: i32 = -0x2aaaaaaa;
+ var res: i32 = undefined;
+ try expect(!@mulWithOverflow(i32, a, b, &res));
+ try expect(res == -0x7ffffffe);
+
+ b = -0x2aaaaaab;
+ try expect(@mulWithOverflow(i32, a, b, &res));
+ try expect(res == 0x7fffffff);
+ }
+
+ {
+ var a: u62 = 3;
+ var b: u62 = 0x1555555555555555;
+ var res: u62 = undefined;
+ try expect(!@mulWithOverflow(u62, a, b, &res));
+ try expect(res == 0x3fffffffffffffff);
+
+ b = 0x1555555555555556;
+ try expect(@mulWithOverflow(u62, a, b, &res));
+ try expect(res == 2);
+ }
+
+ {
+ var a: i62 = 3;
+ var b: i62 = -0xaaaaaaaaaaaaaaa;
+ var res: i62 = undefined;
+ try expect(!@mulWithOverflow(i62, a, b, &res));
+ try expect(res == -0x1ffffffffffffffe);
+
+ b = -0xaaaaaaaaaaaaaab;
+ try expect(@mulWithOverflow(i62, a, b, &res));
+ try expect(res == 0x1fffffffffffffff);
+ }
+
+ {
+ var a: u64 = 3;
+ var b: u64 = 0x5555555555555555;
+ var res: u64 = undefined;
+ try expect(!@mulWithOverflow(u64, a, b, &res));
+ try expect(res == 0xffffffffffffffff);
+
+ b = 0x5555555555555556;
+ try expect(@mulWithOverflow(u64, a, b, &res));
+ try expect(res == 2);
+ }
+
+ {
+ var a: i64 = 3;
+ var b: i64 = -0x2aaaaaaaaaaaaaaa;
+ var res: i64 = undefined;
+ try expect(!@mulWithOverflow(i64, a, b, &res));
+ try expect(res == -0x7ffffffffffffffe);
+
+ b = -0x2aaaaaaaaaaaaaab;
+ try expect(@mulWithOverflow(i64, a, b, &res));
+ try expect(res == 0x7fffffffffffffff);
+ }
+}
+
test "@subWithOverflow" {
if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO