diff options
Diffstat (limited to 'clang')
| -rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/Checker.h | 49 | ||||
| -rw-r--r-- | clang/include/clang/StaticAnalyzer/Core/CheckerManager.h | 63 | ||||
| -rw-r--r-- | clang/lib/StaticAnalyzer/Core/Checker.cpp | 8 | 
3 files changed, 14 insertions, 106 deletions
| diff --git a/clang/include/clang/StaticAnalyzer/Core/Checker.h b/clang/include/clang/StaticAnalyzer/Core/Checker.h index 8cc35148e07..efc31188d49 100644 --- a/clang/include/clang/StaticAnalyzer/Core/Checker.h +++ b/clang/include/clang/StaticAnalyzer/Core/Checker.h @@ -25,10 +25,6 @@ namespace ento {  namespace check { -struct _VoidCheck { -  static void _register(void *checker, CheckerManager &mgr) { } -}; -  template <typename DECL>  class ASTDecl {    template <typename CHECKER> @@ -476,49 +472,22 @@ public:    CheckerProgramPointTag(const CheckerBase *Checker, StringRef Msg);  }; -template <typename CHECK1, typename CHECK2=check::_VoidCheck, -          typename CHECK3=check::_VoidCheck, typename CHECK4=check::_VoidCheck, -          typename CHECK5=check::_VoidCheck, typename CHECK6=check::_VoidCheck, -          typename CHECK7=check::_VoidCheck, typename CHECK8=check::_VoidCheck, -          typename CHECK9=check::_VoidCheck, typename CHECK10=check::_VoidCheck, -          typename CHECK11=check::_VoidCheck,typename CHECK12=check::_VoidCheck, -          typename CHECK13=check::_VoidCheck,typename CHECK14=check::_VoidCheck, -          typename CHECK15=check::_VoidCheck,typename CHECK16=check::_VoidCheck, -          typename CHECK17=check::_VoidCheck,typename CHECK18=check::_VoidCheck, -          typename CHECK19=check::_VoidCheck,typename CHECK20=check::_VoidCheck, -          typename CHECK21=check::_VoidCheck,typename CHECK22=check::_VoidCheck, -          typename CHECK23=check::_VoidCheck,typename CHECK24=check::_VoidCheck> -class Checker; - -template <> -class Checker<check::_VoidCheck> -  : public CheckerBase  -{ -  virtual void anchor(); +template <typename CHECK1, typename... CHECKs> +class Checker : public CHECK1, public Checker<CHECKs...> {  public: -  static void _register(void *checker, CheckerManager &mgr) { } +  template <typename CHECKER> +  static void _register(CHECKER *checker, CheckerManager &mgr) { +    CHECK1::_register(checker, mgr); +    Checker<CHECKs...>::_register(checker, mgr); +  }  }; -template <typename CHECK1, typename CHECK2, typename CHECK3, typename CHECK4, -          typename CHECK5, typename CHECK6, typename CHECK7, typename CHECK8, -          typename CHECK9, typename CHECK10,typename CHECK11,typename CHECK12, -          typename CHECK13,typename CHECK14,typename CHECK15,typename CHECK16, -          typename CHECK17,typename CHECK18,typename CHECK19,typename CHECK20, -          typename CHECK21,typename CHECK22,typename CHECK23,typename CHECK24> -class Checker -    : public CHECK1, -      public Checker<CHECK2, CHECK3, CHECK4, CHECK5, CHECK6, CHECK7, -                     CHECK8, CHECK9, CHECK10,CHECK11,CHECK12,CHECK13, -                     CHECK14,CHECK15,CHECK16,CHECK17,CHECK18,CHECK19, -                     CHECK20,CHECK21,CHECK22,CHECK23,CHECK24> { +template <typename CHECK1> +class Checker<CHECK1> : public CHECK1, public CheckerBase {  public:    template <typename CHECKER>    static void _register(CHECKER *checker, CheckerManager &mgr) {      CHECK1::_register(checker, mgr); -    Checker<CHECK2, CHECK3, CHECK4, CHECK5, CHECK6, CHECK7, -            CHECK8, CHECK9, CHECK10,CHECK11,CHECK12,CHECK13, -            CHECK14,CHECK15,CHECK16,CHECK17,CHECK18,CHECK19, -            CHECK20,CHECK21,CHECK22,CHECK23,CHECK24>::_register(checker, mgr);    }  }; diff --git a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h index 30b04802357..8a1a82b342a 100644 --- a/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h +++ b/clang/include/clang/StaticAnalyzer/Core/CheckerManager.h @@ -47,71 +47,18 @@ namespace ento {  template <typename T> class CheckerFn; -template <typename RET, typename P1, typename P2, typename P3, typename P4, -          typename P5> -class CheckerFn<RET(P1, P2, P3, P4, P5)> { -  typedef RET (*Func)(void *, P1, P2, P3, P4, P5); +template <typename RET, typename... Ps> +class CheckerFn<RET(Ps...)> { +  typedef RET (*Func)(void *, Ps...);    Func Fn;  public:    CheckerBase *Checker;    CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } -  RET operator()(P1 p1, P2 p2, P3 p3, P4 p4, P5 p5) const { -    return Fn(Checker, p1, p2, p3, p4, p5); +  RET operator()(Ps... ps) const { +    return Fn(Checker, ps...);    }  }; -template <typename RET, typename P1, typename P2, typename P3, typename P4> -class CheckerFn<RET(P1, P2, P3, P4)> { -  typedef RET (*Func)(void *, P1, P2, P3, P4); -  Func Fn; -public: -  CheckerBase *Checker; -  CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } -  RET operator()(P1 p1, P2 p2, P3 p3, P4 p4) const {  -    return Fn(Checker, p1, p2, p3, p4); -  }  -}; - -template <typename RET, typename P1, typename P2, typename P3> -class CheckerFn<RET(P1, P2, P3)> { -  typedef RET (*Func)(void *, P1, P2, P3); -  Func Fn; -public: -  CheckerBase *Checker; -  CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } -  RET operator()(P1 p1, P2 p2, P3 p3) const { return Fn(Checker, p1, p2, p3); }  -}; - -template <typename RET, typename P1, typename P2> -class CheckerFn<RET(P1, P2)> { -  typedef RET (*Func)(void *, P1, P2); -  Func Fn; -public: -  CheckerBase *Checker; -  CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } -  RET operator()(P1 p1, P2 p2) const { return Fn(Checker, p1, p2); }  -}; - -template <typename RET, typename P1> -class CheckerFn<RET(P1)> { -  typedef RET (*Func)(void *, P1); -  Func Fn; -public: -  CheckerBase *Checker; -  CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } -  RET operator()(P1 p1) const { return Fn(Checker, p1); }  -}; - -template <typename RET> -class CheckerFn<RET()> { -  typedef RET (*Func)(void *); -  Func Fn; -public: -  CheckerBase *Checker; -  CheckerFn(CheckerBase *checker, Func fn) : Fn(fn), Checker(checker) { } -  RET operator()() const { return Fn(Checker); }  -}; -  /// \brief Describes the different reasons a pointer escapes  /// during analysis.  enum PointerEscapeKind { diff --git a/clang/lib/StaticAnalyzer/Core/Checker.cpp b/clang/lib/StaticAnalyzer/Core/Checker.cpp index 1a3965acaf4..22352111d14 100644 --- a/clang/lib/StaticAnalyzer/Core/Checker.cpp +++ b/clang/lib/StaticAnalyzer/Core/Checker.cpp @@ -36,11 +36,3 @@ raw_ostream& clang::ento::operator<<(raw_ostream &Out,    Out << Checker.getCheckName().getName();    return Out;  } - -void Checker<check::_VoidCheck, check::_VoidCheck, check::_VoidCheck, -             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck, -             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck, -             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck, -             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck, -             check::_VoidCheck, check::_VoidCheck, check::_VoidCheck -             >::anchor() { } | 

