mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Warn if local storage reference variable does not use "storage" explicitly.
This commit is contained in:
		
							parent
							
								
									05a26fc98c
								
							
						
					
					
						commit
						dd34277ca6
					
				| @ -1,5 +1,8 @@ | ||||
| ### 0.4.13 (unreleased) | ||||
| 
 | ||||
| Features: | ||||
|  * Type Checker: Warn if a local storage reference variable does not explicitly use the keyword ``storage``. | ||||
| 
 | ||||
| Bugfixes: | ||||
|  * Code Generator: Correctly unregister modifier variables. | ||||
| 
 | ||||
|  | ||||
| @ -289,7 +289,20 @@ void ReferencesResolver::endVisit(VariableDeclaration const& _variable) | ||||
| 					typeLoc = DataLocation::Memory; | ||||
| 				} | ||||
| 				else if (varLoc == Location::Default) | ||||
| 					typeLoc = _variable.isCallableParameter() ? DataLocation::Memory : DataLocation::Storage; | ||||
| 				{ | ||||
| 					if (_variable.isCallableParameter()) | ||||
| 						typeLoc = DataLocation::Memory; | ||||
| 					else | ||||
| 					{ | ||||
| 						typeLoc = DataLocation::Storage; | ||||
| 						if (!_variable.isStateVariable()) | ||||
| 							m_errorReporter.warning( | ||||
| 								_variable.location(), | ||||
| 								"Variable is declared as a storage pointer. " | ||||
| 								"Use an explicit \"storage\" keyword to silence this warning." | ||||
| 							); | ||||
| 					} | ||||
| 				} | ||||
| 				else | ||||
| 					typeLoc = varLoc == Location::Memory ? DataLocation::Memory : DataLocation::Storage; | ||||
| 				isPointer = !_variable.isStateVariable(); | ||||
|  | ||||
| @ -854,10 +854,12 @@ bool TypeChecker::visit(VariableDeclarationStatement const& _statement) | ||||
| 		if (auto ref = dynamic_cast<ReferenceType const*>(type(varDecl).get())) | ||||
| 		{ | ||||
| 			if (ref->dataStoredIn(DataLocation::Storage)) | ||||
| 				m_errorReporter.warning( | ||||
| 					varDecl.location(), | ||||
| 					"Uninitialized storage pointer. Did you mean '<type> memory " + varDecl.name() + "'?" | ||||
| 				); | ||||
| 			{ | ||||
| 				string errorText{"Uninitialized storage pointer."}; | ||||
| 				if (varDecl.referenceLocation() == VariableDeclaration::Location::Default) | ||||
| 					errorText += " Did you mean '<type> memory " + varDecl.name() + "'?"; | ||||
| 				m_errorReporter.warning(varDecl.location(), errorText); | ||||
| 			} | ||||
| 		} | ||||
| 		else if (dynamic_cast<MappingType const*>(type(varDecl).get())) | ||||
| 			m_errorReporter.typeError( | ||||
|  | ||||
| @ -2817,7 +2817,7 @@ BOOST_AUTO_TEST_CASE(uninitialized_mapping_array_variable) | ||||
| 	char const* sourceCode = R"( | ||||
| 		contract C { | ||||
| 			function f() { | ||||
| 				mapping(uint => uint)[] x; | ||||
| 				mapping(uint => uint)[] storage x; | ||||
| 				x; | ||||
| 			} | ||||
| 		} | ||||
| @ -3103,7 +3103,7 @@ BOOST_AUTO_TEST_CASE(non_initialized_references) | ||||
| 			} | ||||
| 			function f() | ||||
| 			{ | ||||
| 				s x; | ||||
| 				s storage x; | ||||
| 				x.a = 2; | ||||
| 			} | ||||
| 		} | ||||
| @ -6144,6 +6144,32 @@ BOOST_AUTO_TEST_CASE(shadowing_warning_can_be_removed) | ||||
| 	CHECK_SUCCESS_NO_WARNINGS(text); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(warn_unspecified_storage) | ||||
| { | ||||
| 	char const* text = R"( | ||||
| 		contract C { | ||||
| 			struct S { uint a; } | ||||
| 			S x; | ||||
| 			function f() { | ||||
| 				S storage y = x; | ||||
| 				y; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	CHECK_SUCCESS_NO_WARNINGS(text); | ||||
| 	text = R"( | ||||
| 		contract C { | ||||
| 			struct S { uint a; } | ||||
| 			S x; | ||||
| 			function f() { | ||||
| 				S y = x; | ||||
| 				y; | ||||
| 			} | ||||
| 		} | ||||
| 	)"; | ||||
| 	CHECK_WARNING(text, "is declared as a storage pointer. Use an explicit \"storage\" keyword to silence this warning"); | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| BOOST_AUTO_TEST_SUITE_END() | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user