From 1681fbd8858f8e8b67c7a1413b2d85d1cccb4779 Mon Sep 17 00:00:00 2001 From: Lefteris Karapetsas Date: Sat, 28 Feb 2015 18:30:33 +0100 Subject: [PATCH] getInheritableMembers() does not look at BaseContracts - Also adding tests for improper accessing members of other contracts. --- libsolidity/AST.cpp | 27 +++++++++++------------- test/SolidityNameAndTypeResolution.cpp | 29 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 15 deletions(-) diff --git a/libsolidity/AST.cpp b/libsolidity/AST.cpp index 24a94a798..e5aef4cbb 100644 --- a/libsolidity/AST.cpp +++ b/libsolidity/AST.cpp @@ -215,26 +215,23 @@ vector> const& ContractDefinition::getInheritableMembers { set memberSeen; m_inheritableMembers.reset(new vector>()); - for (ContractDefinition const* contract: getLinearizedBaseContracts()) + auto addInheritableMember = [&](ASTPointer const& _decl) { - auto addInheritableMember = [&](ASTPointer const& _decl) + if (memberSeen.count(_decl->getName()) == 0 && _decl->isVisibleInDerivedContracts()) { - if (memberSeen.count(_decl->getName()) == 0 && _decl->isVisibleInDerivedContracts()) - { - memberSeen.insert(_decl->getName()); - m_inheritableMembers->push_back(_decl); - } - }; + memberSeen.insert(_decl->getName()); + m_inheritableMembers->push_back(_decl); + } + }; - for (ASTPointer const& f: contract->getDefinedFunctions()) - addInheritableMember(f); + for (ASTPointer const& f: getDefinedFunctions()) + addInheritableMember(f); - for (ASTPointer const& v: contract->getStateVariables()) - addInheritableMember(v); + for (ASTPointer const& v: getStateVariables()) + addInheritableMember(v); - for (ASTPointer const& s: contract->getDefinedStructs()) - addInheritableMember(s); - } + for (ASTPointer const& s: getDefinedStructs()) + addInheritableMember(s); } return *m_inheritableMembers; } diff --git a/test/SolidityNameAndTypeResolution.cpp b/test/SolidityNameAndTypeResolution.cpp index 58cebaebb..81d58d0dd 100644 --- a/test/SolidityNameAndTypeResolution.cpp +++ b/test/SolidityNameAndTypeResolution.cpp @@ -743,6 +743,35 @@ BOOST_AUTO_TEST_CASE(base_class_state_variable_internal_member) BOOST_CHECK_NO_THROW(parseTextAndResolveNamesWithChecks(text)); } +BOOST_AUTO_TEST_CASE(state_variable_member_of_wrong_class1) +{ + char const* text = "contract Parent1 {\n" + " uint256 internal m_aMember1;\n" + "}\n" + "contract Parent2 is Parent1{\n" + " uint256 internal m_aMember2;\n" + "}\n" + "contract Child is Parent2{\n" + " function foo() returns (uint256) { return Parent2.m_aMember1; }\n" + "}\n"; + BOOST_CHECK_THROW(parseTextAndResolveNames(text), TypeError); +} + +BOOST_AUTO_TEST_CASE(state_variable_member_of_wrong_class2) +{ + char const* text = "contract Parent1 {\n" + " uint256 internal m_aMember1;\n" + "}\n" + "contract Parent2 is Parent1{\n" + " uint256 internal m_aMember2;\n" + "}\n" + "contract Child is Parent2{\n" + " function foo() returns (uint256) { return Child.m_aMember2; }\n" + " uint256 public m_aMember3;\n" + "}\n"; + BOOST_CHECK_THROW(parseTextAndResolveNames(text), TypeError); +} + BOOST_AUTO_TEST_CASE(fallback_function) { char const* text = R"(