diff options
author | Artem Dergachev <artem.dergachev@gmail.com> | 2019-04-18 23:24:50 +0000 |
---|---|---|
committer | Artem Dergachev <artem.dergachev@gmail.com> | 2019-04-18 23:24:50 +0000 |
commit | 7cc87be4bb99b23dc4813bff653dc86fb4e6c7f6 (patch) | |
tree | ba1ecaddb0cef77b24ff9abc181718990b5866cd /clang/unittests/StaticAnalyzer/Reusables.h | |
parent | 6b71e27c948302faaa7927cde02286c767871bbd (diff) | |
download | bcm5719-llvm-7cc87be4bb99b23dc4813bff653dc86fb4e6c7f6.tar.gz bcm5719-llvm-7cc87be4bb99b23dc4813bff653dc86fb4e6c7f6.zip |
[analyzer] NFC: Make reusable unittest mocks reusable.
Put them in a header for other Analyzer unittests to include.
Differential Revision: https://reviews.llvm.org/D60739
llvm-svn: 358720
Diffstat (limited to 'clang/unittests/StaticAnalyzer/Reusables.h')
-rw-r--r-- | clang/unittests/StaticAnalyzer/Reusables.h | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/clang/unittests/StaticAnalyzer/Reusables.h b/clang/unittests/StaticAnalyzer/Reusables.h new file mode 100644 index 00000000000..aede503acb3 --- /dev/null +++ b/clang/unittests/StaticAnalyzer/Reusables.h @@ -0,0 +1,58 @@ +//===- unittests/StaticAnalyzer/Reusables.h -------------------------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "clang/ASTMatchers/ASTMatchFinder.h" +#include "clang/Frontend/CompilerInstance.h" +#include "clang/CrossTU/CrossTranslationUnit.h" +#include "clang/StaticAnalyzer/Core/PathSensitive/ExprEngine.h" + +namespace clang { +namespace ento { + +// Find a declaration in the current AST by name. +template <typename T> +const T *findDeclByName(const Decl *Where, StringRef Name) { + using namespace ast_matchers; + auto Matcher = decl(hasDescendant(namedDecl(hasName(Name)).bind("d"))); + auto Matches = match(Matcher, *Where, Where->getASTContext()); + assert(Matches.size() == 1 && "Ambiguous name!"); + const T *Node = selectFirst<T>("d", Matches); + assert(Node && "Name not found!"); + return Node; +} + +// A re-usable consumer that constructs ExprEngine out of CompilerInvocation. +class ExprEngineConsumer : public ASTConsumer { +protected: + CompilerInstance &C; + +private: + // We need to construct all of these in order to construct ExprEngine. + CheckerManager ChkMgr; + cross_tu::CrossTranslationUnitContext CTU; + PathDiagnosticConsumers Consumers; + AnalysisManager AMgr; + SetOfConstDecls VisitedCallees; + FunctionSummariesTy FS; + +protected: + ExprEngine Eng; + +public: + ExprEngineConsumer(CompilerInstance &C) + : C(C), ChkMgr(C.getASTContext(), *C.getAnalyzerOpts()), CTU(C), + Consumers(), + AMgr(C.getASTContext(), C.getDiagnostics(), Consumers, + CreateRegionStoreManager, CreateRangeConstraintManager, &ChkMgr, + *C.getAnalyzerOpts()), + VisitedCallees(), FS(), + Eng(CTU, AMgr, &VisitedCallees, &FS, ExprEngine::Inline_Regular) {} +}; + +} // namespace ento +} // namespace clang |