mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #10710 from ethereum/implicit-conversion-bug
Disallow certain implicit conversions between integer types.
This commit is contained in:
		
						commit
						99add1e4e5
					
				| @ -17,6 +17,7 @@ Bugfixes: | ||||
|  * SMTChecker: Fix false negatives when analyzing external function calls. | ||||
|  * SMTChecker: Fix missing type constraints for block variables. | ||||
|  * SMTChecker: Fix internal error on ``block.chainid``. | ||||
|  * Type System: Disallow implicit conversion from ``uintN`` to ``intM`` when ``M > N``, and by extension, explicit conversion between the same types is also disallowed. | ||||
| 
 | ||||
| ### 0.8.0 (2020-12-16) | ||||
| 
 | ||||
|  | ||||
| @ -510,12 +510,13 @@ BoolResult IntegerType::isImplicitlyConvertibleTo(Type const& _convertTo) const | ||||
| 	if (_convertTo.category() == category()) | ||||
| 	{ | ||||
| 		IntegerType const& convertTo = dynamic_cast<IntegerType const&>(_convertTo); | ||||
| 		if (convertTo.m_bits < m_bits) | ||||
| 		// disallowing unsigned to signed conversion of different bits
 | ||||
| 		if (isSigned() != convertTo.isSigned()) | ||||
| 			return false; | ||||
| 		else if (convertTo.m_bits < m_bits) | ||||
| 			return false; | ||||
| 		else if (isSigned()) | ||||
| 			return convertTo.isSigned(); | ||||
| 		else | ||||
| 			return !convertTo.isSigned() || convertTo.m_bits > m_bits; | ||||
| 			return true; | ||||
| 	} | ||||
| 	else if (_convertTo.category() == Category::FixedPoint) | ||||
| 	{ | ||||
|  | ||||
| @ -61,7 +61,7 @@ contract ScalarEvent is Event { | ||||
|             convertedWinningOutcome = OUTCOME_RANGE; | ||||
|         // Map outcome to outcome range | ||||
|         else | ||||
|             convertedWinningOutcome = uint24(uint(OUTCOME_RANGE * (outcome - lowerBound) / (upperBound - lowerBound))); | ||||
|             convertedWinningOutcome = uint24(uint(int(uint(OUTCOME_RANGE)) * (outcome - lowerBound) / (upperBound - lowerBound))); | ||||
|         uint factorShort = OUTCOME_RANGE - convertedWinningOutcome; | ||||
|         uint factorLong = OUTCOME_RANGE - factorShort; | ||||
|         uint shortOutcomeTokenCount = outcomeTokens[SHORT].balanceOf(msg.sender); | ||||
|  | ||||
| @ -1,6 +1,6 @@ | ||||
| contract test { | ||||
|     function f() public { uint32(2) == int64(2); } | ||||
|     function f() public { uint32(2) == uint64(2); } | ||||
| } | ||||
| // ---- | ||||
| // Warning 6133: (42-63): Statement has no effect. | ||||
| // Warning 2018: (20-66): Function state mutability can be restricted to pure | ||||
| // Warning 6133: (42-64): Statement has no effect. | ||||
| // Warning 2018: (20-67): Function state mutability can be restricted to pure | ||||
|  | ||||
							
								
								
									
										13
									
								
								test/libsolidity/syntaxTests/types/integer_implicit_err.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								test/libsolidity/syntaxTests/types/integer_implicit_err.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| contract C | ||||
| { | ||||
|     function f() public pure { | ||||
|         uint16 a = 1; | ||||
|         int32 b = a; | ||||
| 
 | ||||
|         uint256 c = 10; | ||||
|         int8 d = c; | ||||
|     } | ||||
| } | ||||
| // ---- | ||||
| // TypeError 9574: (74-85): Type uint16 is not implicitly convertible to expected type int32. | ||||
| // TypeError 9574: (120-130): Type uint256 is not implicitly convertible to expected type int8. | ||||
| @ -37,6 +37,10 @@ contract C | ||||
| 
 | ||||
|         B n = B(address(uint160(uint(int(100))))); | ||||
|         n; | ||||
| 
 | ||||
|         uint8 o = 1; | ||||
|         int16 p = int16(o); | ||||
|     } | ||||
| } | ||||
| // ---- | ||||
| // TypeError 9640: (801-809): Explicit type conversion not allowed from "uint8" to "int16". | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user