[Issue 8011] BigInt ++ and -- do wrong thing on negative numbers
http://d.puremagic.com/issues/show_bug.cgi?id=8011 Don clugd...@yahoo.com.au changed: What|Removed |Added Status|NEW |RESOLVED CC||clugd...@yahoo.com.au Resolution||FIXED -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 8011] BigInt ++ and -- do wrong thing on negative numbers
http://d.puremagic.com/issues/show_bug.cgi?id=8011 Ary Borenszweig a...@esperanto.org.ar changed: What|Removed |Added CC||a...@esperanto.org.ar --- Comment #3 from Ary Borenszweig a...@esperanto.org.ar 2012-05-01 23:57:53 PDT --- (In reply to comment #1) The root cause is in bigint.d, in the opUnary() function. BigInt uses an underlying BigUint and maps the ++ and -- operators directly through to the BigUint as addition and subtraction, respectively, disregarding the BigInt's sign. However, this is wrong. Signed ++ and -- must be passed through as subtraction and addition, respectively. I modified the function by commenting out the two errant lines and replacing them each with a correct one. This is a proof-of-concept fix for the bug. // non-const unary operations BigInt opUnary(string op)() if (op==++ || op==--) { static if (op==++) { //data = BigUint.addOrSubInt(data, 1UL, false, sign); data = BigUint.addOrSubInt(data, 1UL, sign ? true : false, sign); return this; } else static if (op==--) { //data = BigUint.addOrSubInt(data, 1UL, true, sign); data = BigUint.addOrSubInt(data, 1UL, sign ? false : true, sign); return this; } } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 8011] BigInt ++ and -- do wrong thing on negative numbers
http://d.puremagic.com/issues/show_bug.cgi?id=8011 --- Comment #4 from Ary Borenszweig a...@esperanto.org.ar 2012-05-01 23:58:55 PDT --- sign is already a boolean, so it's simpler to do: // non-const unary operations BigInt opUnary(string op)() if (op==++ || op==--) { static if (op==++) { data = BigUint.addOrSubInt(data, 1UL, sign, sign); return this; } else static if (op==--) { data = BigUint.addOrSubInt(data, 1UL, !sign, sign); return this; } } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---
[Issue 8011] BigInt ++ and -- do wrong thing on negative numbers
http://d.puremagic.com/issues/show_bug.cgi?id=8011 --- Comment #5 from github-bugzi...@puremagic.com 2012-05-02 16:46:08 PDT --- Commits pushed to master at https://github.com/D-Programming-Language/phobos https://github.com/D-Programming-Language/phobos/commit/bd72ae7d36e2fafe3a4c00dc9e4c568366cacb03 Fix issue 8011 BigInt ++ and -- do wrong thing on negative numbers Patch by Ary Borenszweig https://github.com/D-Programming-Language/phobos/commit/87dfaa82dbb8ff129b46037830ca7f9845ab6664 Merge pull request #564 from donc/bigint8011 Fix issue 8011 BigInt ++ and -- do wrong thing on negative numbers -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email --- You are receiving this mail because: ---