mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #9416 from ethereum/disallowOverridePure
Disallow public state variables overriding pure functions.
This commit is contained in:
		
						commit
						a8c14c2e68
					
				| @ -29,6 +29,8 @@ Compiler Features: | |||||||
| 
 | 
 | ||||||
| Bugfixes: | Bugfixes: | ||||||
|  * NatSpec: Constructors and functions have consistent userdoc output. |  * NatSpec: Constructors and functions have consistent userdoc output. | ||||||
|  |  * Inheritance: Disallow public state variables overwriting ``pure`` functions. | ||||||
|  |  * State Mutability: Constant public state variables are considered ``pure`` functions. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### 0.6.12 (unreleased) | ### 0.6.12 (unreleased) | ||||||
|  | |||||||
| @ -310,7 +310,7 @@ of the variable: | |||||||
| 
 | 
 | ||||||
|     contract A |     contract A | ||||||
|     { |     { | ||||||
|         function f() external pure virtual returns(uint) { return 5; } |         function f() external view virtual returns(uint) { return 5; } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     contract B is A |     contract B is A | ||||||
|  | |||||||
| @ -289,7 +289,7 @@ StateMutability OverrideProxy::stateMutability() const | |||||||
| 	return std::visit(GenericVisitor{ | 	return std::visit(GenericVisitor{ | ||||||
| 		[&](FunctionDefinition const* _item) { return _item->stateMutability(); }, | 		[&](FunctionDefinition const* _item) { return _item->stateMutability(); }, | ||||||
| 		[&](ModifierDefinition const*) { solAssert(false, "Requested state mutability from modifier."); return StateMutability{}; }, | 		[&](ModifierDefinition const*) { solAssert(false, "Requested state mutability from modifier."); return StateMutability{}; }, | ||||||
| 		[&](VariableDeclaration const*) { return StateMutability::View; } | 		[&](VariableDeclaration const* _var) { return _var->isConstant() ? StateMutability::Pure : StateMutability::View; } | ||||||
| 	}, m_item); | 	}, m_item); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -584,35 +584,35 @@ void OverrideChecker::checkOverride(OverrideProxy const& _overriding, OverridePr | |||||||
| 				"Overridden " + _overriding.astNodeName() + " is here:" | 				"Overridden " + _overriding.astNodeName() + " is here:" | ||||||
| 			); | 			); | ||||||
| 
 | 
 | ||||||
| 		// This is only relevant for a function overriding a function.
 | 		// Stricter mutability is always okay except when super is Payable
 | ||||||
| 		if (_overriding.isFunction()) | 		if ( | ||||||
| 		{ | 			(_overriding.isFunction() || _overriding.isVariable()) && | ||||||
| 			// Stricter mutability is always okay except when super is Payable
 | 			( | ||||||
| 			if (( |  | ||||||
| 				_overriding.stateMutability() > _super.stateMutability() || | 				_overriding.stateMutability() > _super.stateMutability() || | ||||||
| 				_super.stateMutability() == StateMutability::Payable | 				_super.stateMutability() == StateMutability::Payable | ||||||
| 				) && | 			) && | ||||||
| 				_overriding.stateMutability() != _super.stateMutability() | 			_overriding.stateMutability() != _super.stateMutability() | ||||||
| 			) | 		) | ||||||
| 				overrideError( | 			overrideError( | ||||||
| 					_overriding, | 				_overriding, | ||||||
| 					_super, | 				_super, | ||||||
| 					6959_error, | 				6959_error, | ||||||
| 					"Overriding function changes state mutability from \"" + | 				"Overriding " + | ||||||
| 					stateMutabilityToString(_super.stateMutability()) + | 				_overriding.astNodeName() + | ||||||
| 					"\" to \"" + | 				" changes state mutability from \"" + | ||||||
| 					stateMutabilityToString(_overriding.stateMutability()) + | 				stateMutabilityToString(_super.stateMutability()) + | ||||||
| 					"\"." | 				"\" to \"" + | ||||||
| 				); | 				stateMutabilityToString(_overriding.stateMutability()) + | ||||||
|  | 				"\"." | ||||||
|  | 			); | ||||||
| 
 | 
 | ||||||
| 			if (_overriding.unimplemented() && !_super.unimplemented()) | 		if (_overriding.unimplemented() && !_super.unimplemented()) | ||||||
| 				overrideError( | 			overrideError( | ||||||
| 					_overriding, | 				_overriding, | ||||||
| 					_super, | 				_super, | ||||||
| 					4593_error, | 				4593_error, | ||||||
| 					"Overriding an implemented function with an unimplemented function is not allowed." | 				"Overriding an implemented function with an unimplemented function is not allowed." | ||||||
| 				); | 			); | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| contract I { | contract I { | ||||||
| 	function f() external pure virtual returns (uint) { return 1; } | 	function f() external view virtual returns (uint) { return 1; } | ||||||
| } | } | ||||||
| contract A is I | contract A is I | ||||||
| { | { | ||||||
| @ -11,3 +11,4 @@ contract C is A, B | |||||||
| { | { | ||||||
| 	uint public override f; | 	uint public override f; | ||||||
| } | } | ||||||
|  | // ---- | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| contract I { | contract I { | ||||||
| 	function f() external pure virtual returns (uint) { return 1; } | 	function f() external view virtual returns (uint) { return 1; } | ||||||
| } | } | ||||||
| contract A is I | contract A is I | ||||||
| { | { | ||||||
|  | |||||||
| @ -1,5 +1,5 @@ | |||||||
| contract I { | contract I { | ||||||
| 	function f() external pure virtual returns (uint) { return 1; } | 	function f() external view virtual returns (uint) { return 1; } | ||||||
| } | } | ||||||
| contract A is I | contract A is I | ||||||
| { | { | ||||||
|  | |||||||
| @ -0,0 +1,7 @@ | |||||||
|  | abstract contract C { | ||||||
|  |     function foo() external pure virtual returns (uint); | ||||||
|  | } | ||||||
|  | contract X is C { | ||||||
|  | 	uint public constant override foo = 7; | ||||||
|  | } | ||||||
|  | // ---- | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | abstract contract C { | ||||||
|  |     function foo() external pure virtual returns (uint); | ||||||
|  | } | ||||||
|  | contract X is C { | ||||||
|  | 	uint public immutable override foo = 7; | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 6959: (100-138): Overriding public state variable changes state mutability from "pure" to "view". | ||||||
| @ -1,5 +1,5 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() internal virtual pure returns(uint) { return 5; } | 	function foo() internal virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is A { | contract X is A { | ||||||
| 	uint public foo; | 	uint public foo; | ||||||
|  | |||||||
| @ -0,0 +1,8 @@ | |||||||
|  | abstract contract C { | ||||||
|  |     function foo() external pure virtual returns (uint); | ||||||
|  | } | ||||||
|  | contract X is C { | ||||||
|  | 	uint public override foo; | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 6959: (100-124): Overriding public state variable changes state mutability from "pure" to "view". | ||||||
| @ -1,8 +1,8 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract B { | contract B { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is A, B { | contract X is A, B { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
|  | |||||||
| @ -2,7 +2,7 @@ contract A { | |||||||
| 	uint public foo; | 	uint public foo; | ||||||
| } | } | ||||||
| contract B { | contract B { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is A, B { | contract X is A, B { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(uint) { return 4; } | 	function foo() external virtual view returns(uint) { return 4; } | ||||||
| 	function foo(uint ) external virtual pure returns(uint) { return 4; } | 	function foo(uint ) external virtual view returns(uint) { return 4; } | ||||||
| 	function foo(uint , uint ) external pure virtual returns(A) {  } | 	function foo(uint , uint ) external view virtual returns(A) {  } | ||||||
| } | } | ||||||
| contract X is A { | contract X is A { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
|  | |||||||
| @ -1,7 +1,7 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(A) {  } | 	function foo() external virtual view returns(A) {  } | ||||||
| 	function foo(uint ) external virtual pure returns(uint) { return 4; } | 	function foo(uint ) external virtual view returns(uint) { return 4; } | ||||||
| 	function foo(uint , uint ) external pure virtual returns(A) {  } | 	function foo(uint , uint ) external view virtual returns(A) {  } | ||||||
| } | } | ||||||
| contract X is A { | contract X is A { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
|  | |||||||
| @ -1,11 +1,11 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract B is A { | contract B is A { | ||||||
| 	function foo() external virtual override pure returns(uint) { return 5; } | 	function foo() external virtual override view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract C is A { | contract C is A { | ||||||
| 	function foo() external virtual override pure returns(uint) { return 5; } | 	function foo() external virtual override view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is B, C { | contract X is B, C { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
|  | |||||||
| @ -1,11 +1,11 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract B is A { | contract B is A { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
| } | } | ||||||
| contract C is A { | contract C is A { | ||||||
| 	function foo() external virtual override pure returns(uint) { return 5; } | 	function foo() external virtual override view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is B, C { | contract X is B, C { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
|  | |||||||
| @ -1,11 +1,11 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract B is A { | contract B is A { | ||||||
| 	uint public override foo; | 	uint public override foo; | ||||||
| } | } | ||||||
| contract C is A { | contract C is A { | ||||||
| 	function foo() external virtual override pure returns(uint) { return 5; } | 	function foo() external virtual override view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is B, C { | contract X is B, C { | ||||||
| 	uint public override(A, C) foo; | 	uint public override(A, C) foo; | ||||||
|  | |||||||
| @ -1,8 +1,8 @@ | |||||||
| contract A { | contract A { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract B { | contract B { | ||||||
| 	function foo() external virtual pure returns(uint) { return 5; } | 	function foo() external virtual view returns(uint) { return 5; } | ||||||
| } | } | ||||||
| contract X is A, B { | contract X is A, B { | ||||||
| 	uint public override(A, B) foo; | 	uint public override(A, B) foo; | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user