mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #9716 from ethereum/smt_fix_tuple_2
[SMTChecker] Fix ICE on tuple assignment
This commit is contained in:
		
						commit
						20b359e5c5
					
				| @ -21,6 +21,7 @@ Bugfixes: | |||||||
|  * SMTChecker: Fix internal error on array implicit conversion. |  * SMTChecker: Fix internal error on array implicit conversion. | ||||||
|  * SMTChecker: Fix internal error on fixed bytes index access. |  * SMTChecker: Fix internal error on fixed bytes index access. | ||||||
|  * SMTChecker: Fix internal error on lvalue unary operators with tuples. |  * SMTChecker: Fix internal error on lvalue unary operators with tuples. | ||||||
|  |  * SMTChecker: Fix internal error on tuple assignment. | ||||||
|  * SMTChecker: Fix soundness of array ``pop``. |  * SMTChecker: Fix soundness of array ``pop``. | ||||||
|  * References Resolver: Fix internal bug when using constructor for library. |  * References Resolver: Fix internal bug when using constructor for library. | ||||||
|  * Yul Optimizer: Make function inlining order more resilient to whether or not unrelated source files are present. |  * Yul Optimizer: Make function inlining order more resilient to whether or not unrelated source files are present. | ||||||
|  | |||||||
| @ -1490,13 +1490,14 @@ void SMTEncoder::tupleAssignment(Expression const& _left, Expression const& _rig | |||||||
| { | { | ||||||
| 	auto lTuple = dynamic_cast<TupleExpression const*>(innermostTuple(_left)); | 	auto lTuple = dynamic_cast<TupleExpression const*>(innermostTuple(_left)); | ||||||
| 	solAssert(lTuple, ""); | 	solAssert(lTuple, ""); | ||||||
|  | 	Expression const* right = innermostTuple(_right); | ||||||
| 
 | 
 | ||||||
| 	auto const& lComponents = lTuple->components(); | 	auto const& lComponents = lTuple->components(); | ||||||
| 
 | 
 | ||||||
| 	// If both sides are tuple expressions, we individually and potentially
 | 	// If both sides are tuple expressions, we individually and potentially
 | ||||||
| 	// recursively assign each pair of components.
 | 	// recursively assign each pair of components.
 | ||||||
| 	// This is because of potential type conversion.
 | 	// This is because of potential type conversion.
 | ||||||
| 	if (auto rTuple = dynamic_cast<TupleExpression const*>(&_right)) | 	if (auto rTuple = dynamic_cast<TupleExpression const*>(right)) | ||||||
| 	{ | 	{ | ||||||
| 		auto const& rComponents = rTuple->components(); | 		auto const& rComponents = rTuple->components(); | ||||||
| 		solAssert(lComponents.size() == rComponents.size(), ""); | 		solAssert(lComponents.size() == rComponents.size(), ""); | ||||||
| @ -1517,13 +1518,13 @@ void SMTEncoder::tupleAssignment(Expression const& _left, Expression const& _rig | |||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		auto rType = dynamic_cast<TupleType const*>(_right.annotation().type); | 		auto rType = dynamic_cast<TupleType const*>(right->annotation().type); | ||||||
| 		solAssert(rType, ""); | 		solAssert(rType, ""); | ||||||
| 
 | 
 | ||||||
| 		auto const& rComponents = rType->components(); | 		auto const& rComponents = rType->components(); | ||||||
| 		solAssert(lComponents.size() == rComponents.size(), ""); | 		solAssert(lComponents.size() == rComponents.size(), ""); | ||||||
| 
 | 
 | ||||||
| 		auto symbRight = expr(_right); | 		auto symbRight = expr(*right); | ||||||
| 		solAssert(symbRight.sort->kind == smtutil::Kind::Tuple, ""); | 		solAssert(symbRight.sort->kind == smtutil::Kind::Tuple, ""); | ||||||
| 
 | 
 | ||||||
| 		for (unsigned i = 0; i < lComponents.size(); ++i) | 		for (unsigned i = 0; i < lComponents.size(); ++i) | ||||||
|  | |||||||
| @ -0,0 +1,11 @@ | |||||||
|  | pragma experimental SMTChecker; | ||||||
|  | contract C { | ||||||
|  | 	function f() public pure returns(int) { | ||||||
|  | 		int a; | ||||||
|  | 		(,, a) = ((((((1, 3, (((((2))))))))))); | ||||||
|  | 		assert(a == 2); | ||||||
|  | 		assert(a == 3); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // Warning 6328: (157-171): Assertion violation happens here | ||||||
| @ -0,0 +1,11 @@ | |||||||
|  | pragma experimental SMTChecker; | ||||||
|  | contract C { | ||||||
|  | 	function f() public pure returns(int) { | ||||||
|  | 		int a; | ||||||
|  | 		((,, a)) = ((((((1, 3, (((((2))))))))))); | ||||||
|  | 		assert(a == 2); | ||||||
|  | 		assert(a == 3); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // Warning 6328: (159-173): Assertion violation happens here | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user