diff options
author | VoR0220 <catalanor0220@gmail.com> | 2016-05-06 06:47:08 +0800 |
---|---|---|
committer | VoR0220 <catalanor0220@gmail.com> | 2016-05-10 00:41:03 +0800 |
commit | a6fc3c8f30d987f90d791c6cc5ec9d0a6a132109 (patch) | |
tree | efeb403b50f1569429dbc342415a71ccb78863d2 /libsolidity/analysis | |
parent | bfc238c8d11e118443d373d819deeada9fe1ea3b (diff) | |
download | dexon-solidity-a6fc3c8f30d987f90d791c6cc5ec9d0a6a132109.tar.gz dexon-solidity-a6fc3c8f30d987f90d791c6cc5ec9d0a6a132109.tar.zst dexon-solidity-a6fc3c8f30d987f90d791c6cc5ec9d0a6a132109.zip |
reorganized tests and fixed mobile types and implicit conversions of rationals and fixed point types
one final tweak
check for null types
Diffstat (limited to 'libsolidity/analysis')
-rw-r--r-- | libsolidity/analysis/TypeChecker.cpp | 72 |
1 files changed, 53 insertions, 19 deletions
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp index 1b37d42e..264fee6b 100644 --- a/libsolidity/analysis/TypeChecker.cpp +++ b/libsolidity/analysis/TypeChecker.cpp @@ -774,8 +774,7 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement) solAssert(!var.typeName(), ""); if ( valueComponentType->category() == Type::Category::RationalNumber && - !dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->integerType() && - !dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->fixedPointType() + !dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->mobileType() ) fatalTypeError(_statement.initialValue()->location(), "Invalid rational " + valueComponentType->toString() + "."); var.annotation().type = valueComponentType->mobileType(); @@ -785,14 +784,32 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement) { var.accept(*this); if (!valueComponentType->isImplicitlyConvertibleTo(*var.annotation().type)) - typeError( - _statement.location(), - "Type " + - valueComponentType->toString() + - " is not implicitly convertible to expected type " + - var.annotation().type->toString() + - "." - ); + { + if ( + valueComponentType->category() == Type::Category::RationalNumber && + dynamic_pointer_cast<RationalNumberType const>(valueComponentType)->denominator() != 1 && + !!valueComponentType->mobileType() + ) + 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." + ); + else + typeError( + _statement.location(), + "Type " + + valueComponentType->toString() + + " is not implicitly convertible to expected type " + + var.annotation().type->toString() + + "." + ); + } } } return false; @@ -1499,16 +1516,33 @@ Declaration const& TypeChecker::dereference(UserDefinedTypeName const& _typeName void TypeChecker::expectType(Expression const& _expression, Type const& _expectedType) { _expression.accept(*this); - if (!type(_expression)->isImplicitlyConvertibleTo(_expectedType)) - typeError( - _expression.location(), - "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))->denominator() != 1 && + !!type(_expression)->mobileType() + ) + 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 using an explicit conversion." + ); + else + typeError( + _expression.location(), + "Type " + + type(_expression)->toString() + + " is not implicitly convertible to expected type " + + _expectedType.toString() + + "." + ); + } } void TypeChecker::requireLValue(Expression const& _expression) |