What    |Removed                     |Added
   Target Milestone|---                         |2.059

--- Comment #1 from 2012-05-01 11:37:37 PDT ---
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:
------- You are receiving this mail because: -------

Reply via email to