mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	[cond-expr] add a test to assign memory to storage
This commit is contained in:
		
							parent
							
								
									41039705ac
								
							
						
					
					
						commit
						1cd3288311
					
				| @ -754,8 +754,12 @@ bool TypeChecker::visit(Conditional const& _conditional) | |||||||
| 	TypePointer const& trueType = type(_conditional.trueExpression()); | 	TypePointer const& trueType = type(_conditional.trueExpression()); | ||||||
| 	TypePointer const& falseType = type(_conditional.falseExpression()); | 	TypePointer const& falseType = type(_conditional.falseExpression()); | ||||||
| 
 | 
 | ||||||
| 	// we fake it as an equal operator, but any other comparison operator can work.
 | 	TypePointer commonType; | ||||||
| 	TypePointer commonType = trueType->binaryOperatorResult(Token::Equal, falseType); | 	if (*trueType == *falseType) | ||||||
|  | 		commonType = trueType; | ||||||
|  | 	else | ||||||
|  | 		// we fake it as an equal operator, but any other comparison operator can work.
 | ||||||
|  | 		TypePointer commonType = trueType->binaryOperatorResult(Token::Equal, falseType); | ||||||
| 	if (!commonType) | 	if (!commonType) | ||||||
| 	{ | 	{ | ||||||
| 		typeError( | 		typeError( | ||||||
|  | |||||||
| @ -141,6 +141,39 @@ BOOST_AUTO_TEST_CASE(conditional_expression_with_return_values) | |||||||
| 	BOOST_CHECK(callContractFunction("f(bool,uint256)", false, u256(20)) == encodeArgs(u256(0), u256(20))); | 	BOOST_CHECK(callContractFunction("f(bool,uint256)", false, u256(20)) == encodeArgs(u256(0), u256(20))); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | BOOST_AUTO_TEST_CASE(conditional_expression_storage_memory) | ||||||
|  | { | ||||||
|  | 	char const* sourceCode = R"( | ||||||
|  | 		contract test { | ||||||
|  | 			bytes2[2] data1; | ||||||
|  | 			function f(bool cond) returns (uint) { | ||||||
|  | 				bytes2[2] memory x; | ||||||
|  | 				x[0] = "aa"; | ||||||
|  | 				bytes2[2] memory y; | ||||||
|  | 				y[0] = "bb"; | ||||||
|  | 
 | ||||||
|  | 				data1 = cond ? x : y; | ||||||
|  | 
 | ||||||
|  | 				uint ret = 0; | ||||||
|  | 				if (data1[0] == "aa") | ||||||
|  | 				{ | ||||||
|  | 					ret = 1; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				if (data1[0] == "bb") | ||||||
|  | 				{ | ||||||
|  | 					ret = 2; | ||||||
|  | 				} | ||||||
|  | 
 | ||||||
|  | 				return ret; | ||||||
|  | 			}     | ||||||
|  | 		} | ||||||
|  | 	)"; | ||||||
|  | 	compileAndRun(sourceCode); | ||||||
|  | 	BOOST_CHECK(callContractFunction("f(bool)", true) == encodeArgs(u256(1))); | ||||||
|  | 	BOOST_CHECK(callContractFunction("f(bool)", false) == encodeArgs(u256(2))); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| BOOST_AUTO_TEST_CASE(recursive_calls) | BOOST_AUTO_TEST_CASE(recursive_calls) | ||||||
| { | { | ||||||
| 	char const* sourceCode = "contract test {\n" | 	char const* sourceCode = "contract test {\n" | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user