mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2074 from LianaHus/sol_PosIntegerLiteralsConversation
Solidity Positive integer literals conversion to signed if in value range.
This commit is contained in:
commit
4987eec3d1
11
AST.cpp
11
AST.cpp
@ -686,9 +686,14 @@ void Expression::expectType(Type const& _expectedType)
|
|||||||
checkTypeRequirements(nullptr);
|
checkTypeRequirements(nullptr);
|
||||||
Type const& type = *getType();
|
Type const& type = *getType();
|
||||||
if (!type.isImplicitlyConvertibleTo(_expectedType))
|
if (!type.isImplicitlyConvertibleTo(_expectedType))
|
||||||
BOOST_THROW_EXCEPTION(createTypeError("Type " + type.toString() +
|
BOOST_THROW_EXCEPTION(createTypeError(
|
||||||
" not implicitly convertible to expected type "
|
"Type " +
|
||||||
+ _expectedType.toString() + "."));
|
type.toString() +
|
||||||
|
" is not implicitly convertible to expected type " +
|
||||||
|
_expectedType.toString() +
|
||||||
|
"."
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Expression::requireLValue()
|
void Expression::requireLValue()
|
||||||
|
35
Types.cpp
35
Types.cpp
@ -361,17 +361,27 @@ IntegerConstantType::IntegerConstantType(Literal const& _literal)
|
|||||||
|
|
||||||
bool IntegerConstantType::isImplicitlyConvertibleTo(Type const& _convertTo) const
|
bool IntegerConstantType::isImplicitlyConvertibleTo(Type const& _convertTo) const
|
||||||
{
|
{
|
||||||
shared_ptr<IntegerType const> integerType = getIntegerType();
|
if (auto targetType = dynamic_cast<IntegerType const*>(&_convertTo))
|
||||||
if (!integerType)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (_convertTo.getCategory() == Category::FixedBytes)
|
|
||||||
{
|
{
|
||||||
FixedBytesType const& convertTo = dynamic_cast<FixedBytesType const&>(_convertTo);
|
if (m_value == 0)
|
||||||
return convertTo.getNumBytes() * 8 >= integerType->getNumBits();
|
return true;
|
||||||
|
int forSignBit = (targetType->isSigned() ? 1 : 0);
|
||||||
|
if (m_value > 0)
|
||||||
|
{
|
||||||
|
if (m_value <= (u256(-1) >> (256 - targetType->getNumBits() + forSignBit)))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else if (targetType->isSigned() && -m_value <= (u256(1) << (targetType->getNumBits() - forSignBit)))
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
else if (_convertTo.getCategory() == Category::FixedBytes)
|
||||||
return integerType->isImplicitlyConvertibleTo(_convertTo);
|
{
|
||||||
|
FixedBytesType const& fixedBytes = dynamic_cast<FixedBytesType const&>(_convertTo);
|
||||||
|
return fixedBytes.getNumBytes() * 8 >= getIntegerType()->getNumBits();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool IntegerConstantType::isExplicitlyConvertibleTo(Type const& _convertTo) const
|
bool IntegerConstantType::isExplicitlyConvertibleTo(Type const& _convertTo) const
|
||||||
@ -514,9 +524,10 @@ shared_ptr<IntegerType const> IntegerConstantType::getIntegerType() const
|
|||||||
if (value > u256(-1))
|
if (value > u256(-1))
|
||||||
return shared_ptr<IntegerType const>();
|
return shared_ptr<IntegerType const>();
|
||||||
else
|
else
|
||||||
return make_shared<IntegerType>(max(bytesRequired(value), 1u) * 8,
|
return make_shared<IntegerType>(
|
||||||
negative ? IntegerType::Modifier::Signed
|
max(bytesRequired(value), 1u) * 8,
|
||||||
: IntegerType::Modifier::Unsigned);
|
negative ? IntegerType::Modifier::Signed : IntegerType::Modifier::Unsigned
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
shared_ptr<FixedBytesType> FixedBytesType::smallestTypeForLiteral(string const& _literal)
|
shared_ptr<FixedBytesType> FixedBytesType::smallestTypeForLiteral(string const& _literal)
|
||||||
|
Loading…
Reference in New Issue
Block a user