[Issue 8011] BigInt ++ and -- do wrong thing on negative numbers

2012-05-03 Thread d-bugmail
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

2012-05-02 Thread d-bugmail
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

2012-05-02 Thread d-bugmail
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

2012-05-02 Thread d-bugmail
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: ---