Adds warning if function is shadowing a contract.

This commit is contained in:
Erik Kundt 2018-07-17 22:46:17 +02:00
parent de6cd2425b
commit b0b35e1e6b
3 changed files with 11 additions and 14 deletions

View File

@ -482,14 +482,6 @@ bool DeclarationRegistrationHelper::registerDeclaration(
Declaration const* shadowedDeclaration = nullptr; Declaration const* shadowedDeclaration = nullptr;
if (_warnOnShadow && !name.empty() && _container.enclosingContainer()) if (_warnOnShadow && !name.empty() && _container.enclosingContainer())
for (auto const* decl: _container.enclosingContainer()->resolveName(name, true, true)) for (auto const* decl: _container.enclosingContainer()->resolveName(name, true, true))
// Do not warn about functions shadowing a contract.
if (
!(
dynamic_cast<ContractDefinition const*>(decl) &&
dynamic_cast<FunctionDefinition const*>(&_declaration) &&
name == decl->name()
)
)
shadowedDeclaration = decl; shadowedDeclaration = decl;
// We use "invisible" for both inactive variables in blocks and for members invisible in contracts. // We use "invisible" for both inactive variables in blocks and for members invisible in contracts.

View File

@ -1,3 +1,4 @@
contract A { function A() public {} } contract A { function A() public {} }
// ---- // ----
// SyntaxError: (13-35): Functions are not allowed to have the same name as the contract. If you intend this to be a constructor, use "constructor(...) { ... }" to define it. // SyntaxError: (13-35): Functions are not allowed to have the same name as the contract. If you intend this to be a constructor, use "constructor(...) { ... }" to define it.
// Warning: (13-35): This declaration shadows an existing declaration.

View File

@ -1,6 +1,10 @@
contract A { constructor() public {} } contract A { function f() public {} }
contract B is A { function A() public pure returns (uint8) {} } contract B is A {
contract C is A { function A() public pure returns (uint8) {} } function A() public pure returns (uint8) {}
contract D is B { function B() public pure returns (uint8) {} } function g() public {
contract E is D { function B() public pure returns (uint8) {} } A.f();
}
}
// ---- // ----
// Warning: (58-101): This declaration shadows an existing declaration.
// TypeError: (130-133): Member "f" not found or not visible after argument-dependent lookup in function () pure returns (uint8).