mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #5125 from ethereum/fix_address_with_underscores
Fixes #5051 (introduced in #4684), effectively allowing underscores in address literals.
This commit is contained in:
		
						commit
						23773bbb1f
					
				| @ -2398,11 +2398,11 @@ void TypeChecker::endVisit(Literal const& _literal) | ||||
| 		_literal.annotation().type = make_shared<AddressType>(StateMutability::Payable); | ||||
| 
 | ||||
| 		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"
 | ||||
| 			msg = | ||||
| 				"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."; | ||||
| 		else if (!_literal.passesAddressChecksum()) | ||||
| 		{ | ||||
|  | ||||
| @ -633,6 +633,11 @@ IdentifierAnnotation& Identifier::annotation() const | ||||
| 	return dynamic_cast<IdentifierAnnotation&>(*m_annotation); | ||||
| } | ||||
| 
 | ||||
| ASTString Literal::valueWithoutUnderscores() const | ||||
| { | ||||
| 	return boost::erase_all_copy(value(), "_"); | ||||
| } | ||||
| 
 | ||||
| bool Literal::isHexNumber() const | ||||
| { | ||||
| 	if (token() != Token::Number) | ||||
| @ -648,20 +653,20 @@ bool Literal::looksLikeAddress() const | ||||
| 	if (!isHexNumber()) | ||||
| 		return false; | ||||
| 
 | ||||
| 	return abs(int(value().length()) - 42) <= 1; | ||||
| 	return abs(int(valueWithoutUnderscores().length()) - 42) <= 1; | ||||
| } | ||||
| 
 | ||||
| bool Literal::passesAddressChecksum() const | ||||
| { | ||||
| 	solAssert(isHexNumber(), "Expected hex number"); | ||||
| 	return dev::passesAddressChecksum(value(), true); | ||||
| 	return dev::passesAddressChecksum(valueWithoutUnderscores(), true); | ||||
| } | ||||
| 
 | ||||
| string Literal::getChecksummedAddress() const | ||||
| { | ||||
| 	solAssert(isHexNumber(), "Expected hex number"); | ||||
| 	/// Pad literal to be a proper hex address.
 | ||||
| 	string address = value().substr(2); | ||||
| 	string address = valueWithoutUnderscores().substr(2); | ||||
| 	if (address.length() > 40) | ||||
| 		return string(); | ||||
| 	address.insert(address.begin(), 40 - address.size(), '0'); | ||||
|  | ||||
| @ -1679,6 +1679,8 @@ public: | ||||
| 	/// @returns the non-parsed value of the literal
 | ||||
| 	ASTString const& value() const { return *m_value; } | ||||
| 
 | ||||
| 	ASTString valueWithoutUnderscores() const; | ||||
| 
 | ||||
| 	SubDenomination subDenomination() const { return m_subDenomination; } | ||||
| 
 | ||||
| 	/// @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->value().substr(0, 2) == "0x", ""); | ||||
| 	return u256(_literal->value()); | ||||
| 	return u256(_literal->valueWithoutUnderscores()); | ||||
| } | ||||
| 
 | ||||
| TypePointer AddressType::unaryOperatorResult(Token::Value _operator) const | ||||
|  | ||||
| @ -4,5 +4,6 @@ contract C { | ||||
|         a = address(1); | ||||
|         address b = 0x0123456789012345678901234567890123456789; | ||||
|         b = 0x9876543210987654321098765432109876543210; | ||||
|         b = 0x9876_5432_1098_7654_3210_9876_5432_1098_7654_3210; | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user