From 71c2c7da45738a97d2c24590dfeac3fc72033015 Mon Sep 17 00:00:00 2001 From: Liana Husikyan Date: Thu, 7 May 2015 18:12:58 +0200 Subject: [PATCH] fixed the test --- libsolidity/NameAndTypeResolver.cpp | 10 ++++--- libsolidity/NameAndTypeResolver.h | 2 +- test/libsolidity/SolidityEndToEndTest.cpp | 29 +++++++++++++++++++ .../SolidityNameAndTypeResolution.cpp | 19 ------------ 4 files changed, 36 insertions(+), 24 deletions(-) diff --git a/libsolidity/NameAndTypeResolver.cpp b/libsolidity/NameAndTypeResolver.cpp index ac841fccc..21b332924 100644 --- a/libsolidity/NameAndTypeResolver.cpp +++ b/libsolidity/NameAndTypeResolver.cpp @@ -130,12 +130,14 @@ vector NameAndTypeResolver::getNameFromCurrentScope(ASTStrin return m_currentScope->resolveName(_name, _recursive); } -vector NameAndTypeResolver::cleanupedDeclarations(Identifier const& _identifier) +vector NameAndTypeResolver::cleanupedDeclarations( + Identifier const& _identifier, + vector const& _declarations +) { vector uniqueFunctions; - auto declarations = m_currentScope->resolveName(_identifier.getName()); - for (auto it = declarations.begin(); it != declarations.end(); ++it) + for (auto it = _declarations.begin(); it != _declarations.end(); ++it) { solAssert(*it, ""); // the declaration is functionDefinition while declarations > 1 @@ -480,7 +482,7 @@ bool ReferencesResolver::visit(Identifier& _identifier) else if (declarations.size() == 1) _identifier.setReferencedDeclaration(*declarations.front(), m_currentContract); else - _identifier.setOverloadedDeclarations(m_resolver.cleanupedDeclarations(_identifier)); + _identifier.setOverloadedDeclarations(m_resolver.cleanupedDeclarations(_identifier, declarations)); return false; } diff --git a/libsolidity/NameAndTypeResolver.h b/libsolidity/NameAndTypeResolver.h index 21857352c..7855217a2 100644 --- a/libsolidity/NameAndTypeResolver.h +++ b/libsolidity/NameAndTypeResolver.h @@ -62,7 +62,7 @@ public: /// resolving phase. std::vector getNameFromCurrentScope(ASTString const& _name, bool _recursive = true); - std::vector cleanupedDeclarations(Identifier const& _identifier); + std::vector cleanupedDeclarations(Identifier const& _identifier, std::vector const& _declarations); private: void reset(); diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index f168ad454..2fd1e2ec2 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -3910,6 +3910,35 @@ BOOST_AUTO_TEST_CASE(external_types_in_calls) BOOST_CHECK(callContractFunction("nonexisting") == encodeArgs(u256(9))); } +BOOST_AUTO_TEST_CASE(proper_order_of_overwriting_of_attributes) +{ + // bug #1798 + char const* sourceCode = R"( + contract init { + function isOk() returns (bool) { return false; } + bool public ok = false; + } + contract fix { + function isOk() returns (bool) { return true; } + bool public ok = true; + } + + contract init_fix is init, fix { + function checkOk() returns (bool) { return ok; } + } + contract fix_init is fix, init { + function checkOk() returns (bool) { return ok; } + } + )"; + compileAndRun(sourceCode, 0, "init_fix"); + BOOST_CHECK(callContractFunction("isOk()") == encodeArgs(true)); + BOOST_CHECK(callContractFunction("ok()") == encodeArgs(true)); + + compileAndRun(sourceCode, 0, "fix_init"); + BOOST_CHECK(callContractFunction("isOk()") == encodeArgs(false)); + BOOST_CHECK(callContractFunction("ok()") == encodeArgs(false)); +} + BOOST_AUTO_TEST_SUITE_END() } diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp index 9616777ab..c317dad97 100644 --- a/test/libsolidity/SolidityNameAndTypeResolution.cpp +++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp @@ -1761,25 +1761,6 @@ BOOST_AUTO_TEST_CASE(uninitialized_var) BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError); } -BOOST_AUTO_TEST_CASE(deny_overwriting_of_attributes_when_deriving) -{ - // bug #1798 - char const* sourceCode = R"( - contract owned { - address owner; - } - - contract reg { - function owner(bytes32 x) returns (address) {} - } - - contract x is owned, reg { - } - )"; - ETH_TEST_CHECK_NO_THROW(parseTextAndResolveNames(sourceCode), "Parsing and Name Resolving Failed"); - //BOOST_CHECK_THROW(parseTextAndResolveNames(sourceCode), TypeError); -} - BOOST_AUTO_TEST_SUITE_END() }