aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian <c@ethdev.com>2014-12-15 23:09:50 +0800
committerChristian <c@ethdev.com>2014-12-15 23:09:50 +0800
commitc40725c22adaa2159bd06894740f7559733afbb4 (patch)
tree979ec3f5ba0d4540097e56fd08f809880f35b7de
parent40f7c32e57cf8b09d45f52935b8726f5baef5358 (diff)
downloaddexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.tar
dexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.tar.gz
dexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.tar.bz2
dexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.tar.lz
dexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.tar.xz
dexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.tar.zst
dexon-solidity-c40725c22adaa2159bd06894740f7559733afbb4.zip
Check that constructor does not have "returns" directive.
-rw-r--r--AST.cpp11
-rw-r--r--AST.h4
-rw-r--r--NameAndTypeResolver.cpp6
3 files changed, 16 insertions, 5 deletions
diff --git a/AST.cpp b/AST.cpp
index 3fcf8ba0..5e344ead 100644
--- a/AST.cpp
+++ b/AST.cpp
@@ -39,6 +39,17 @@ TypeError ASTNode::createTypeError(string const& _description) const
return TypeError() << errinfo_sourceLocation(getLocation()) << errinfo_comment(_description);
}
+void ContractDefinition::checkTypeRequirements()
+{
+ FunctionDefinition const* constructor = getConstructor();
+ if (constructor && !constructor->getReturnParameters().empty())
+ BOOST_THROW_EXCEPTION(constructor->getReturnParameterList()->createTypeError(
+ "Non-empty \"returns\" directive for constructor."));
+
+ for (ASTPointer<FunctionDefinition> const& function: getDefinedFunctions())
+ function->checkTypeRequirements();
+}
+
vector<FunctionDefinition const*> ContractDefinition::getInterfaceFunctions() const
{
vector<FunctionDefinition const*> exportedFunctions;
diff --git a/AST.h b/AST.h
index 3a15bbeb..72f96394 100644
--- a/AST.h
+++ b/AST.h
@@ -174,6 +174,10 @@ public:
std::vector<ASTPointer<VariableDeclaration>> const& getStateVariables() const { return m_stateVariables; }
std::vector<ASTPointer<FunctionDefinition>> const& getDefinedFunctions() const { return m_definedFunctions; }
+ /// Checks that the constructor does not have a "returns" statement and calls
+ /// checkTypeRequirements on all its functions.
+ void checkTypeRequirements();
+
/// @return A shared pointer of an ASTString.
/// Can contain a nullptr in which case indicates absence of documentation
ASTPointer<ASTString> const& getDocumentation() const { return m_documentation; }
diff --git a/NameAndTypeResolver.cpp b/NameAndTypeResolver.cpp
index 540b066e..2ad27680 100644
--- a/NameAndTypeResolver.cpp
+++ b/NameAndTypeResolver.cpp
@@ -62,11 +62,7 @@ void NameAndTypeResolver::resolveNamesAndTypes(ContractDefinition& _contract)
// First, the parameter types of all functions need to be resolved before we can check
// the types, since it is possible to call functions that are only defined later
// in the source.
- for (ASTPointer<FunctionDefinition> const& function: _contract.getDefinedFunctions())
- {
- m_currentScope = &m_scopes[function.get()];
- function->checkTypeRequirements();
- }
+ _contract.checkTypeRequirements();
m_currentScope = &m_scopes[nullptr];
}