diff options
| author | chriseth <chris@ethereum.org> | 2018-12-11 01:02:36 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-12-11 01:02:36 +0800 |
| commit | 5355380f80eeb9fac49dd28a32b08ba88e662c87 (patch) | |
| tree | e18d162e1b9de2cac75fbebe9658e4ba85e6a4ef /libsolidity/analysis | |
| parent | 687382ae09106236a97907f72473dc275891f2fc (diff) | |
| parent | 81f703427e7b34b5488d452eee9e8246e30421bb (diff) | |
| download | dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.tar dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.tar.gz dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.tar.bz2 dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.tar.lz dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.tar.xz dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.tar.zst dexon-solidity-5355380f80eeb9fac49dd28a32b08ba88e662c87.zip | |
Merge pull request #5552 from 0yi0/5551-rational-convertible-to-fixed-point
Fix conversions from rational number literals to fixed-point types.
Diffstat (limited to 'libsolidity/analysis')
| -rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 76 |
1 files changed, 40 insertions, 36 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 1c9f1956..d41415c0 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -935,30 +935,32 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement) var.accept(*this); if (!valueComponentType->isImplicitlyConvertibleTo(*var.annotation().type)) { + auto errorMsg = "Type " + + valueComponentType->toString() + + " is not implicitly convertible to expected type " + + var.annotation().type->toString(); if ( valueComponentType->category() == Type::Category::RationalNumber && dynamic_cast<RationalNumberType const&>(*valueComponentType).isFractional() && valueComponentType->mobileType() ) - m_errorReporter.typeError( - _statement.location(), - "Type " + - valueComponentType->toString() + - " is not implicitly convertible to expected type " + - var.annotation().type->toString() + - ". Try converting to type " + - valueComponentType->mobileType()->toString() + - " or use an explicit conversion." - ); + { + if (var.annotation().type->operator==(*valueComponentType->mobileType())) + m_errorReporter.typeError( + _statement.location(), + errorMsg + ", but it can be explicitly converted." + ); + else + m_errorReporter.typeError( + _statement.location(), + errorMsg + + ". Try converting to type " + + valueComponentType->mobileType()->toString() + + " or use an explicit conversion." + ); + } else - m_errorReporter.typeError( - _statement.location(), - "Type " + - valueComponentType->toString() + - " is not implicitly convertible to expected type " + - var.annotation().type->toString() + - "." - ); + m_errorReporter.typeError(_statement.location(), errorMsg + "."); } } } @@ -2331,30 +2333,32 @@ bool TypeChecker::expectType(Expression const& _expression, Type const& _expecte _expression.accept(*this); if (!type(_expression)->isImplicitlyConvertibleTo(_expectedType)) { + auto errorMsg = "Type " + + type(_expression)->toString() + + " is not implicitly convertible to expected type " + + _expectedType.toString(); if ( type(_expression)->category() == Type::Category::RationalNumber && dynamic_pointer_cast<RationalNumberType const>(type(_expression))->isFractional() && type(_expression)->mobileType() ) - m_errorReporter.typeError( - _expression.location(), - "Type " + - type(_expression)->toString() + - " is not implicitly convertible to expected type " + - _expectedType.toString() + - ". Try converting to type " + - type(_expression)->mobileType()->toString() + - " or use an explicit conversion." - ); + { + if (_expectedType.operator==(*type(_expression)->mobileType())) + m_errorReporter.typeError( + _expression.location(), + errorMsg + ", but it can be explicitly converted." + ); + else + m_errorReporter.typeError( + _expression.location(), + errorMsg + + ". Try converting to type " + + type(_expression)->mobileType()->toString() + + " or use an explicit conversion." + ); + } else - m_errorReporter.typeError( - _expression.location(), - "Type " + - type(_expression)->toString() + - " is not implicitly convertible to expected type " + - _expectedType.toString() + - "." - ); + m_errorReporter.typeError(_expression.location(), errorMsg + "."); return false; } return true; |
