Merge pull request #4508 from ethereum/nameCollisionCrash

[BREAKING] Don't exclude public state variables when looking for conflicting declarations.
This commit is contained in:
Alex Beregszaszi 2018-08-01 20:53:56 +01:00 committed by GitHub
commit a78565e44f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 44 additions and 12 deletions

View File

@ -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.

View File

@ -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

View File

@ -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)

View File

@ -0,0 +1,2 @@
interface ERC20 { function x() external returns (uint); }
contract C is ERC20 { uint public x; }

View File

@ -0,0 +1,8 @@
contract A {
uint public x;
}
contract C is A {
function x() public returns (uint);
}
// ----
// DeclarationError: (50-85): Identifier already declared.

View File

@ -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.

View File

@ -0,0 +1,6 @@
contract C {
function f(uint) public pure {}
uint public f = 0;
}
// ----
// DeclarationError: (53-70): Identifier already declared.

View File

@ -0,0 +1,6 @@
contract C {
uint public f = 0;
function f(uint) public pure {}
}
// ----
// DeclarationError: (40-71): Identifier already declared.

View File

@ -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