mirror of
				https://github.com/ethereum/solidity
				synced 2023-10-03 13:03:40 +00:00 
			
		
		
		
	Merge pull request #4508 from ethereum/nameCollisionCrash
[BREAKING] Don't exclude public state variables when looking for conflicting declarations.
This commit is contained in:
		
						commit
						a78565e44f
					
				| @ -32,6 +32,7 @@ Breaking Changes: | |||||||
|  * General: Remove assembly instruction aliases ``sha3`` and ``suicide`` |  * General: Remove assembly instruction aliases ``sha3`` and ``suicide`` | ||||||
|  * General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode. |  * General: C99-style scoping rules are enforced now. This was already the case in the experimental 0.5.0 mode. | ||||||
|  * General: Disallow combining hex numbers with unit denominations (e.g. ``0x1e wei``). This was already the case in the experimental 0.5.0 mode. |  * General: Disallow combining hex numbers with unit denominations (e.g. ``0x1e wei``). This was already the case in the experimental 0.5.0 mode. | ||||||
|  |  * Name Resolver: Do not exclude public state variables when looking for conflicting declarations. | ||||||
|  * Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence. |  * Optimizer: Remove the no-op ``PUSH1 0 NOT AND`` sequence. | ||||||
|  * Parser: Disallow trailing dots that are not followed by a number. |  * Parser: Disallow trailing dots that are not followed by a number. | ||||||
|  * Parser: Remove ``constant`` as function state mutability modifer. |  * Parser: Remove ``constant`` as function state mutability modifer. | ||||||
|  | |||||||
| @ -232,7 +232,7 @@ activate themselves. | |||||||
|         // absolute unix timestamps (seconds since 1970-01-01) |         // absolute unix timestamps (seconds since 1970-01-01) | ||||||
|         // or time periods in seconds. |         // or time periods in seconds. | ||||||
|         address public beneficiary; |         address public beneficiary; | ||||||
|         uint public auctionEnd; |         uint public auctionEndTime; | ||||||
| 
 | 
 | ||||||
|         // Current state of the auction. |         // Current state of the auction. | ||||||
|         address public highestBidder; |         address public highestBidder; | ||||||
| @ -261,7 +261,7 @@ activate themselves. | |||||||
|             address _beneficiary |             address _beneficiary | ||||||
|         ) public { |         ) public { | ||||||
|             beneficiary = _beneficiary; |             beneficiary = _beneficiary; | ||||||
|             auctionEnd = now + _biddingTime; |             auctionEndTime = now + _biddingTime; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         /// Bid on the auction with the value sent |         /// Bid on the auction with the value sent | ||||||
| @ -278,7 +278,7 @@ activate themselves. | |||||||
|             // Revert the call if the bidding |             // Revert the call if the bidding | ||||||
|             // period is over. |             // period is over. | ||||||
|             require( |             require( | ||||||
|                 now <= auctionEnd, |                 now <= auctionEndTime, | ||||||
|                 "Auction already ended." |                 "Auction already ended." | ||||||
|             ); |             ); | ||||||
| 
 | 
 | ||||||
| @ -337,7 +337,7 @@ activate themselves. | |||||||
|             // external contracts. |             // external contracts. | ||||||
| 
 | 
 | ||||||
|             // 1. Conditions |             // 1. Conditions | ||||||
|             require(now >= auctionEnd, "Auction not yet ended."); |             require(now >= auctionEndTime, "Auction not yet ended."); | ||||||
|             require(!ended, "auctionEnd has already been called."); |             require(!ended, "auctionEnd has already been called."); | ||||||
| 
 | 
 | ||||||
|             // 2. Effects |             // 2. Effects | ||||||
|  | |||||||
| @ -49,16 +49,10 @@ Declaration const* DeclarationContainer::conflictingDeclaration( | |||||||
| 		dynamic_cast<MagicVariableDeclaration const*>(&_declaration) | 		dynamic_cast<MagicVariableDeclaration const*>(&_declaration) | ||||||
| 	) | 	) | ||||||
| 	{ | 	{ | ||||||
| 		// check that all other declarations with the same name are functions or a public state variable or events.
 | 		// check that all other declarations are of the same kind (in which
 | ||||||
| 		// And then check that the signatures are different.
 | 		// case the type checker will ensure that the signatures are different)
 | ||||||
| 		for (Declaration const* declaration: declarations) | 		for (Declaration const* declaration: declarations) | ||||||
| 		{ | 		{ | ||||||
| 			if (auto variableDeclaration = dynamic_cast<VariableDeclaration const*>(declaration)) |  | ||||||
| 			{ |  | ||||||
| 				if (variableDeclaration->isStateVariable() && !variableDeclaration->isConstant() && variableDeclaration->isPublic()) |  | ||||||
| 					continue; |  | ||||||
| 				return declaration; |  | ||||||
| 			} |  | ||||||
| 			if ( | 			if ( | ||||||
| 				dynamic_cast<FunctionDefinition const*>(&_declaration) && | 				dynamic_cast<FunctionDefinition const*>(&_declaration) && | ||||||
| 				!dynamic_cast<FunctionDefinition const*>(declaration) | 				!dynamic_cast<FunctionDefinition const*>(declaration) | ||||||
|  | |||||||
| @ -0,0 +1,2 @@ | |||||||
|  | interface ERC20 { function x() external returns (uint); } | ||||||
|  | contract C is ERC20 { uint public x; } | ||||||
| @ -0,0 +1,8 @@ | |||||||
|  | contract A { | ||||||
|  | 	uint public x; | ||||||
|  | } | ||||||
|  | contract C is A { | ||||||
|  | 	function x() public returns (uint); | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // DeclarationError: (50-85): Identifier already declared. | ||||||
| @ -8,4 +8,5 @@ contract C { | |||||||
|     } |     } | ||||||
| } | } | ||||||
| // ---- | // ---- | ||||||
|  | // DeclarationError: (150-179): Identifier already declared. | ||||||
| // DeclarationError: (114-120): Identifier not found or not unique. | // DeclarationError: (114-120): Identifier not found or not unique. | ||||||
|  | |||||||
| @ -0,0 +1,6 @@ | |||||||
|  | contract C { | ||||||
|  |     function f(uint) public pure {} | ||||||
|  |     uint public f = 0; | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // DeclarationError: (53-70): Identifier already declared. | ||||||
| @ -0,0 +1,6 @@ | |||||||
|  | contract C { | ||||||
|  |     uint public f = 0; | ||||||
|  |     function f(uint) public pure {} | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // DeclarationError: (40-71): Identifier already declared. | ||||||
| @ -0,0 +1,14 @@ | |||||||
|  | // This used to crash with some compiler versions. | ||||||
|  | contract SomeContract { | ||||||
|  | 
 | ||||||
|  |   uint public balance = 0; | ||||||
|  | 
 | ||||||
|  |   function balance(uint number) public {} | ||||||
|  | 
 | ||||||
|  |   function doSomething() public { | ||||||
|  |     balance(3); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | // ---- | ||||||
|  | // DeclarationError: (106-145): Identifier already declared. | ||||||
|  | // TypeError: (185-195): Type is not callable | ||||||
		Loading…
	
		Reference in New Issue
	
	Block a user