[analyzer]
[clang.git] / include / clang / StaticAnalyzer / Core / CheckerV2.h
blob8c96866f1c99566465ca916467d66b084a199671
1 //== CheckerV2.h - Registration mechanism for checkers -----------*- C++ -*--=//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This file defines CheckerV2, used to create and register checkers.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_CLANG_SA_CORE_CHECKERV2
15 #define LLVM_CLANG_SA_CORE_CHECKERV2
17 #include "clang/StaticAnalyzer/Core/CheckerManager.h"
18 #include "llvm/Support/Casting.h"
20 namespace clang {
21 namespace ento {
22 class BugReporter;
24 namespace check {
26 struct _VoidCheck {
27 static void _register(void *checker, CheckerManager &mgr) { }
30 template <typename DECL>
31 class ASTDecl {
32 template <typename CHECKER>
33 static void _checkDecl(void *checker, const Decl *D, AnalysisManager& mgr,
34 BugReporter &BR) {
35 ((const CHECKER *)checker)->checkASTDecl(llvm::cast<DECL>(D), mgr, BR);
38 static bool _handlesDecl(const Decl *D) {
39 return llvm::isa<DECL>(D);
41 public:
42 template <typename CHECKER>
43 static void _register(CHECKER *checker, CheckerManager &mgr) {
44 mgr._registerForDecl(checker, _checkDecl<CHECKER>, _handlesDecl);
48 class ASTCodeBody {
49 template <typename CHECKER>
50 static void _checkBody(void *checker, const Decl *D, AnalysisManager& mgr,
51 BugReporter &BR) {
52 ((const CHECKER *)checker)->checkASTCodeBody(D, mgr, BR);
55 public:
56 template <typename CHECKER>
57 static void _register(CHECKER *checker, CheckerManager &mgr) {
58 mgr._registerForBody(checker, _checkBody<CHECKER>);
62 } // end check namespace
64 template <typename CHECK1, typename CHECK2=check::_VoidCheck,
65 typename CHECK3=check::_VoidCheck, typename CHECK4=check::_VoidCheck,
66 typename CHECK5=check::_VoidCheck, typename CHECK6=check::_VoidCheck,
67 typename CHECK7=check::_VoidCheck, typename CHECK8=check::_VoidCheck,
68 typename CHECK9=check::_VoidCheck, typename CHECK10=check::_VoidCheck,
69 typename CHECK11=check::_VoidCheck,typename CHECK12=check::_VoidCheck>
70 class CheckerV2 {
71 public:
72 template <typename CHECKER>
73 static void _register(CHECKER *checker, CheckerManager &mgr) {
74 CHECK1::_register(checker, mgr);
75 CHECK2::_register(checker, mgr);
76 CHECK3::_register(checker, mgr);
77 CHECK4::_register(checker, mgr);
78 CHECK5::_register(checker, mgr);
79 CHECK6::_register(checker, mgr);
80 CHECK7::_register(checker, mgr);
81 CHECK8::_register(checker, mgr);
82 CHECK9::_register(checker, mgr);
83 CHECK10::_register(checker, mgr);
84 CHECK11::_register(checker, mgr);
85 CHECK12::_register(checker, mgr);
89 } // end ento namespace
91 } // end clang namespace
93 #endif