r335740 - [analyzer] Allow registering custom statically-linked analyzer checkers
Mikael Holmén via cfe-commits
cfe-commits at lists.llvm.org
Wed Jun 27 23:26:30 PDT 2018
Hi,
I get the same compilation error when I compile with clang 3.6.0.
Revert?
Regards,
Mikael
On 06/28/2018 03:16 AM, via cfe-commits wrote:
> Hi, this commit also broke our internal bot for a different reason:
>
> FAILED: /usr/lib/ccache/clang++ -DGTEST_HAS_RTTI=0
> -DGTEST_HAS_TR1_TUPLE=0 -DGTEST_LANG_CXX11=1 -D_DEBUG -D_GNU_SOURCE
> -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS -D__STDC_LIMIT_MACROS
> -Itools/clang/unittests/StaticAnalyzer
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/unittests/StaticAnalyzer
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/include
> -Itools/clang/include -Iinclude
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/include
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/utils/unittest/googletest/include
> -I/home/siadmin/jenkins/w/opensource/opensource_build/llvm/utils/unittest/googlemock/include
> -fPIC -fvisibility-inlines-hidden -Werror=date-time -std=c++11 -Wall
> -Wextra -Wno-unused-parameter -Wwrite-strings -Wcast-qual
> -Wmissing-field-initializers -pedantic -Wno-long-long
> -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor
> -Wstring-conversion -fdiagnostics-color -ffunction-sections
> -fdata-sections -fno-common -Woverloaded-virtual -Wno-nested-anon-types
> -O3 -UNDEBUG -Wno-variadic-macros
> -Wno-gnu-zero-variadic-macro-arguments -fno-exceptions -fno-rtti -MMD
> -MT
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o
> -MF
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o.d
> -o
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o
> -c
> /home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
>
> /home/siadmin/jenkins/w/opensource/opensource_build/llvm/tools/clang/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp:64:12:
> error: no viable conversion from
> 'unique_ptr<clang::ento::AnalysisASTConsumer>' to
> 'unique_ptr<clang::ASTConsumer>'
>
> return AnalysisConsumer;
>
> ^~~~~~~~~~~~~~~~
>
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:157:17:
> note: candidate constructor not viable: no known conversion from
> 'std::unique_ptr<AnalysisASTConsumer>' to 'nullptr_t' for 1st argument
>
> constexpr unique_ptr(nullptr_t) noexcept : unique_ptr() { }
>
> ^
>
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:160:7:
> note: candidate constructor not viable: no known conversion from
> 'std::unique_ptr<AnalysisASTConsumer>' to
> 'std::unique_ptr<clang::ASTConsumer,
> std::default_delete<clang::ASTConsumer> > &&' for 1st argument
>
> unique_ptr(unique_ptr&& __u) noexcept
>
> ^
>
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:169:2:
> note: candidate constructor [with _Up =
> clang::ento::AnalysisASTConsumer, _Ep =
> std::default_delete<clang::ento::AnalysisASTConsumer>, $2 = void] not
> viable: no known conversion from 'std::unique_ptr<AnalysisASTConsumer>'
> to 'unique_ptr<clang::ento::AnalysisASTConsumer,
> std::default_delete<clang::ento::AnalysisASTConsumer> > &&' for 1st argument
>
> unique_ptr(unique_ptr<_Up, _Ep>&& __u) noexcept
>
> ^
>
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:273:7:
> note: candidate constructor not viable: no known conversion from
> 'std::unique_ptr<AnalysisASTConsumer>' to 'const
> std::unique_ptr<clang::ASTConsumer,
> std::default_delete<clang::ASTConsumer> > &' for 1st argument
>
> unique_ptr(const unique_ptr&) = delete;
>
> ^
>
> /usr/bin/../lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/bits/unique_ptr.h:176:2:
> note: candidate template ignored: could not match 'auto_ptr' against
> 'unique_ptr'
>
> unique_ptr(auto_ptr<_Up>&& __u) noexcept;
>
> ^
>
> 1 error generated.
>
> Douglas Yung
>
> *From:*cfe-commits [mailto:cfe-commits-bounces at lists.llvm.org] *On
> Behalf Of *Artem Belevich via cfe-commits
> *Sent:* Wednesday, June 27, 2018 14:30
> *To:* Alexander Kornienko
> *Cc:* cfe-commits
> *Subject:* Re: r335740 - [analyzer] Allow registering custom
> statically-linked analyzer checkers
>
> FYI,
>
> This commit breaks clang tests. It appears that StaticAnalysisTests
> misses dependency on clangFrontend.
>
> --Artem
>
> [60/134] Linking CXX executable
> tools/clang/unittests/StaticAnalyzer/StaticAnalysisTests
>
> FAILED: tools/clang/unittests/StaticAnalyzer/StaticAnalysisTests
>
> : && /usr/local/google/home/tra/local/clang/bin/clang++ -fPIC
> -fvisibility-inlines-hidden -Werror=date-time
> -Werror=unguarded-availability-new -std=c++11 -Wall -Wextra
> -Wno-unused-parameter -Wwrite-strings -Wcast-qual
> -Wmissing-field-initializers -pedantic -Wno-long-long
> -Wcovered-switch-default -Wnon-virtual-dtor -Wdelete-non-virtual-dtor
> -Wstring-conversion -fdiagnostics-color -fno-common -Woverloaded-virtual
> -Wno-nested-anon-types -g -fuse-ld=lld -Xlinker --gdb-index
> -fuse-ld=lld -Wl,--color-diagnostics -Wl,-allow-shlib-undefined
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/AnalyzerOptionsTest.cpp.o
> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o
> -o tools/clang/unittests/StaticAnalyzer/StaticAnalysisTests
> lib/libLLVMSupport.so.7svn -lpthread lib/libgtest_main.so.7svn
> lib/libgtest.so.7svn -lpthread lib/libclangBasic.so.7svn
> lib/libclangAnalysis.so.7svn lib/libclangStaticAnalyzerCore.so.7svn
> lib/libclangStaticAnalyzerFrontend.so.7svn lib/libclangTooling.so.7svn
> -Wl,-rpath,/usr/local/google/home/tra/work/llvm/build/release+assert/lib
> && :
>
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined
> symbol: clang::FrontendAction::FrontendAction()
>
>>>> referenced by FrontendAction.h:235 (/usr/local/google/home/tra/work/llvm/repo/clang/include/clang/Frontend/FrontendAction.h:235)
>
>>>> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(clang::ASTFrontendAction::ASTFrontendAction())
>
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined
> symbol: vtable for clang::ASTFrontendAction
>
>>>> referenced by FrontendAction.h:235 (/usr/local/google/home/tra/work/llvm/repo/clang/include/clang/Frontend/FrontendAction.h:235)
>
>>>> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(clang::ASTFrontendAction::ASTFrontendAction())
>
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined
> symbol: clang::FrontendAction::~FrontendAction()
>
>>>> referenced by FrontendAction.h:225 (/usr/local/google/home/tra/work/llvm/repo/clang/include/clang/Frontend/FrontendAction.h:225)
>
>>>> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(clang::ASTFrontendAction::~ASTFrontendAction())
>
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined
> symbol: clang::PCHContainerOperations::PCHContainerOperations()
>
>>>> referenced by new_allocator.h:136 (/usr/lib/gcc/x86_64-linux-gnu/7.3.0/../../../../include/c++/7.3.0/ext/new_allocator.h:136)
>
>>>> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(void __gnu_cxx::new_allocator<clang::PCHContainerOperations>::construct<clang::PCHContainerOperations>(clang::PCHContainerOperations*))
>
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined
> symbol: clang::ASTFrontendAction::ExecuteAction()
>
>>>> referenced by RegisterCustomCheckersTest.cpp
>
>>>> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(vtable for clang::ento::(anonymous namespace)::TestAction)
>
> /usr/local/google/home/tra/local/clang/bin/ld.lld: error: undefined
> symbol: clang::FrontendAction::shouldEraseOutputFiles()
>
>>>> referenced by RegisterCustomCheckersTest.cpp
>
>>>> tools/clang/unittests/StaticAnalyzer/CMakeFiles/StaticAnalysisTests.dir/RegisterCustomCheckersTest.cpp.o:(vtable for clang::ento::(anonymous namespace)::TestAction)
>
> clang: error: linker command failed with exit code 1 (use -v to see
> invocation)
>
> On Wed, Jun 27, 2018 at 8:00 AM Alexander Kornienko via cfe-commits
> <cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>> wrote:
>
> Author: alexfh
> Date: Wed Jun 27 07:56:12 2018
> New Revision: 335740
>
> URL: http://llvm.org/viewvc/llvm-project?rev=335740&view=rev
> Log:
> [analyzer] Allow registering custom statically-linked analyzer checkers
>
> Summary:
> Add an extension point to allow registration of statically-linked
> Clang Static
> Analyzer checkers that are not a part of the Clang tree. This
> extension point
> employs the mechanism used when checkers are registered from
> dynamically loaded
> plugins.
>
> Reviewers: george.karpenkov, NoQ, xazax.hun, dcoughlin
>
> Reviewed By: george.karpenkov
>
> Subscribers: mgorny, mikhail.ramalho, rnkovacs, xazax.hun, szepet,
> a.sidorin, cfe-commits
>
> Differential Revision: https://reviews.llvm.org/D45718
>
> Added:
> cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
>
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h
> cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
> cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
> cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt
>
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h?rev=335740&r1=335739&r2=335740&view=diff
> ==============================================================================
> ---
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
> (original)
> +++
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/AnalysisConsumer.h
> Wed Jun 27 07:56:12 2018
> @@ -17,6 +17,7 @@
>
> #include "clang/AST/ASTConsumer.h"
> #include "clang/Basic/LLVM.h"
> +#include <functional>
> #include <memory>
>
> namespace clang {
> @@ -29,10 +30,24 @@ class CompilerInstance;
> namespace ento {
> class PathDiagnosticConsumer;
> class CheckerManager;
> +class CheckerRegistry;
>
> class AnalysisASTConsumer : public ASTConsumer {
> public:
> virtual void AddDiagnosticConsumer(PathDiagnosticConsumer
> *Consumer) = 0;
> +
> + /// This method allows registering statically linked custom
> checkers that are
> + /// not a part of the Clang tree. It employs the same mechanism
> that is used
> + /// by plugins.
> + ///
> + /// Example:
> + ///
> + /// Consumer->AddCheckerRegistrationFn([] (CheckerRegistry&
> Registry) {
> + ///
> Registry.addChecker<MyCustomChecker>("example.MyCustomChecker",
> + /// "Description");
> + /// });
> + virtual void
> + AddCheckerRegistrationFn(std::function<void(CheckerRegistry &)>
> Fn) = 0;
> };
>
> /// CreateAnalysisConsumer - Creates an ASTConsumer to run various
> code
>
> Modified:
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h?rev=335740&r1=335739&r2=335740&view=diff
> ==============================================================================
> ---
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h (original)
> +++
> cfe/trunk/include/clang/StaticAnalyzer/Frontend/CheckerRegistration.h Wed
> Jun 27 07:56:12 2018
> @@ -11,6 +11,7 @@
> #define LLVM_CLANG_STATICANALYZER_FRONTEND_CHECKERREGISTRATION_H
>
> #include "clang/Basic/LLVM.h"
> +#include <functional>
> #include <memory>
> #include <string>
>
> @@ -21,10 +22,13 @@ namespace clang {
>
> namespace ento {
> class CheckerManager;
> + class CheckerRegistry;
>
> - std::unique_ptr<CheckerManager>
> - createCheckerManager(AnalyzerOptions &opts, const LangOptions
> &langOpts,
> - ArrayRef<std::string> plugins,
> DiagnosticsEngine &diags);
> + std::unique_ptr<CheckerManager> createCheckerManager(
> + AnalyzerOptions &opts, const LangOptions &langOpts,
> + ArrayRef<std::string> plugins,
> + ArrayRef<std::function<void(CheckerRegistry &)>>
> checkerRegistrationFns,
> + DiagnosticsEngine &diags);
>
> } // end ento namespace
>
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp?rev=335740&r1=335739&r2=335740&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Frontend/AnalysisConsumer.cpp Wed
> Jun 27 07:56:12 2018
> @@ -164,6 +164,8 @@ class AnalysisConsumer : public Analysis
> /// Bug Reporter to use while recursively visiting Decls.
> BugReporter *RecVisitorBR;
>
> + std::vector<std::function<void(CheckerRegistry &)>>
> CheckerRegistrationFns;
> +
> public:
> ASTContext *Ctx;
> const Preprocessor &PP;
> @@ -293,8 +295,9 @@ public:
>
> void Initialize(ASTContext &Context) override {
> Ctx = &Context;
> - checkerMgr = createCheckerManager(*Opts, PP.getLangOpts(), Plugins,
> - PP.getDiagnostics());
> + checkerMgr =
> + createCheckerManager(*Opts, PP.getLangOpts(), Plugins,
> + CheckerRegistrationFns,
> PP.getDiagnostics());
>
> Mgr = llvm::make_unique<AnalysisManager>(
> *Ctx, PP.getDiagnostics(), PP.getLangOpts(), PathConsumers,
> @@ -385,6 +388,10 @@ public:
> PathConsumers.push_back(Consumer);
> }
>
> + void
> AddCheckerRegistrationFn(std::function<void(CheckerRegistry&)> Fn)
> override {
> + CheckerRegistrationFns.push_back(std::move(Fn));
> + }
> +
> private:
> void storeTopLevelDecls(DeclGroupRef DG);
> std::string getFunctionName(const Decl *D);
>
> Modified: cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp?rev=335740&r1=335739&r2=335740&view=diff
> ==============================================================================
> --- cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
> (original)
> +++ cfe/trunk/lib/StaticAnalyzer/Frontend/CheckerRegistration.cpp
> Wed Jun 27 07:56:12 2018
> @@ -111,16 +111,21 @@ getCheckerOptList(const AnalyzerOptions
> return checkerOpts;
> }
>
> -std::unique_ptr<CheckerManager>
> -ento::createCheckerManager(AnalyzerOptions &opts, const LangOptions
> &langOpts,
> - ArrayRef<std::string> plugins,
> - DiagnosticsEngine &diags) {
> +std::unique_ptr<CheckerManager> ento::createCheckerManager(
> + AnalyzerOptions &opts, const LangOptions &langOpts,
> + ArrayRef<std::string> plugins,
> + ArrayRef<std::function<void(CheckerRegistry &)>>
> checkerRegistrationFns,
> + DiagnosticsEngine &diags) {
> std::unique_ptr<CheckerManager> checkerMgr(
> new CheckerManager(langOpts, opts));
>
> SmallVector<CheckerOptInfo, 8> checkerOpts =
> getCheckerOptList(opts);
>
> ClangCheckerRegistry allCheckers(plugins, &diags);
> +
> + for (const auto &Fn : checkerRegistrationFns)
> + Fn(allCheckers);
> +
> allCheckers.initializeManager(*checkerMgr, checkerOpts);
> allCheckers.validateCheckerOptions(opts, diags);
> checkerMgr->finishedCheckerRegistration();
>
> Modified: cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp?rev=335740&r1=335739&r2=335740&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp
> (original)
> +++ cfe/trunk/unittests/StaticAnalyzer/AnalyzerOptionsTest.cpp Wed
> Jun 27 07:56:12 2018
> @@ -1,4 +1,4 @@
> -//===- unittest/Analysis/AnalyzerOptionsTest.cpp - SA Options test
> --------===//
> +//===- unittest/StaticAnalyzer/AnalyzerOptionsTest.cpp - SA Options
> test --===//
> //
> // The LLVM Compiler Infrastructure
> //
>
> Modified: cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt?rev=335740&r1=335739&r2=335740&view=diff
> ==============================================================================
> --- cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt (original)
> +++ cfe/trunk/unittests/StaticAnalyzer/CMakeLists.txt Wed Jun 27
> 07:56:12 2018
> @@ -4,11 +4,14 @@ set(LLVM_LINK_COMPONENTS
>
> add_clang_unittest(StaticAnalysisTests
> AnalyzerOptionsTest.cpp
> + RegisterCustomCheckersTest.cpp
> )
>
> target_link_libraries(StaticAnalysisTests
> PRIVATE
> clangBasic
> clangAnalysis
> - clangStaticAnalyzerCore
> + clangStaticAnalyzerCore
> + clangStaticAnalyzerFrontend
> + clangTooling
> )
>
> Added: cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp?rev=335740&view=auto
> ==============================================================================
> ---
> cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
> (added)
> +++
> cfe/trunk/unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
> Wed Jun 27 07:56:12 2018
> @@ -0,0 +1,80 @@
> +//===- unittests/StaticAnalyzer/RegisterCustomCheckersTest.cpp
> ------------===//
> +//
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open
> Source
> +// License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------------===//
> +
> +#include "clang/Frontend/CompilerInstance.h"
> +#include "clang/StaticAnalyzer/Core/BugReporter/BugReporter.h"
> +#include "clang/StaticAnalyzer/Core/BugReporter/BugType.h"
> +#include "clang/StaticAnalyzer/Core/Checker.h"
> +#include "clang/StaticAnalyzer/Core/CheckerRegistry.h"
> +#include "clang/StaticAnalyzer/Core/PathSensitive/AnalysisManager.h"
> +#include "clang/StaticAnalyzer/Frontend/AnalysisConsumer.h"
> +#include "clang/Tooling/Tooling.h"
> +#include "gtest/gtest.h"
> +
> +namespace clang {
> +namespace ento {
> +namespace {
> +
> +class CustomChecker : public Checker<check::ASTCodeBody> {
> +public:
> + void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr,
> + BugReporter &BR) const {
> + BR.EmitBasicReport(D, this, "Custom diagnostic",
> categories::LogicError,
> + "Custom diagnostic description",
> + PathDiagnosticLocation(D,
> Mgr.getSourceManager()), {});
> + }
> +};
> +
> +class TestAction : public ASTFrontendAction {
> + class DiagConsumer : public PathDiagnosticConsumer {
> + llvm::raw_ostream &Output;
> +
> + public:
> + DiagConsumer(llvm::raw_ostream &Output) : Output(Output) {}
> + void FlushDiagnosticsImpl(std::vector<const PathDiagnostic *>
> &Diags,
> + FilesMade *filesMade) override {
> + for (const auto *PD : Diags)
> + Output << PD->getCheckName() << ":" <<
> PD->getShortDescription();
> + }
> +
> + StringRef getName() const override { return "Test"; }
> + };
> +
> + llvm::raw_ostream &DiagsOutput;
> +
> +public:
> + TestAction(llvm::raw_ostream &DiagsOutput) :
> DiagsOutput(DiagsOutput) {}
> +
> + std::unique_ptr<ASTConsumer> CreateASTConsumer(CompilerInstance
> &Compiler,
> + StringRef File)
> override {
> + std::unique_ptr<AnalysisASTConsumer> AnalysisConsumer =
> + CreateAnalysisConsumer(Compiler);
> + AnalysisConsumer->AddDiagnosticConsumer(new
> DiagConsumer(DiagsOutput));
> + Compiler.getAnalyzerOpts()->CheckersControlList = {
> + {"custom.CustomChecker", true}};
> + AnalysisConsumer->AddCheckerRegistrationFn([](CheckerRegistry
> &Registry) {
> + Registry.addChecker<CustomChecker>("custom.CustomChecker",
> "Description");
> + });
> + return AnalysisConsumer;
> + }
> +};
> +
> +
> +TEST(RegisterCustomCheckers, RegisterChecker) {
> + std::string Diags;
> + {
> + llvm::raw_string_ostream OS(Diags);
> + EXPECT_TRUE(tooling::runToolOnCode(new TestAction(OS), "void
> f() {;}"));
> + }
> + EXPECT_EQ(Diags, "custom.CustomChecker:Custom diagnostic
> description");
> +}
> +
> +}
> +}
> +}
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org <mailto:cfe-commits at lists.llvm.org>
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
>
> --
>
> --Artem Belevich
>
>
>
> _______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
>
More information about the cfe-commits
mailing list