From 24fd67b7db26f44ddc6b6db0b6f685d887762df0 Mon Sep 17 00:00:00 2001 From: chriseth Date: Thu, 14 Sep 2017 17:53:43 +0200 Subject: Enforce view with error for experimental 0.5.0. --- libsolidity/analysis/ViewPureChecker.cpp | 34 +++++++++++++++++++++----------- libsolidity/analysis/ViewPureChecker.h | 1 + 2 files changed, 24 insertions(+), 11 deletions(-) (limited to 'libsolidity') diff --git a/libsolidity/analysis/ViewPureChecker.cpp b/libsolidity/analysis/ViewPureChecker.cpp index 8f9d41c9..7f28c7d2 100644 --- a/libsolidity/analysis/ViewPureChecker.cpp +++ b/libsolidity/analysis/ViewPureChecker.cpp @@ -20,6 +20,7 @@ #include #include +#include #include @@ -102,22 +103,31 @@ private: bool ViewPureChecker::check() { - vector contracts; + // The bool means "enforce view with errors". + map contracts; for (auto const& node: m_ast) { SourceUnit const* source = dynamic_cast(node.get()); solAssert(source, ""); - contracts += source->filteredNodes(source->nodes()); + bool enforceView = source->annotation().experimentalFeatures.count(ExperimentalFeature::V050); + for (ContractDefinition const* c: source->filteredNodes(source->nodes())) + contracts[c] = enforceView; } // Check modifiers first to infer their state mutability. - for (auto const* contract: contracts) - for (ModifierDefinition const* mod: contract->functionModifiers()) + for (auto const& contract: contracts) + { + m_enforceViewWithError = contract.second; + for (ModifierDefinition const* mod: contract.first->functionModifiers()) mod->accept(*this); + } - for (auto const* contract: contracts) - contract->accept(*this); + for (auto const& contract: contracts) + { + m_enforceViewWithError = contract.second; + contract.first->accept(*this); + } return !m_errors; } @@ -223,16 +233,18 @@ void ViewPureChecker::reportMutability(StateMutability _mutability, SourceLocati else solAssert(false, ""); - if (m_currentFunction->stateMutability() == StateMutability::View) - // TODO Change this to error with 0.5.0 + solAssert( + m_currentFunction->stateMutability() == StateMutability::View || + m_currentFunction->stateMutability() == StateMutability::Pure, + "" + ); + if (!m_enforceViewWithError && m_currentFunction->stateMutability() == StateMutability::View) m_errorReporter.warning(_location, text); - else if (m_currentFunction->stateMutability() == StateMutability::Pure) + else { m_errors = true; m_errorReporter.typeError(_location, text); } - else - solAssert(false, ""); } if (_mutability > m_currentBestMutability) m_currentBestMutability = _mutability; diff --git a/libsolidity/analysis/ViewPureChecker.h b/libsolidity/analysis/ViewPureChecker.h index ae303533..fec060b6 100644 --- a/libsolidity/analysis/ViewPureChecker.h +++ b/libsolidity/analysis/ViewPureChecker.h @@ -70,6 +70,7 @@ private: ErrorReporter& m_errorReporter; bool m_errors = false; + bool m_enforceViewWithError = false; StateMutability m_currentBestMutability = StateMutability::Payable; FunctionDefinition const* m_currentFunction = nullptr; std::map m_inferredMutability; -- cgit