diff options
author | chriseth <chris@ethereum.org> | 2017-09-14 23:53:43 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-09-14 23:53:43 +0800 |
commit | 24fd67b7db26f44ddc6b6db0b6f685d887762df0 (patch) | |
tree | 3982eca046948d719e4dd824aa82b3573db2a244 | |
parent | 1c85ba10e13879f680579031234c911099433596 (diff) | |
download | dexon-solidity-24fd67b7db26f44ddc6b6db0b6f685d887762df0.tar.gz dexon-solidity-24fd67b7db26f44ddc6b6db0b6f685d887762df0.tar.zst dexon-solidity-24fd67b7db26f44ddc6b6db0b6f685d887762df0.zip |
Enforce view with error for experimental 0.5.0.
-rw-r--r-- | Changelog.md | 1 | ||||
-rw-r--r-- | libsolidity/analysis/ViewPureChecker.cpp | 34 | ||||
-rw-r--r-- | libsolidity/analysis/ViewPureChecker.h | 1 | ||||
-rw-r--r-- | test/libsolidity/ViewPureChecker.cpp | 10 |
4 files changed, 35 insertions, 11 deletions
diff --git a/Changelog.md b/Changelog.md index d0d4d8df..18253a32 100644 --- a/Changelog.md +++ b/Changelog.md @@ -9,6 +9,7 @@ Features: * Type Checker: Greatly reduce the number of duplicate errors shown for duplicate constructors and functions. * Type Checker: Warn on using literals as tight packing parameters in ``keccak256``, ``sha3``, ``sha256`` and ``ripemd160``. * Type Checker: Enforce ``view`` and ``pure``. + * Type Checker: Enforce ``view`` / ``constant`` with error as experimental 0.5.0 feature. Bugfixes: * ABI JSON: Include all overloaded events. 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; diff --git a/test/libsolidity/ViewPureChecker.cpp b/test/libsolidity/ViewPureChecker.cpp index 9cea9850..cdb752cd 100644 --- a/test/libsolidity/ViewPureChecker.cpp +++ b/test/libsolidity/ViewPureChecker.cpp @@ -143,6 +143,16 @@ BOOST_AUTO_TEST_CASE(environment_access) } } +BOOST_AUTO_TEST_CASE(view_error_for_050) +{ + CHECK_ERROR( + "pragma experimental \"v0.5.0\"; contract C { uint x; function f() view { x = 2; } }", + TypeError, + "Function declared as view, but this expression (potentially) modifies the state and thus requires non-payable (the default) or payable." + ); + +} + BOOST_AUTO_TEST_CASE(modifiers) { string text = R"( |