mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #4172 from ethereum/trailing_dot
[BREAKING] Disallow trailing dot not followed by number
This commit is contained in:
		
						commit
						0a1a8bfb09
					
				| @ -9,6 +9,7 @@ Breaking Changes: | ||||
|  * General: New keywords: ``calldata`` | ||||
|  * General: ``continue`` in a ``do...while`` loop jumps to the condition (it used to jump to the loop body). Warning: this may silently change the semantics of existing code. | ||||
|  * Type Checker: Disallow arithmetic operations for Boolean variables. | ||||
|  * Disallow trailing dots that are not followed by a number. | ||||
| 
 | ||||
| Language Features: | ||||
|  * General: Allow appending ``calldata`` keyword to types, to explicitly specify data location for arguments of external functions. | ||||
|  | ||||
| @ -768,8 +768,14 @@ Token::Value Scanner::scanNumber(char _charSeen) | ||||
| 			scanDecimalDigits();  // optional
 | ||||
| 			if (m_char == '.') | ||||
| 			{ | ||||
| 				// A '.' has to be followed by a number.
 | ||||
| 				if (m_source.isPastEndOfInput() || !isDecimalDigit(m_source.get(1))) | ||||
| 				{ | ||||
| 					literal.complete(); | ||||
| 					return Token::Number; | ||||
| 				} | ||||
| 				addLiteralCharAndAdvance(); | ||||
| 				scanDecimalDigits();  // optional
 | ||||
| 				scanDecimalDigits(); | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @ -127,6 +127,26 @@ BOOST_AUTO_TEST_CASE(scientific_notation) | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(trailing_dot) | ||||
| { | ||||
| 	Scanner scanner(CharStream("2.5")); | ||||
| 	BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Number); | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||
| 	scanner.reset(CharStream("2.5e10"), ""); | ||||
| 	BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Number); | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||
| 	scanner.reset(CharStream(".5"), ""); | ||||
| 	BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Number); | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||
| 	scanner.reset(CharStream(".5e10"), ""); | ||||
| 	BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Number); | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||
| 	scanner.reset(CharStream("2."), ""); | ||||
| 	BOOST_CHECK_EQUAL(scanner.currentToken(), Token::Number); | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::Period); | ||||
| 	BOOST_CHECK_EQUAL(scanner.next(), Token::EOS); | ||||
| } | ||||
| 
 | ||||
| BOOST_AUTO_TEST_CASE(negative_numbers) | ||||
| { | ||||
| 	Scanner scanner(CharStream("var x = -.2 + -0x78 + -7.3 + 8.9 + 2e-2;")); | ||||
|  | ||||
							
								
								
									
										7
									
								
								test/libsolidity/syntaxTests/parsing/trailing_dot1.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								test/libsolidity/syntaxTests/parsing/trailing_dot1.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| contract test { | ||||
| 	uint256 a = 2.2e10; | ||||
| 	uint256 b = .5E10; | ||||
| 	uint256 c = 4.e-2; | ||||
| } | ||||
| // ---- | ||||
| // TypeError: (70-73): Member "e" not found or not visible after argument-dependent lookup in int_const 4 | ||||
							
								
								
									
										7
									
								
								test/libsolidity/syntaxTests/parsing/trailing_dot2.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								test/libsolidity/syntaxTests/parsing/trailing_dot2.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,7 @@ | ||||
| contract test { | ||||
| 	uint256 a = 2.2e10; | ||||
| 	uint256 b = .5E10; | ||||
| 	uint256 c = 2 + 2.; | ||||
| } | ||||
| // ---- | ||||
| // ParserError: (76-77): Expected identifier but got ';' | ||||
							
								
								
									
										4
									
								
								test/libsolidity/syntaxTests/parsing/trailing_dot3.sol
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								test/libsolidity/syntaxTests/parsing/trailing_dot3.sol
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| contract test { | ||||
| 	uint a = 2. | ||||
| // ---- | ||||
| // ParserError: (29-29): Expected identifier but got end of source | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user