aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/analysis/ContractLevelChecker.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-11-30 01:26:53 +0800
committerchriseth <chris@ethereum.org>2018-11-30 23:30:19 +0800
commit2a85152463e3990d4695978613efddbcebe29b5b (patch)
tree9403a55686f1ef6bb49d1877a2c1b34dc31e6242 /libsolidity/analysis/ContractLevelChecker.cpp
parentb610be4882ca77defb73e35eda93996ca790f9f4 (diff)
downloaddexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.tar
dexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.tar.gz
dexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.tar.bz2
dexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.tar.lz
dexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.tar.xz
dexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.tar.zst
dexon-solidity-2a85152463e3990d4695978613efddbcebe29b5b.zip
Move constructor checks.
Diffstat (limited to 'libsolidity/analysis/ContractLevelChecker.cpp')
-rw-r--r--libsolidity/analysis/ContractLevelChecker.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/libsolidity/analysis/ContractLevelChecker.cpp b/libsolidity/analysis/ContractLevelChecker.cpp
index 0ddb198f..879903de 100644
--- a/libsolidity/analysis/ContractLevelChecker.cpp
+++ b/libsolidity/analysis/ContractLevelChecker.cpp
@@ -40,6 +40,7 @@ bool ContractLevelChecker::check(ContractDefinition const& _contract)
checkIllegalOverrides(_contract);
checkAbstractFunctions(_contract);
checkBaseConstructorArguments(_contract);
+ checkConstructor(_contract);
return Error::containsOnlyWarnings(m_errorReporter.errors());
}
@@ -339,3 +340,22 @@ void ContractLevelChecker::annotateBaseConstructorArguments(
}
}
+
+void ContractLevelChecker::checkConstructor(ContractDefinition const& _contract)
+{
+ FunctionDefinition const* constructor = _contract.constructor();
+ if (!constructor)
+ return;
+
+ if (!constructor->returnParameters().empty())
+ m_errorReporter.typeError(constructor->returnParameterList()->location(), "Non-empty \"returns\" directive for constructor.");
+ if (constructor->stateMutability() != StateMutability::NonPayable && constructor->stateMutability() != StateMutability::Payable)
+ m_errorReporter.typeError(
+ constructor->location(),
+ "Constructor must be payable or non-payable, but is \"" +
+ stateMutabilityToString(constructor->stateMutability()) +
+ "\"."
+ );
+ if (constructor->visibility() != FunctionDefinition::Visibility::Public && constructor->visibility() != FunctionDefinition::Visibility::Internal)
+ m_errorReporter.typeError(constructor->location(), "Constructor must be public or internal.");
+}