diff --git a/src/bigint.cpp b/src/bigint.cpp index 367ae79b6c79e6bd8fe66fc7c00dee7dca6ad0d6..bb227a7c3d5bb266257cae23c781445419b7f07f 100644 --- a/src/bigint.cpp +++ b/src/bigint.cpp @@ -1683,10 +1683,15 @@ void bigint_incr(BigInt *x) { bigint_init_unsigned(x, 1); return; } - - if (x->digit_count == 1 && x->data.digit != UINT64_MAX) { - x->data.digit += 1; - return; + + if (x->digit_count == 1) { + if (x->is_negative && x->data.digit != 0) { + x->data.digit -= 1; + return; + } else if (!x->is_negative && x->data.digit != UINT64_MAX) { + x->data.digit += 1; + return; + } } BigInt copy; diff --git a/test/behavior.zig b/test/behavior.zig index 096c07b2e0261096a8376cd4b6626ee48dc2944d..b494c623e25748d5e32581865b8fb1e760a969f9 100644 --- a/test/behavior.zig +++ b/test/behavior.zig @@ -13,6 +13,7 @@ comptime { _ = @import("cases/bugs/656.zig"); _ = @import("cases/bugs/828.zig"); _ = @import("cases/bugs/920.zig"); + _ = @import("cases/bugs/1111.zig"); _ = @import("cases/byval_arg_var.zig"); _ = @import("cases/cast.zig"); _ = @import("cases/const_slice_child.zig"); diff --git a/test/cases/bugs/1111.zig b/test/cases/bugs/1111.zig new file mode 100644 index 0000000000000000000000000000000000000000..51ce90af52cdfc544cff017c9a3a3153a69f3105 --- /dev/null +++ b/test/cases/bugs/1111.zig @@ -0,0 +1,12 @@ +const Foo = extern enum { + Bar = -1, +}; + +test "issue 1111 fixed" { + const v = Foo.Bar; + + switch(v) { + Foo.Bar => return, + else => return, + } +}