diff options
-rw-r--r-- | libsolidity/ast/Types.cpp | 22 | ||||
-rw-r--r-- | test/libsolidity/SolidityNameAndTypeResolution.cpp | 39 |
2 files changed, 59 insertions, 2 deletions
diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index 0df68d3d..ff0db089 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -274,8 +274,18 @@ bool IntegerType::isImplicitlyConvertibleTo(Type const& _convertTo) const else if (_convertTo.category() == Category::FixedPoint) { FixedPointType const& convertTo = dynamic_cast<FixedPointType const&>(_convertTo); + cout << endl; + cout << "Integer bits: " << m_bits << endl; + cout << "Fraction integer bits: " << convertTo.integerBits() << endl; + cout << "Integer signed: " << isSigned() << endl; + cout << "Fractional signed: " << convertTo.isSigned() << endl; + cout << "Unsigned convert?: " << bool(!convertTo.isSigned() || convertTo.integerBits() > m_bits) << endl; + cout << endl; if (convertTo.integerBits() < m_bits || isAddress()) + { + cout << "problem with the integer bits" << endl; return false; + } else if (isSigned()) return convertTo.isSigned(); else @@ -328,13 +338,21 @@ string IntegerType::toString(bool) const TypePointer IntegerType::binaryOperatorResult(Token::Value _operator, TypePointer const& _other) const { - if (_other->category() != Category::RationalNumber && _other->category() != category()) + if ( + _other->category() != Category::RationalNumber && + _other->category() != Category::FixedPoint && + _other->category() != category() + ) return TypePointer(); auto commonType = dynamic_pointer_cast<IntegerType const>(Type::commonType(shared_from_this(), _other)); if (!commonType) + { + cout << "Not common type" << endl; return TypePointer(); - + } + cout << "Integer binary operator: " << commonType->toString(false) << endl; + cout << "Token: " << string(Token::toString(_operator)) << endl; // All integer types can be compared if (Token::isCompareOp(_operator)) return commonType; diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index d7f7961a..2b67d084 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -3683,6 +3683,45 @@ BOOST_AUTO_TEST_CASE(zero_handling) BOOST_CHECK(success(text)); } +BOOST_AUTO_TEST_CASE(integer_and_fixed_interaction) +{ + char const* text = R"( + contract test { + function f() { + uint128 a = uint128(1) + ufixed(2); + ufixed b = .5 * uint128(7); + } + } + )"; + BOOST_CHECK(success(text)); +} + +BOOST_AUTO_TEST_CASE(signed_rational_modulus) +{ + char const* text = R"( + contract test { + function f() { + fixed a = 0.42578125 % -0.4271087646484375; + fixed b = .5 % a; + fixed c = a % b; + } + } + )"; + BOOST_CHECK(success(text)); +} + +BOOST_AUTO_TEST_CASE(one_divided_by_three_integer_conversion) +{ + char const* text = R"( + contract test { + function f() { + uint a = 1/3; + } + } + )"; + BOOST_CHECK(!success(text)); +} + BOOST_AUTO_TEST_SUITE_END() } |