diff options
author | Gav Wood <g@ethdev.com> | 2014-12-17 20:49:31 +0800 |
---|---|---|
committer | Gav Wood <g@ethdev.com> | 2014-12-17 20:49:31 +0800 |
commit | cb43022d7ae2e86b1bd00c55d674d1414d9a5912 (patch) | |
tree | 7a6a564ba15340d990e046fce3798346d28ba455 | |
parent | aa83d5ea3cd8bfaf3ff77a684848316662dee07b (diff) | |
parent | 147e77b61fd202cbfd593270cc2639477ea7c61e (diff) | |
download | dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.tar dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.tar.gz dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.tar.bz2 dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.tar.lz dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.tar.xz dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.tar.zst dexon-solidity-cb43022d7ae2e86b1bd00c55d674d1414d9a5912.zip |
Merge pull request #636 from chriseth/sol_fix_foreignFunctions
Fix: Resolve function types of all contracts before checking types inside functions.
-rw-r--r-- | CompilerStack.cpp | 9 | ||||
-rw-r--r-- | NameAndTypeResolver.cpp | 13 | ||||
-rw-r--r-- | NameAndTypeResolver.h | 2 |
3 files changed, 18 insertions, 6 deletions
diff --git a/CompilerStack.cpp b/CompilerStack.cpp index 23f5fd68..1242c0ab 100644 --- a/CompilerStack.cpp +++ b/CompilerStack.cpp @@ -73,6 +73,15 @@ void CompilerStack::parse() resolver.resolveNamesAndTypes(*contract); m_contracts[contract->getName()].contract = contract; } + for (Source const* source: m_sourceOrder) + for (ASTPointer<ASTNode> const& node: source->ast->getNodes()) + if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) + { + m_globalContext->setCurrentContract(*contract); + resolver.updateDeclaration(*m_globalContext->getCurrentThis()); + resolver.checkTypeRequirements(*contract); + m_contracts[contract->getName()].contract = contract; + } m_parseSuccessful = true; } diff --git a/NameAndTypeResolver.cpp b/NameAndTypeResolver.cpp index 2ad27680..80732615 100644 --- a/NameAndTypeResolver.cpp +++ b/NameAndTypeResolver.cpp @@ -49,8 +49,6 @@ void NameAndTypeResolver::resolveNamesAndTypes(ContractDefinition& _contract) m_currentScope = &m_scopes[&_contract]; for (ASTPointer<StructDefinition> const& structDef: _contract.getDefinedStructs()) ReferencesResolver resolver(*structDef, *this, nullptr); - for (ASTPointer<StructDefinition> const& structDef: _contract.getDefinedStructs()) - structDef->checkValidityOfMembers(); for (ASTPointer<VariableDeclaration> const& variable: _contract.getStateVariables()) ReferencesResolver resolver(*variable, *this, nullptr); for (ASTPointer<FunctionDefinition> const& function: _contract.getDefinedFunctions()) @@ -59,13 +57,16 @@ void NameAndTypeResolver::resolveNamesAndTypes(ContractDefinition& _contract) ReferencesResolver referencesResolver(*function, *this, function->getReturnParameterList().get()); } - // 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. - _contract.checkTypeRequirements(); m_currentScope = &m_scopes[nullptr]; } +void NameAndTypeResolver::checkTypeRequirements(ContractDefinition& _contract) +{ + for (ASTPointer<StructDefinition> const& structDef: _contract.getDefinedStructs()) + structDef->checkValidityOfMembers(); + _contract.checkTypeRequirements(); +} + void NameAndTypeResolver::updateDeclaration(Declaration const& _declaration) { m_scopes[nullptr].registerDeclaration(_declaration, true); diff --git a/NameAndTypeResolver.h b/NameAndTypeResolver.h index 1ff9febf..23ac5fe7 100644 --- a/NameAndTypeResolver.h +++ b/NameAndTypeResolver.h @@ -46,6 +46,8 @@ public: void registerDeclarations(SourceUnit& _sourceUnit); /// Resolves all names and types referenced from the given contract. void resolveNamesAndTypes(ContractDefinition& _contract); + /// Check all type requirements in the given contract. + void checkTypeRequirements(ContractDefinition& _contract); /// Updates the given global declaration (used for "this"). Not to be used with declarations /// that create their own scope. void updateDeclaration(Declaration const& _declaration); |