diff options
author | chriseth <chris@ethereum.org> | 2018-11-30 23:46:43 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-11-30 23:46:43 +0800 |
commit | 474e7b563561373c04ea954875d4acc7ad025ae4 (patch) | |
tree | 33ede927020131d72301ed4a4d799264bbc43958 /libsolidity/interface/CompilerStack.cpp | |
parent | 1bbd5977cfd8eb24b3a5cb0d296ce228062b8ebd (diff) | |
parent | 17a703f71ac842253e9948dff488cd675e568c1b (diff) | |
download | dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.tar dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.tar.gz dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.tar.bz2 dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.tar.lz dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.tar.xz dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.tar.zst dexon-solidity-474e7b563561373c04ea954875d4acc7ad025ae4.zip |
Merge pull request #5546 from ethereum/inheritanceChecker
Move some checks out of type checker.
Diffstat (limited to 'libsolidity/interface/CompilerStack.cpp')
-rw-r--r-- | libsolidity/interface/CompilerStack.cpp | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp index de4a7ec2..623ccca8 100644 --- a/libsolidity/interface/CompilerStack.cpp +++ b/libsolidity/interface/CompilerStack.cpp @@ -28,6 +28,7 @@ #include <libsolidity/analysis/SemVerHandler.h> #include <libsolidity/ast/AST.h> #include <libsolidity/parsing/Parser.h> +#include <libsolidity/analysis/ContractLevelChecker.h> #include <libsolidity/analysis/ControlFlowAnalyzer.h> #include <libsolidity/analysis/ControlFlowGraph.h> #include <libsolidity/analysis/GlobalContext.h> @@ -225,8 +226,21 @@ bool CompilerStack::analyze() m_contracts[contract->fullyQualifiedName()].contract = contract; } - // This cannot be done in the above loop, because cross-contract types couldn't be resolved. - // A good example is `LibraryName.TypeName x;`. + // Next, we check inheritance, overrides, function collisions and other things at + // contract or function level. + // This also calculates whether a contract is abstract, which is needed by the + // type checker. + ContractLevelChecker contractLevelChecker(m_errorReporter); + for (Source const* source: m_sourceOrder) + for (ASTPointer<ASTNode> const& node: source->ast->nodes()) + if (ContractDefinition* contract = dynamic_cast<ContractDefinition*>(node.get())) + if (!contractLevelChecker.check(*contract)) + noErrors = false; + + // New we run full type checks that go down to the expression level. This + // cannot be done earlier, because we need cross-contract types and information + // about whether a contract is abstract for the `new` expression. + // This populates the `type` annotation for all expressions. // // Note: this does not resolve overloaded functions. In order to do that, types of arguments are needed, // which is only done one step later. |