diff options
author | Khan M Rashedun-Naby <naby88@gmail.com> | 2018-06-24 10:15:25 +0800 |
---|---|---|
committer | Khan M Rashedun-Naby <naby88@gmail.com> | 2018-06-24 10:15:25 +0800 |
commit | 097a3fabf40af014320f383f916c524a5a44e78b (patch) | |
tree | 672f4ac836c2087fd2bd19666da777a5f0e62d9a /libsolidity/ast | |
parent | 9b67bdb3f47754006e8c3d93cd72db2f0700b073 (diff) | |
download | dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.tar dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.tar.gz dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.tar.bz2 dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.tar.lz dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.tar.xz dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.tar.zst dexon-solidity-097a3fabf40af014320f383f916c524a5a44e78b.zip |
RationalNumberType::isImplicitlyConvertibleTo Refactor
Diffstat (limited to 'libsolidity/ast')
-rw-r--r-- | libsolidity/ast/Types.cpp | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index c4d97c64..f9a4b7d6 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -856,7 +856,9 @@ tuple<bool, rational> RationalNumberType::isValidLiteral(Literal const& _literal bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const { - if (_convertTo.category() == Category::Integer) + switch (_convertTo.category()) + { + case Category::Integer: { if (m_value == rational(0)) return true; @@ -868,31 +870,33 @@ bool RationalNumberType::isImplicitlyConvertibleTo(Type const& _convertTo) const { if (m_value.numerator() <= (u256(-1) >> (256 - targetType.numBits() + forSignBit))) return true; + return false; + } + if (targetType.isSigned()) + { + if (-m_value.numerator() <= (u256(1) << (targetType.numBits() - forSignBit))) + return true; } - else if (targetType.isSigned() && -m_value.numerator() <= (u256(1) << (targetType.numBits() - forSignBit))) - return true; return false; } - else if (_convertTo.category() == Category::FixedPoint) + case Category::FixedPoint: { if (auto fixed = fixedPointType()) return fixed->isImplicitlyConvertibleTo(_convertTo); - else - return false; + return false; } - else if (_convertTo.category() == Category::FixedBytes) + case Category::FixedBytes: { FixedBytesType const& fixedBytes = dynamic_cast<FixedBytesType const&>(_convertTo); - if (!isFractional()) - { - if (integerType()) - return fixedBytes.numBytes() * 8 >= integerType()->numBits(); - return false; - } - else + if (isFractional()) return false; + if (integerType()) + return fixedBytes.numBytes() * 8 >= integerType()->numBits(); + return false; + } + default: + return false; } - return false; } bool RationalNumberType::isExplicitlyConvertibleTo(Type const& _convertTo) const |