mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
This commit is contained in:
parent
7609710d4f
commit
9fb835b710
@ -2398,11 +2398,11 @@ void TypeChecker::endVisit(Literal const& _literal)
|
|||||||
_literal.annotation().type = make_shared<AddressType>(StateMutability::Payable);
|
_literal.annotation().type = make_shared<AddressType>(StateMutability::Payable);
|
||||||
|
|
||||||
string msg;
|
string msg;
|
||||||
if (_literal.value().length() != 42) // "0x" + 40 hex digits
|
if (_literal.valueWithoutUnderscores().length() != 42) // "0x" + 40 hex digits
|
||||||
// looksLikeAddress enforces that it is a hex literal starting with "0x"
|
// looksLikeAddress enforces that it is a hex literal starting with "0x"
|
||||||
msg =
|
msg =
|
||||||
"This looks like an address but is not exactly 40 hex digits. It is " +
|
"This looks like an address but is not exactly 40 hex digits. It is " +
|
||||||
to_string(_literal.value().length() - 2) +
|
to_string(_literal.valueWithoutUnderscores().length() - 2) +
|
||||||
" hex digits.";
|
" hex digits.";
|
||||||
else if (!_literal.passesAddressChecksum())
|
else if (!_literal.passesAddressChecksum())
|
||||||
{
|
{
|
||||||
|
@ -633,6 +633,11 @@ IdentifierAnnotation& Identifier::annotation() const
|
|||||||
return dynamic_cast<IdentifierAnnotation&>(*m_annotation);
|
return dynamic_cast<IdentifierAnnotation&>(*m_annotation);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASTString Literal::valueWithoutUnderscores() const
|
||||||
|
{
|
||||||
|
return boost::erase_all_copy(value(), "_");
|
||||||
|
}
|
||||||
|
|
||||||
bool Literal::isHexNumber() const
|
bool Literal::isHexNumber() const
|
||||||
{
|
{
|
||||||
if (token() != Token::Number)
|
if (token() != Token::Number)
|
||||||
@ -648,20 +653,20 @@ bool Literal::looksLikeAddress() const
|
|||||||
if (!isHexNumber())
|
if (!isHexNumber())
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
return abs(int(value().length()) - 42) <= 1;
|
return abs(int(valueWithoutUnderscores().length()) - 42) <= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Literal::passesAddressChecksum() const
|
bool Literal::passesAddressChecksum() const
|
||||||
{
|
{
|
||||||
solAssert(isHexNumber(), "Expected hex number");
|
solAssert(isHexNumber(), "Expected hex number");
|
||||||
return dev::passesAddressChecksum(value(), true);
|
return dev::passesAddressChecksum(valueWithoutUnderscores(), true);
|
||||||
}
|
}
|
||||||
|
|
||||||
string Literal::getChecksummedAddress() const
|
string Literal::getChecksummedAddress() const
|
||||||
{
|
{
|
||||||
solAssert(isHexNumber(), "Expected hex number");
|
solAssert(isHexNumber(), "Expected hex number");
|
||||||
/// Pad literal to be a proper hex address.
|
/// Pad literal to be a proper hex address.
|
||||||
string address = value().substr(2);
|
string address = valueWithoutUnderscores().substr(2);
|
||||||
if (address.length() > 40)
|
if (address.length() > 40)
|
||||||
return string();
|
return string();
|
||||||
address.insert(address.begin(), 40 - address.size(), '0');
|
address.insert(address.begin(), 40 - address.size(), '0');
|
||||||
|
@ -1679,6 +1679,8 @@ public:
|
|||||||
/// @returns the non-parsed value of the literal
|
/// @returns the non-parsed value of the literal
|
||||||
ASTString const& value() const { return *m_value; }
|
ASTString const& value() const { return *m_value; }
|
||||||
|
|
||||||
|
ASTString valueWithoutUnderscores() const;
|
||||||
|
|
||||||
SubDenomination subDenomination() const { return m_subDenomination; }
|
SubDenomination subDenomination() const { return m_subDenomination; }
|
||||||
|
|
||||||
/// @returns true if this is a number with a hex prefix.
|
/// @returns true if this is a number with a hex prefix.
|
||||||
|
@ -499,7 +499,7 @@ u256 AddressType::literalValue(Literal const* _literal) const
|
|||||||
{
|
{
|
||||||
solAssert(_literal, "");
|
solAssert(_literal, "");
|
||||||
solAssert(_literal->value().substr(0, 2) == "0x", "");
|
solAssert(_literal->value().substr(0, 2) == "0x", "");
|
||||||
return u256(_literal->value());
|
return u256(_literal->valueWithoutUnderscores());
|
||||||
}
|
}
|
||||||
|
|
||||||
TypePointer AddressType::unaryOperatorResult(Token::Value _operator) const
|
TypePointer AddressType::unaryOperatorResult(Token::Value _operator) const
|
||||||
|
@ -4,5 +4,6 @@ contract C {
|
|||||||
a = address(1);
|
a = address(1);
|
||||||
address b = 0x0123456789012345678901234567890123456789;
|
address b = 0x0123456789012345678901234567890123456789;
|
||||||
b = 0x9876543210987654321098765432109876543210;
|
b = 0x9876543210987654321098765432109876543210;
|
||||||
|
b = 0x9876_5432_1098_7654_3210_9876_5432_1098_7654_3210;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user