aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorErik Kundt <bitshift@posteo.org>2018-07-18 04:46:17 +0800
committerErik Kundt <bitshift@posteo.org>2018-07-18 20:29:01 +0800
commitb0b35e1e6b762d3849710054fdb2e1909f6780d9 (patch)
tree89286fe1b0d2b74aad406f2c4a3e6699c29676b3
parentde6cd2425b6ea9cdf2a7b7f49cd88e4f18fa20e3 (diff)
downloaddexon-solidity-b0b35e1e6b762d3849710054fdb2e1909f6780d9.tar.gz
dexon-solidity-b0b35e1e6b762d3849710054fdb2e1909f6780d9.tar.zst
dexon-solidity-b0b35e1e6b762d3849710054fdb2e1909f6780d9.zip
Adds warning if function is shadowing a contract.
-rw-r--r--libsolidity/analysis/NameAndTypeResolver.cpp10
-rw-r--r--test/libsolidity/syntaxTests/constructor/constructor_old.sol1
-rw-r--r--test/libsolidity/syntaxTests/constructor/overriding_constructor.sol14
3 files changed, 11 insertions, 14 deletions
diff --git a/libsolidity/analysis/NameAndTypeResolver.cpp b/libsolidity/analysis/NameAndTypeResolver.cpp
index e0880ec9..823378c7 100644
--- a/libsolidity/analysis/NameAndTypeResolver.cpp
+++ b/libsolidity/analysis/NameAndTypeResolver.cpp
@@ -482,15 +482,7 @@ bool DeclarationRegistrationHelper::registerDeclaration(
Declaration const* shadowedDeclaration = nullptr;
if (_warnOnShadow && !name.empty() && _container.enclosingContainer())
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.
// They cannot both be true at the same time.
diff --git a/test/libsolidity/syntaxTests/constructor/constructor_old.sol b/test/libsolidity/syntaxTests/constructor/constructor_old.sol
index 127f9176..9ead6858 100644
--- a/test/libsolidity/syntaxTests/constructor/constructor_old.sol
+++ b/test/libsolidity/syntaxTests/constructor/constructor_old.sol
@@ -1,3 +1,4 @@
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.
+// Warning: (13-35): This declaration shadows an existing declaration.
diff --git a/test/libsolidity/syntaxTests/constructor/overriding_constructor.sol b/test/libsolidity/syntaxTests/constructor/overriding_constructor.sol
index a38d901d..30cf3bce 100644
--- a/test/libsolidity/syntaxTests/constructor/overriding_constructor.sol
+++ b/test/libsolidity/syntaxTests/constructor/overriding_constructor.sol
@@ -1,6 +1,10 @@
-contract A { constructor() public {} }
-contract B is A { function A() public pure returns (uint8) {} }
-contract C is A { function A() public pure returns (uint8) {} }
-contract D is B { function B() public pure returns (uint8) {} }
-contract E is D { function B() public pure returns (uint8) {} }
+contract A { function f() public {} }
+contract B is A {
+ function A() public pure returns (uint8) {}
+ function g() public {
+ 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).