mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #4480 from ethereum/fixZeroWithExponent
Fix literals with exponents with mantissa of zero.
This commit is contained in:
		
						commit
						0c9645c978
					
				| @ -59,6 +59,7 @@ Compiler Features: | ||||
| Bugfixes: | ||||
|  * Tests: Fix chain parameters to make ipc tests work with newer versions of cpp-ethereum. | ||||
|  * Code Generator: Fix allocation of byte arrays (zeroed out too much memory). | ||||
|  * Type System: Allow arbitrary exponents for literals with a mantissa of zero. | ||||
| 
 | ||||
| ### 0.4.24 (2018-05-16) | ||||
| 
 | ||||
|  | ||||
| @ -771,7 +771,17 @@ tuple<bool, rational> RationalNumberType::isValidLiteral(Literal const& _literal | ||||
| 		} | ||||
| 		else if (expPoint != _literal.value().end()) | ||||
| 		{ | ||||
| 			// Parse base and exponent. Checks numeric limit.
 | ||||
| 			// Parse mantissa and exponent. Checks numeric limit.
 | ||||
| 			tuple<bool, rational> mantissa = parseRational(string(_literal.value().begin(), expPoint)); | ||||
| 
 | ||||
| 			if (!get<0>(mantissa)) | ||||
| 				return make_tuple(false, rational(0)); | ||||
| 			value = get<1>(mantissa); | ||||
| 
 | ||||
| 			// 0E... is always zero.
 | ||||
| 			if (value == 0) | ||||
| 				return make_tuple(true, rational(0)); | ||||
| 
 | ||||
| 			bigint exp = bigint(string(expPoint + 1, _literal.value().end())); | ||||
| 
 | ||||
| 			if (exp > numeric_limits<int32_t>::max() || exp < numeric_limits<int32_t>::min()) | ||||
| @ -779,13 +789,6 @@ tuple<bool, rational> RationalNumberType::isValidLiteral(Literal const& _literal | ||||
| 
 | ||||
| 			uint32_t expAbs = bigint(abs(exp)).convert_to<uint32_t>(); | ||||
| 
 | ||||
| 
 | ||||
| 			tuple<bool, rational> base = parseRational(string(_literal.value().begin(), expPoint)); | ||||
| 
 | ||||
| 			if (!get<0>(base)) | ||||
| 				return make_tuple(false, rational(0)); | ||||
| 			value = get<1>(base); | ||||
| 
 | ||||
| 			if (exp < 0) | ||||
| 			{ | ||||
| 				if (!fitsPrecisionBase10(abs(value.denominator()), expAbs)) | ||||
|  | ||||
| @ -4,9 +4,6 @@ contract c { | ||||
|         a = 4 ** 4 ** 2 ** 4 ** 4 ** 4 ** 4; | ||||
|         a = -4 ** 4 ** 2 ** 4 ** 4 ** 4 ** 4 ** 4; | ||||
|         a = 4 ** (-(2 ** 4 ** 4 ** 4 ** 4 ** 4)); | ||||
|         a = 0 ** 1E1233; // fine | ||||
|         a = 1 ** 1E1233; // fine | ||||
|         a = -1 ** 1E1233; // fine | ||||
|         a = 2 ** 1E1233; | ||||
|         a = -2 ** 1E1233; | ||||
|         a = 2 ** -1E1233; | ||||
| @ -28,23 +25,23 @@ contract c { | ||||
| // TypeError: (116-153): Operator ** not compatible with types int_const 1797...(301 digits omitted)...7216 and int_const 4 | ||||
| // TypeError: (116-153): Type int_const 1797...(301 digits omitted)...7216 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (167-203): Operator ** not compatible with types int_const 4 and int_const -179...(302 digits omitted)...7216 | ||||
| // TypeError: (317-328): Operator ** not compatible with types int_const 2 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (342-354): Operator ** not compatible with types int_const -2 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (368-380): Operator ** not compatible with types int_const 2 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (394-407): Operator ** not compatible with types int_const -2 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (421-432): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 2 | ||||
| // TypeError: (421-432): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (446-458): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const 2 | ||||
| // TypeError: (446-458): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (472-484): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const -2 | ||||
| // TypeError: (472-484): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (498-511): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const -2 | ||||
| // TypeError: (498-511): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (525-541): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (525-541): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (555-572): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (555-572): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (586-603): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (586-603): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (617-635): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (617-635): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (217-228): Operator ** not compatible with types int_const 2 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (242-254): Operator ** not compatible with types int_const -2 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (268-280): Operator ** not compatible with types int_const 2 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (294-307): Operator ** not compatible with types int_const -2 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (321-332): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 2 | ||||
| // TypeError: (321-332): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (346-358): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const 2 | ||||
| // TypeError: (346-358): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (372-384): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const -2 | ||||
| // TypeError: (372-384): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (398-411): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const -2 | ||||
| // TypeError: (398-411): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (425-441): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (425-441): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (455-472): Operator ** not compatible with types int_const 1000...(1226 digits omitted)...0000 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (455-472): Type int_const 1000...(1226 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (486-503): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const 1000...(1226 digits omitted)...0000 | ||||
| // TypeError: (486-503): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| // TypeError: (517-535): Operator ** not compatible with types int_const -100...(1227 digits omitted)...0000 and int_const -100...(1227 digits omitted)...0000 | ||||
| // TypeError: (517-535): Type int_const -100...(1227 digits omitted)...0000 is not implicitly convertible to expected type int256. | ||||
| @ -0,0 +1,9 @@ | ||||
| contract c { | ||||
|     function f() public pure { | ||||
|         int a; | ||||
|         a = 0 ** 1E1233; | ||||
|         a = 1 ** 1E1233; | ||||
|         a = -1 ** 1E1233; | ||||
|         a = 0E123456789; | ||||
|     } | ||||
| } | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user