From 62894101529fa0ed7c7f566ea02cc805e889c745 Mon Sep 17 00:00:00 2001 From: VoR0220 Date: Fri, 13 May 2016 00:38:41 -0500 Subject: explicit conversion and loosening of binary operations on integer and fixed point types...still other problems fixed some spaces and deleted lines from failing test --- libsolidity/ast/Types.cpp | 35 +++++++--------------- test/libsolidity/SolidityNameAndTypeResolution.cpp | 3 +- 2 files changed, 12 insertions(+), 26 deletions(-) diff --git a/libsolidity/ast/Types.cpp b/libsolidity/ast/Types.cpp index ff0db089..e8ec32dc 100644 --- a/libsolidity/ast/Types.cpp +++ b/libsolidity/ast/Types.cpp @@ -274,18 +274,8 @@ bool IntegerType::isImplicitlyConvertibleTo(Type const& _convertTo) const else if (_convertTo.category() == Category::FixedPoint) { FixedPointType const& convertTo = dynamic_cast(_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 @@ -300,7 +290,8 @@ bool IntegerType::isExplicitlyConvertibleTo(Type const& _convertTo) const return _convertTo.category() == category() || _convertTo.category() == Category::Contract || _convertTo.category() == Category::Enum || - _convertTo.category() == Category::FixedBytes; + _convertTo.category() == Category::FixedBytes || + _convertTo.category() == Category::FixedPoint; } TypePointer IntegerType::unaryOperatorResult(Token::Value _operator) const @@ -344,23 +335,19 @@ TypePointer IntegerType::binaryOperatorResult(Token::Value _operator, TypePointe _other->category() != category() ) return TypePointer(); - auto commonType = dynamic_pointer_cast(Type::commonType(shared_from_this(), _other)); - + auto commonType = Type::commonType(shared_from_this(), _other); //might be a integer or fixed point 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; if (Token::isBooleanOp(_operator)) return TypePointer(); // Nothing else can be done with addresses - if (commonType->isAddress()) - return TypePointer(); + if (auto intType = dynamic_pointer_cast(commonType)) + if (intType->isAddress()) + return TypePointer(); return commonType; } @@ -404,7 +391,6 @@ bool FixedPointType::isImplicitlyConvertibleTo(Type const& _convertTo) const else return !convertTo.isSigned() || (convertTo.m_integerBits > m_integerBits); } - return false; } @@ -455,7 +441,7 @@ TypePointer FixedPointType::binaryOperatorResult(Token::Value _operator, TypePoi && _other->category() != Category::Integer ) return TypePointer(); - auto commonType = dynamic_pointer_cast(Type::commonType(shared_from_this(), _other)); + auto commonType = Type::commonType(shared_from_this(), _other); //might be fixed point or integer if (!commonType) return TypePointer(); @@ -465,8 +451,9 @@ TypePointer FixedPointType::binaryOperatorResult(Token::Value _operator, TypePoi return commonType; if (Token::isBitOp(_operator) || Token::isBooleanOp(_operator)) return TypePointer(); - if (Token::Exp == _operator) - return TypePointer(); + if (auto fixType = dynamic_pointer_cast(commonType)) + if (Token::Exp == _operator) + return TypePointer(); return commonType; } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 2b67d084..bbc77d34 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -3688,8 +3688,7 @@ 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); + ufixed a = uint128(1) + ufixed(2); } } )"; -- cgit v1.2.3