Analyzer: Replace a set of particularly ugly faux variadics.

llvm-svn: 229325
This commit is contained in:
Benjamin Kramer 2015-02-15 20:11:07 +00:00
parent bec02ccdea
commit 07a7ff3bce
3 changed files with 17 additions and 109 deletions

View File

@ -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();
public:
static void _register(void *checker, CheckerManager &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, typename... CHECKs>
class Checker : public CHECK1, public Checker<CHECKs...> {
public:
template <typename CHECKER>
static void _register(CHECKER *checker, CheckerManager &mgr) {
CHECK1::_register(checker, mgr);
Checker<CHECKs...>::_register(checker, mgr);
}
};
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);
}
};

View File

@ -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 {

View File

@ -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() { }