Some fixes on Types.cpp for FixedBytesType

This commit is contained in:
Lefteris Karapetsas 2015-03-12 13:39:12 +01:00
parent 3b54583d38
commit a62d3fa240

View File

@ -231,7 +231,7 @@ TypePointer IntegerType::binaryOperatorResult(Token::Value _operator, TypePointe
// All integer types can be compared // All integer types can be compared
if (Token::isCompareOp(_operator)) if (Token::isCompareOp(_operator))
return commonType; return commonType;
// Nothing else can be done with addresses, but hashes can receive bit operators // Nothing else can be done with addresses
if (commonType->isAddress()) if (commonType->isAddress())
return TypePointer(); return TypePointer();
@ -282,16 +282,17 @@ IntegerConstantType::IntegerConstantType(Literal const& _literal)
bool IntegerConstantType::isImplicitlyConvertibleTo(Type const& _convertTo) const bool IntegerConstantType::isImplicitlyConvertibleTo(Type const& _convertTo) const
{ {
auto integerType = getIntegerType(); shared_ptr<IntegerType const> integerType = getIntegerType();
if (!integerType)
return false;
if (_convertTo.getCategory() == Category::FixedBytes) if (_convertTo.getCategory() == Category::FixedBytes)
{ {
FixedBytesType const& convertTo = dynamic_cast<FixedBytesType const&>(_convertTo); FixedBytesType const& convertTo = dynamic_cast<FixedBytesType const&>(_convertTo);
if (convertTo.getNumBytes() * 8 >= integerType->getNumBits()) return convertTo.getNumBytes() * 8 >= integerType->getNumBits();
return true;
return false;
} }
return integerType && integerType->isImplicitlyConvertibleTo(_convertTo); return integerType->isImplicitlyConvertibleTo(_convertTo);
} }
bool IntegerConstantType::isExplicitlyConvertibleTo(Type const& _convertTo) const bool IntegerConstantType::isExplicitlyConvertibleTo(Type const& _convertTo) const
@ -462,8 +463,6 @@ bool FixedBytesType::isImplicitlyConvertibleTo(Type const& _convertTo) const
bool FixedBytesType::isExplicitlyConvertibleTo(Type const& _convertTo) const bool FixedBytesType::isExplicitlyConvertibleTo(Type const& _convertTo) const
{ {
if (_convertTo.getCategory() == getCategory())
return true;
if (_convertTo.getCategory() == Category::Integer) if (_convertTo.getCategory() == Category::Integer)
{ {
IntegerType const& convertTo = dynamic_cast<IntegerType const&>(_convertTo); IntegerType const& convertTo = dynamic_cast<IntegerType const&>(_convertTo);
@ -471,7 +470,8 @@ bool FixedBytesType::isExplicitlyConvertibleTo(Type const& _convertTo) const
return true; return true;
} }
return false; return _convertTo.getCategory() == Category::Contract ||
_convertTo.getCategory() == getCategory();
} }
TypePointer FixedBytesType::unaryOperatorResult(Token::Value _operator) const TypePointer FixedBytesType::unaryOperatorResult(Token::Value _operator) const