Merge pull request #5348 from ethereum/boostRationalNegativeDenominatorFix

Fix negative denominator in ``boost::rational`` during exponentiation.
This commit is contained in:
chriseth 2018-11-08 11:25:30 +01:00 committed by GitHub
commit cc2de07bc6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 16 additions and 2 deletions

View File

@ -1144,10 +1144,10 @@ TypePointer RationalNumberType::binaryOperatorResult(Token _operator, TypePointe
bigint denominator = optimizedPow(m_value.denominator(), absExp);
if (exp >= 0)
value = rational(numerator, denominator);
value = makeRational(numerator, denominator);
else
// invert
value = rational(denominator, numerator);
value = makeRational(denominator, numerator);
}
break;
}

View File

@ -51,6 +51,15 @@ using FunctionTypePointer = std::shared_ptr<FunctionType const>;
using TypePointers = std::vector<TypePointer>;
using rational = boost::rational<dev::bigint>;
inline rational makeRational(bigint const& _numerator, bigint const& _denominator)
{
solAssert(_denominator != 0, "division by zero");
// due to a bug in certain versions of boost the denominator has to be positive
if (_denominator < 0)
return rational(-_numerator, -_denominator);
else
return rational(_numerator, _denominator);
}
enum class DataLocation { Storage, CallData, Memory };

View File

@ -0,0 +1,5 @@
contract C {
function f() public pure returns (int) {
return (-1 / 2) ** -1;
}
}