diff options
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/analysis/ViewPureChecker.cpp | 34 | ||||
-rw-r--r-- | libsolidity/analysis/ViewPureChecker.h | 1 |
2 files changed, 24 insertions, 11 deletions
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 <libevmasm/SemanticInformation.h> #include <libsolidity/inlineasm/AsmData.h> +#include <libsolidity/ast/ExperimentalFeatures.h> #include <functional> @@ -102,22 +103,31 @@ private: bool ViewPureChecker::check() { - vector<ContractDefinition const*> contracts; + // The bool means "enforce view with errors". + map<ContractDefinition const*, bool> contracts; for (auto const& node: m_ast) { SourceUnit const* source = dynamic_cast<SourceUnit const*>(node.get()); solAssert(source, ""); - contracts += source->filteredNodes<ContractDefinition>(source->nodes()); + bool enforceView = source->annotation().experimentalFeatures.count(ExperimentalFeature::V050); + for (ContractDefinition const* c: source->filteredNodes<ContractDefinition>(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<ModifierDefinition const*, StateMutability> m_inferredMutability; |