mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	[SMTChecker] Fix tuple name for arrays
This commit is contained in:
		
							parent
							
								
									241a564fca
								
							
						
					
					
						commit
						ec31d971e6
					
				| @ -10,6 +10,7 @@ Compiler Features: | ||||
| Bugfixes: | ||||
|  * Optimizer: Keep side-effects of ``x`` in ``byte(a, shr(b, x))`` even if the constants ``a`` and ``b`` would make the expression zero unconditionally. This optimizer rule is very hard if not impossible to trigger in a way that it can result in invalid code, though. | ||||
|  * SMTChecker: Fix internal error in BMC function inlining. | ||||
|  * SMTChecker: Fix internal error on array implicit conversion. | ||||
|  * SMTChecker: Fix internal error on fixed bytes index access. | ||||
|  * References Resolver: Fix internal bug when using constructor for library. | ||||
| 
 | ||||
|  | ||||
| @ -92,13 +92,35 @@ SortPointer smtSort(frontend::Type const& _type) | ||||
| 		string tupleName; | ||||
| 		if ( | ||||
| 			auto arrayType = dynamic_cast<ArrayType const*>(&_type); | ||||
| 			(arrayType && arrayType->isString()) || | ||||
| 			(arrayType && (arrayType->isString() || arrayType->isByteArray())) || | ||||
| 			_type.category() == frontend::Type::Category::ArraySlice || | ||||
| 			_type.category() == frontend::Type::Category::StringLiteral | ||||
| 		) | ||||
| 			tupleName = "bytes_tuple"; | ||||
| 			tupleName = "bytes"; | ||||
| 		else if (auto arrayType = dynamic_cast<ArrayType const*>(&_type)) | ||||
| 		{ | ||||
| 			auto baseType = arrayType->baseType(); | ||||
| 			// Solidity allows implicit conversion also when assigning arrays.
 | ||||
| 			// So if the base type potentially has a size, that size cannot go
 | ||||
| 			// in the tuple's name.
 | ||||
| 			if (auto tupleSort = dynamic_pointer_cast<TupleSort>(array->range)) | ||||
| 				tupleName = tupleSort->name; | ||||
| 			else if ( | ||||
| 				baseType->category() == frontend::Type::Category::Integer || | ||||
| 				baseType->category() == frontend::Type::Category::FixedPoint | ||||
| 			) | ||||
| 				tupleName = "uint"; | ||||
| 			else if (baseType->category() == frontend::Type::Category::FixedBytes) | ||||
| 				tupleName = "fixedbytes"; | ||||
| 			else | ||||
| 				tupleName = arrayType->baseType()->toString(true); | ||||
| 
 | ||||
| 			tupleName += "[]"; | ||||
| 		} | ||||
| 		else | ||||
| 			tupleName = _type.toString(true) + "_tuple"; | ||||
| 			tupleName = _type.toString(true); | ||||
| 
 | ||||
| 		tupleName += "_tuple"; | ||||
| 
 | ||||
| 		return make_shared<TupleSort>( | ||||
| 			tupleName, | ||||
|  | ||||
| @ -20,6 +20,9 @@ contract LoopFor2 { | ||||
| 		assert(b[0] == 900); | ||||
| 	} | ||||
| } | ||||
| // ==== | ||||
| // SMTSolvers: cvc4 | ||||
| // ---- | ||||
| // Warning 6328: (320-339): Assertion violation happens here | ||||
| // Warning 6328: (343-362): Assertion violation happens here. | ||||
| // Warning 4661: (296-316): Assertion violation happens here | ||||
| // Warning 4661: (320-339): Assertion violation happens here | ||||
| // Warning 4661: (343-362): Assertion violation happens here | ||||
|  | ||||
| @ -26,4 +26,4 @@ contract C | ||||
| 	} | ||||
| } | ||||
| // ---- | ||||
| // Warning 6328: (400-457): Assertion violation happens here | ||||
| // Warning 6328: (400-457): Assertion violation happens here. | ||||
|  | ||||
| @ -0,0 +1,7 @@ | ||||
| pragma experimental SMTChecker; | ||||
| contract C { | ||||
| 	uint[][] a; | ||||
| 	function f(uint[1] memory x) public { | ||||
| 		a.push(x); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,7 @@ | ||||
| pragma experimental SMTChecker; | ||||
| contract C { | ||||
| 	uint[][] a; | ||||
| 	function f(uint[1][] memory x) public { | ||||
| 		a.push(x[2]); | ||||
| 	} | ||||
| } | ||||
| @ -0,0 +1,9 @@ | ||||
| pragma experimental SMTChecker; | ||||
| contract D { | ||||
| 	bytes16[] inner; | ||||
| 	bytes32[][] data; | ||||
| 	function t() public { | ||||
| 		data.push(inner); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| @ -0,0 +1,9 @@ | ||||
| pragma experimental SMTChecker; | ||||
| contract D { | ||||
| 	int16[] inner; | ||||
| 	int[][] data; | ||||
| 	function t() public { | ||||
| 		data.push(inner); | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user