diff options
author | Christian <c@ethdev.com> | 2014-12-15 23:09:50 +0800 |
---|---|---|
committer | Christian <c@ethdev.com> | 2014-12-15 23:09:50 +0800 |
commit | c40725c22adaa2159bd06894740f7559733afbb4 (patch) | |
tree | 979ec3f5ba0d4540097e56fd08f809880f35b7de | |
parent | 40f7c32e57cf8b09d45f52935b8726f5baef5358 (diff) | |
download | dexon-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.cpp | 11 | ||||
-rw-r--r-- | AST.h | 4 | ||||
-rw-r--r-- | NameAndTypeResolver.cpp | 6 |
3 files changed, 16 insertions, 5 deletions
@@ -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; @@ -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]; } |