diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2015-02-15 20:11:07 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2015-02-15 20:11:07 +0000 |
commit | 07a7ff3bce3201b849260dbff38f3e31225d064c (patch) | |
tree | ec0db67ec0502438baa2c1ffb3e6550dcc410b64 | |
parent | bec02ccdea98eedbf7031c17d7307c69564952c2 (diff) | |
download | bcm5719-llvm-07a7ff3bce3201b849260dbff38f3e31225d064c.tar.gz bcm5719-llvm-07a7ff3bce3201b849260dbff38f3e31225d064c.zip |
Analyzer: Replace a set of particularly ugly faux variadics.
llvm-svn: 229325
-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() { } |