From 204f8daeeda02738479e0d586e6426e23f78e6cc Mon Sep 17 00:00:00 2001 From: xackus <14938807+xackus@users.noreply.github.com> Date: Mon, 11 May 2020 14:06:37 +0200 Subject: stage1: detect underflow in bigint_fits_in_bits --- src/bigint.cpp | 1 + test/compile_errors.zig | 8 ++++++++ 2 files changed, 9 insertions(+) diff --git a/src/bigint.cpp b/src/bigint.cpp index dd04363e82..79a05e95a5 100644 --- a/src/bigint.cpp +++ b/src/bigint.cpp @@ -243,6 +243,7 @@ bool bigint_fits_in_bits(const BigInt *bn, size_t bit_count, bool is_signed) { } if (!is_signed) { + if(bn->is_negative) return false; size_t full_bits = bn->digit_count * 64; size_t leading_zero_count = bigint_clz(bn, full_bits); return bit_count >= full_bits - leading_zero_count; diff --git a/test/compile_errors.zig b/test/compile_errors.zig index 5eb009dafa..a6e2d0b98f 100644 --- a/test/compile_errors.zig +++ b/test/compile_errors.zig @@ -7411,4 +7411,12 @@ pub fn addCases(cases: *tests.CompileErrorContext) void { , &[_][]const u8{ ":5:28: error: expected type '[]u8', found '*const [3:0]u8'", }); + + cases.add("integer underflow error", + \\export fn entry() void { + \\ _ = @intToPtr(*c_void, ~@as(usize, @import("std").math.maxInt(usize)) - 1); + \\} + , &[_][]const u8{ + ":2:75: error: operation caused overflow", + }); } -- cgit v1.2.3