diff --git a/Changelog.md b/Changelog.md index f256ac735..8eef012bb 100644 --- a/Changelog.md +++ b/Changelog.md @@ -32,6 +32,7 @@ Bugfixes: * SMTChecker: SSA control-flow did not take into account state variables that were modified inside inlined functions that were called inside branches. * Type System: Use correct type name for contracts in event parameters when used in libraries. This affected code generation. + * Type System: Allow direct call to base class functions that have overloads. * Yul: Properly register functions and disallow shadowing between function variables and variables in the outside scope. * Code Generator: Fix initialization routine of uninitialized internal function pointers in constructor context. diff --git a/libsolidity/ast/AST.cpp b/libsolidity/ast/AST.cpp index cdb29968a..685b821d0 100644 --- a/libsolidity/ast/AST.cpp +++ b/libsolidity/ast/AST.cpp @@ -215,16 +215,12 @@ vector const& ContractDefinition::inheritableMembers() const { if (!m_inheritableMembers) { - set memberSeen; m_inheritableMembers.reset(new vector()); auto addInheritableMember = [&](Declaration const* _decl) { solAssert(_decl, "addInheritableMember got a nullpointer."); - if (memberSeen.count(_decl->name()) == 0 && _decl->isVisibleInDerivedContracts()) - { - memberSeen.insert(_decl->name()); + if (_decl->isVisibleInDerivedContracts()) m_inheritableMembers->push_back(_decl); - } }; for (FunctionDefinition const* f: definedFunctions()) diff --git a/test/libsolidity/semanticTests/functionCall/base_base_overload.sol b/test/libsolidity/semanticTests/functionCall/base_base_overload.sol new file mode 100644 index 000000000..ecc29b7a2 --- /dev/null +++ b/test/libsolidity/semanticTests/functionCall/base_base_overload.sol @@ -0,0 +1,50 @@ +contract BaseBase { + uint public x; + uint public y; + function init(uint a, uint b) public { + x = b; + y = a; + } + function init(uint a) public { + x = a + 1; + } +} + +contract Base is BaseBase { + function init(uint a, uint b) public { + x = a; + y = b; + } + function init(uint a) public { + x = a; + } +} + +contract Child is Base { + function cInit(uint c) public { + Base.init(c); + } + function cInit(uint c, uint d) public { + Base.init(c, d); + } + function bInit(uint c) public { + BaseBase.init(c); + } + function bInit(uint c, uint d) public { + BaseBase.init(c, d); + } +} +// ---- +// x() -> 0 +// y() -> 0 +// cInit(uint256): 2 -> +// x() -> 2 +// y() -> 0 +// cInit(uint256,uint256): 3, 3 -> +// x() -> 3 +// y() -> 3 +// bInit(uint256): 4 -> +// x() -> 5 +// bInit(uint256,uint256): 9, 10 -> +// x() -> 10 +// y() -> 9 diff --git a/test/libsolidity/semanticTests/functionCall/base_overload.sol b/test/libsolidity/semanticTests/functionCall/base_overload.sol new file mode 100644 index 000000000..924431ec5 --- /dev/null +++ b/test/libsolidity/semanticTests/functionCall/base_overload.sol @@ -0,0 +1,29 @@ +contract Base { + uint public x; + uint public y; + function init(uint a, uint b) public { + x = a; + y = b; + } + function init(uint a) public { + x = a; + } +} + +contract Child is Base { + function cInit(uint c) public { + Base.init(c); + } + function cInit(uint c, uint d) public { + Base.init(c, d); + } +} +// ---- +// x() -> 0 +// y() -> 0 +// cInit(uint256): 2 -> +// x() -> 2 +// y() -> 0 +// cInit(uint256,uint256): 3, 3 -> +// x() -> 3 +// y() -> 3