From 43bda534102c95a85daddc64fb466eb8c88e2325 Mon Sep 17 00:00:00 2001 From: Christian Parpart Date: Wed, 8 Aug 2018 14:46:17 +0200 Subject: Fixes issue where computing storage size for a number would take too long. Fixes #4673. --- libsolidity/ast/Types.cpp | 3 ++- libsolidity/ast/Types.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'libsolidity/ast') diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 2dcfda42..21631693 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -1263,7 +1263,8 @@ shared_ptr RationalNumberType::fixedPointType() const return shared_ptr(); // This means we round towards zero for positive and negative values. bigint v = value.numerator() / value.denominator(); - if (negative) + + if (negative && v != 0) // modify value to satisfy bit requirements for negative numbers: // add one bit for sign and decrement because negative numbers can be larger v = (v - 1) << 1; diff --git a/libsolidity/ast/Types.h b/libsolidity/ast/Types.h index 3b57109d..787c9360 100644 --- a/libsolidity/ast/Types.h +++ b/libsolidity/ast/Types.h @@ -446,7 +446,8 @@ public: /// @returns the smallest integer type that can hold the value or an empty pointer if not possible. std::shared_ptr integerType() const; - /// @returns the smallest fixed type that can hold the value or incurs the least precision loss. + /// @returns the smallest fixed type that can hold the value or incurs the least precision loss, + /// unless the value was truncated, then a suitable type will be chosen to indicate such event. /// If the integer part does not fit, returns an empty pointer. std::shared_ptr fixedPointType() const; -- cgit