From e8e5e12ad29004714f04f3697a6fdfb7813602c1 Mon Sep 17 00:00:00 2001 From: Daniel Kirchner Date: Wed, 11 Jul 2018 15:30:54 +0200 Subject: Fix literals with exponents with mantissa of zero. --- libsolidity/ast/Types.cpp | 19 +++++++++++-------- .../syntaxTests/types/rational_number_exp_limit.sol | 1 + 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 0a4f199d..dd0736e9 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -771,20 +771,23 @@ tuple RationalNumberType::isValidLiteral(Literal const& _literal } else if (expPoint != _literal.value().end()) { - // Parse base and exponent. Checks numeric limit. - bigint exp = bigint(string(expPoint + 1, _literal.value().end())); + // Parse mantissa and exponent. Checks numeric limit. + tuple mantissa = parseRational(string(_literal.value().begin(), expPoint)); - if (exp > numeric_limits::max() || exp < numeric_limits::min()) + if (!get<0>(mantissa)) return make_tuple(false, rational(0)); + value = get<1>(mantissa); - uint32_t expAbs = bigint(abs(exp)).convert_to(); - + // 0E... is always zero. + if (value == 0) + return make_tuple(true, rational(0)); - tuple base = parseRational(string(_literal.value().begin(), expPoint)); + bigint exp = bigint(string(expPoint + 1, _literal.value().end())); - if (!get<0>(base)) + if (exp > numeric_limits::max() || exp < numeric_limits::min()) return make_tuple(false, rational(0)); - value = get<1>(base); + + uint32_t expAbs = bigint(abs(exp)).convert_to(); if (exp < 0) { diff --git a/test/libsolidity/syntaxTests/types/rational_number_exp_limit.sol b/test/libsolidity/syntaxTests/types/rational_number_exp_limit.sol index 6785f580..21712205 100644 --- a/test/libsolidity/syntaxTests/types/rational_number_exp_limit.sol +++ b/test/libsolidity/syntaxTests/types/rational_number_exp_limit.sol @@ -19,6 +19,7 @@ contract c { a = 1E1233 ** -1E1233; a = -1E1233 ** 1E1233; a = -1E1233 ** -1E1233; + a = 0E123456789; // fine } } // ---- -- cgit v1.2.3