Fix literals with exponents with mantissa of zero.

This commit is contained in:
Daniel Kirchner 2018-07-11 15:30:54 +02:00
parent f3abfa81ad
commit e8e5e12ad2
2 changed files with 12 additions and 8 deletions

View File

@ -771,7 +771,17 @@ tuple<bool, rational> RationalNumberType::isValidLiteral(Literal const& _literal
} }
else if (expPoint != _literal.value().end()) else if (expPoint != _literal.value().end())
{ {
// Parse base and exponent. Checks numeric limit. // Parse mantissa and exponent. Checks numeric limit.
tuple<bool, rational> mantissa = parseRational(string(_literal.value().begin(), expPoint));
if (!get<0>(mantissa))
return make_tuple(false, rational(0));
value = get<1>(mantissa);
// 0E... is always zero.
if (value == 0)
return make_tuple(true, rational(0));
bigint exp = bigint(string(expPoint + 1, _literal.value().end())); bigint exp = bigint(string(expPoint + 1, _literal.value().end()));
if (exp > numeric_limits<int32_t>::max() || exp < numeric_limits<int32_t>::min()) if (exp > numeric_limits<int32_t>::max() || exp < numeric_limits<int32_t>::min())
@ -779,13 +789,6 @@ tuple<bool, rational> RationalNumberType::isValidLiteral(Literal const& _literal
uint32_t expAbs = bigint(abs(exp)).convert_to<uint32_t>(); uint32_t expAbs = bigint(abs(exp)).convert_to<uint32_t>();
tuple<bool, rational> base = parseRational(string(_literal.value().begin(), expPoint));
if (!get<0>(base))
return make_tuple(false, rational(0));
value = get<1>(base);
if (exp < 0) if (exp < 0)
{ {
if (!fitsPrecisionBase10(abs(value.denominator()), expAbs)) if (!fitsPrecisionBase10(abs(value.denominator()), expAbs))

View File

@ -19,6 +19,7 @@ contract c {
a = 1E1233 ** -1E1233; a = 1E1233 ** -1E1233;
a = -1E1233 ** 1E1233; a = -1E1233 ** 1E1233;
a = -1E1233 ** -1E1233; a = -1E1233 ** -1E1233;
a = 0E123456789; // fine
} }
} }
// ---- // ----