mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #11580 from ethereum/fix-crash-on-zero-in-bytes-concat
Fix `bytes.concat(0)`
This commit is contained in:
		
						commit
						a3c965b7de
					
				| @ -8,6 +8,7 @@ Compiler Features: | |||||||
| 
 | 
 | ||||||
| Bugfixes: | Bugfixes: | ||||||
|  * Code Generator: Fix internal compiler error when calling functions bound to calldata structs and arrays. |  * Code Generator: Fix internal compiler error when calling functions bound to calldata structs and arrays. | ||||||
|  |  * Code Generator: Fix internal compiler error when passing zero to ``bytes.concat()``. | ||||||
|  * Type Checker: Fix internal error and prevent static calls to unimplemented modifiers. |  * Type Checker: Fix internal error and prevent static calls to unimplemented modifiers. | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -1086,6 +1086,11 @@ bool ExpressionCompiler::visit(FunctionCall const& _functionCall) | |||||||
| 					literalType && literalType->value().size() <= 32 | 					literalType && literalType->value().size() <= 32 | ||||||
| 				) | 				) | ||||||
| 					targetTypes.emplace_back(TypeProvider::fixedBytes(static_cast<unsigned>(literalType->value().size()))); | 					targetTypes.emplace_back(TypeProvider::fixedBytes(static_cast<unsigned>(literalType->value().size()))); | ||||||
|  | 				else if (auto const* literalType = dynamic_cast<RationalNumberType const*>(argument->annotation().type)) | ||||||
|  | 				{ | ||||||
|  | 					solAssert(literalType->value() == 0, ""); | ||||||
|  | 					targetTypes.emplace_back(TypeProvider::fixedBytes(1)); | ||||||
|  | 				} | ||||||
| 				else | 				else | ||||||
| 				{ | 				{ | ||||||
| 					solAssert(argument->annotation().type->isImplicitlyConvertibleTo(*TypeProvider::bytesMemory()), ""); | 					solAssert(argument->annotation().type->isImplicitlyConvertibleTo(*TypeProvider::bytesMemory()), ""); | ||||||
|  | |||||||
| @ -2476,6 +2476,11 @@ string YulUtilFunctions::bytesConcatFunction(vector<Type const*> const& _argumen | |||||||
| 			literalType && literalType->value().size() <= 32 | 			literalType && literalType->value().size() <= 32 | ||||||
| 		) | 		) | ||||||
| 			targetTypes.emplace_back(TypeProvider::fixedBytes(static_cast<unsigned>(literalType->value().size()))); | 			targetTypes.emplace_back(TypeProvider::fixedBytes(static_cast<unsigned>(literalType->value().size()))); | ||||||
|  | 		else if (auto const* literalType = dynamic_cast<RationalNumberType const*>(argumentType)) | ||||||
|  | 		{ | ||||||
|  | 			solAssert(literalType->value() == 0, ""); | ||||||
|  | 			targetTypes.emplace_back(TypeProvider::fixedBytes(1)); | ||||||
|  | 		} | ||||||
| 		else | 		else | ||||||
| 		{ | 		{ | ||||||
| 			solAssert(argumentType->isImplicitlyConvertibleTo(*TypeProvider::bytesMemory()), ""); | 			solAssert(argumentType->isImplicitlyConvertibleTo(*TypeProvider::bytesMemory()), ""); | ||||||
|  | |||||||
| @ -0,0 +1,15 @@ | |||||||
|  | contract C { | ||||||
|  |     function f() public returns (bytes memory) { | ||||||
|  |         return bytes.concat(0, -0, 0.0, -0.0, 0e10, 0e-10, 0x00, (0)); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     function g() public returns (bytes memory) { | ||||||
|  |         return bytes.concat(0, "abc", 0, "abc", 0); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ==== | ||||||
|  | // compileViaYul: also | ||||||
|  | // compileToEwasm: also | ||||||
|  | // ---- | ||||||
|  | // f() -> 0x20, 8, "\0\0\0\0\0\0\0\0" | ||||||
|  | // g() -> 0x20, 9, "\0abc\0abc\0" | ||||||
| @ -0,0 +1,6 @@ | |||||||
|  | contract C { | ||||||
|  |     function f() public pure { | ||||||
|  |         bytes.concat(0, -0, 0.0, -0.0, 0e10, 0e-10, (0), 0x00, hex"00", unicode"abc", "abc"); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | contract C { | ||||||
|  |     function f() public { | ||||||
|  |         bytes.concat([], [], []); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 6378: (60-62): Unable to deduce common type for array elements. | ||||||
| @ -0,0 +1,40 @@ | |||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint x; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     enum E {A, B, C} | ||||||
|  | 
 | ||||||
|  |     mapping(uint => E) m; | ||||||
|  | 
 | ||||||
|  |     function f() public { | ||||||
|  |         bool b; | ||||||
|  |         uint u; | ||||||
|  |         uint8 u8; | ||||||
|  |         address a; | ||||||
|  |         address payable ap; | ||||||
|  |         function () external fext; | ||||||
|  |         function () internal fint; | ||||||
|  |         uint[] memory uDynamic; | ||||||
|  |         uint[2] memory uStatic; | ||||||
|  |         C c; | ||||||
|  |         S memory s; | ||||||
|  |         E e; | ||||||
|  | 
 | ||||||
|  |         bytes.concat(b, u, u8, a, ap, fext, fint, uDynamic, uStatic, c, s, e, m); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 8015: (425-426): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but bool provided. | ||||||
|  | // TypeError 8015: (428-429): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint256 provided. | ||||||
|  | // TypeError 8015: (431-433): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint8 provided. | ||||||
|  | // TypeError 8015: (435-436): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but address provided. | ||||||
|  | // TypeError 8015: (438-440): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but address payable provided. | ||||||
|  | // TypeError 8015: (442-446): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but function () external provided. | ||||||
|  | // TypeError 8015: (448-452): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but function () provided. | ||||||
|  | // TypeError 8015: (454-462): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint256[] provided. | ||||||
|  | // TypeError 8015: (464-471): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint256[2] provided. | ||||||
|  | // TypeError 8015: (473-474): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but contract C provided. | ||||||
|  | // TypeError 8015: (476-477): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but struct C.S provided. | ||||||
|  | // TypeError 8015: (479-480): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but enum C.E provided. | ||||||
|  | // TypeError 8015: (482-483): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but mapping(uint256 => enum C.E) provided. | ||||||
| @ -0,0 +1,48 @@ | |||||||
|  | contract C { | ||||||
|  |     struct S { | ||||||
|  |         uint x; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     enum E {A, B, C} | ||||||
|  | 
 | ||||||
|  |     function f() public { | ||||||
|  |         bytes.concat( | ||||||
|  |             false, | ||||||
|  |             1, | ||||||
|  |             1e10, | ||||||
|  |             1e-10, | ||||||
|  |             0.1, | ||||||
|  |             0x11112222333344445555666677778888999900,     // One byte less than an address | ||||||
|  |             0x1111222233334444555566667777888899990000,   // Address | ||||||
|  |             0x111122223333444455556666777788889999000011, // One byte more than an address | ||||||
|  |             f, | ||||||
|  |             (), | ||||||
|  |             (0, 0), | ||||||
|  |             [0], | ||||||
|  |             [0][:], | ||||||
|  |             [0][0], | ||||||
|  |             new C(), | ||||||
|  |             S(0), | ||||||
|  |             E.A | ||||||
|  |         ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // TypeError 1227: (540-546): Index range access is only supported for dynamic calldata arrays. | ||||||
|  | // TypeError 8015: (133-138): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but bool provided. | ||||||
|  | // TypeError 8015: (152-153): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but int_const 1 provided. | ||||||
|  | // TypeError 8015: (167-171): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but int_const 10000000000 provided. | ||||||
|  | // TypeError 8015: (185-190): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but rational_const 1 / 10000000000 provided. | ||||||
|  | // TypeError 8015: (204-207): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but rational_const 1 / 10 provided. | ||||||
|  | // TypeError 8015: (221-261): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but int_const 3806...(37 digits omitted)...1680 provided. | ||||||
|  | // TypeError 8015: (312-354): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but address provided. | ||||||
|  | // TypeError 8015: (381-425): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but int_const 2494...(42 digits omitted)...0497 provided. | ||||||
|  | // TypeError 8015: (472-473): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but function () provided. | ||||||
|  | // TypeError 8015: (487-489): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but tuple() provided. | ||||||
|  | // TypeError 8015: (503-509): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but tuple(int_const 0,int_const 0) provided. | ||||||
|  | // TypeError 8015: (523-526): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint8[1] provided. | ||||||
|  | // TypeError 8015: (540-546): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint8[1] slice provided. | ||||||
|  | // TypeError 8015: (560-566): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but uint8 provided. | ||||||
|  | // TypeError 8015: (580-587): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but contract C provided. | ||||||
|  | // TypeError 8015: (601-605): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but struct C.S provided. | ||||||
|  | // TypeError 8015: (619-622): Invalid type for argument in the bytes.concat function call. bytes or fixed bytes type is required, but enum C.E provided. | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user