aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2016-09-06 23:52:17 +0800
committerGitHub <noreply@github.com>2016-09-06 23:52:17 +0800
commite8cb4d28970befb4c3e5052078e1b13812a44256 (patch)
treedf88d1347a554185a56360954592ccab2a38de51
parent453490cb61002622fadddf5838d29a8483f364ae (diff)
parent347b6b484398ccbb82fbc5cab0cada54bb07548a (diff)
downloaddexon-solidity-e8cb4d28970befb4c3e5052078e1b13812a44256.tar.gz
dexon-solidity-e8cb4d28970befb4c3e5052078e1b13812a44256.tar.zst
dexon-solidity-e8cb4d28970befb4c3e5052078e1b13812a44256.zip
Merge pull request #1018 from ethereum/constructor-constant
Constructor constant
-rw-r--r--Changelog.md1
-rw-r--r--libsolidity/analysis/TypeChecker.cpp8
-rw-r--r--test/libsolidity/SolidityNameAndTypeResolution.cpp11
3 files changed, 18 insertions, 2 deletions
diff --git a/Changelog.md b/Changelog.md
index 2d9c6c31..4d880a20 100644
--- a/Changelog.md
+++ b/Changelog.md
@@ -22,6 +22,7 @@ Breaking Changes:
* Modifiers: return does not skip part in modifier after ``_``
* Placeholder statement `_` in modifier now requires explicit `;`.
* ``ecrecover`` now returns zero if the input is malformed (it previously returned garbage)
+ * The ``constant`` keyword cannot be used for constructors or the fallback function.
* Removed ``--interface`` (Solidity interface) output option
* JSON AST: General cleanup, renamed many nodes to match their C++ names.
* Json Output: srcmap-runtime renamed to srcmapRuntime
diff --git a/libsolidity/analysis/TypeChecker.cpp b/libsolidity/analysis/TypeChecker.cpp
index fc1b1f59..41a5d39e 100644
--- a/libsolidity/analysis/TypeChecker.cpp
+++ b/libsolidity/analysis/TypeChecker.cpp
@@ -75,8 +75,12 @@ bool TypeChecker::visit(ContractDefinition const& _contract)
checkContractAbstractConstructors(_contract);
FunctionDefinition const* function = _contract.constructor();
- if (function && !function->returnParameters().empty())
- typeError(function->returnParameterList()->location(), "Non-empty \"returns\" directive for constructor.");
+ if (function) {
+ if (!function->returnParameters().empty())
+ typeError(function->returnParameterList()->location(), "Non-empty \"returns\" directive for constructor.");
+ if (function->isDeclaredConst())
+ typeError(function->location(), "Constructor cannot be defined as constant.");
+ }
FunctionDefinition const* fallbackFunction = nullptr;
for (FunctionDefinition const* function: _contract.definedFunctions())
diff --git a/test/libsolidity/SolidityNameAndTypeResolution.cpp b/test/libsolidity/SolidityNameAndTypeResolution.cpp
index 882557fd..4de2c126 100644
--- a/test/libsolidity/SolidityNameAndTypeResolution.cpp
+++ b/test/libsolidity/SolidityNameAndTypeResolution.cpp
@@ -3989,6 +3989,17 @@ BOOST_AUTO_TEST_CASE(unsatisfied_version)
BOOST_CHECK(expectError(text, true) == Error::Type::SyntaxError);
}
+BOOST_AUTO_TEST_CASE(constant_constructor)
+{
+ char const* text = R"(
+ contract test {
+ function test() constant {}
+ }
+ )";
+ BOOST_CHECK(expectError(text, false) == Error::Type::TypeError);
+}
+
+
BOOST_AUTO_TEST_SUITE_END()
}