10 #include "clang/AST/ASTContext.h" 11 #include "clang/ASTMatchers/ASTMatchFinder.h" 17 namespace cppcoreguidelines {
19 const internal::VariadicDynCastAllOfMatcher<Stmt, VAArgExpr>
vAArgExpr;
21 void ProTypeVarargCheck::registerMatchers(MatchFinder *Finder) {
22 if (!getLangOpts().CPlusPlus)
25 Finder->addMatcher(
vAArgExpr().bind(
"va_use"),
this);
28 callExpr(callee(functionDecl(isVariadic()))).bind(
"callvararg"),
this);
32 const auto *FDecl = dyn_cast<FunctionDecl>(C->getCalleeDecl());
36 auto N = FDecl->getNumParams();
37 if (C->getNumArgs() != N + 1)
41 dyn_cast<IntegerLiteral>(C->getArg(N)->IgnoreParenImpCasts());
45 if (IntLit->getValue() != I)
51 void ProTypeVarargCheck::check(
const MatchFinder::MatchResult &Result) {
52 if (
const auto *Matched = Result.Nodes.getNodeAs<CallExpr>(
"callvararg")) {
55 diag(Matched->getExprLoc(),
"do not call c-style vararg functions");
58 if (
const auto *Matched = Result.Nodes.getNodeAs<Expr>(
"va_use")) {
59 diag(Matched->getExprLoc(),
60 "do not use va_start/va_arg to define c-style vararg functions; " 61 "use variadic templates instead");
64 if (
const auto *Matched = Result.Nodes.getNodeAs<VarDecl>(
"va_list")) {
65 auto SR = Matched->getSourceRange();
68 diag(SR.getBegin(),
"do not declare variables of type va_list; " 69 "use variadic templates instead");
const internal::VariadicDynCastAllOfMatcher< Stmt, VAArgExpr > vAArgExpr
===– Representation.cpp - ClangDoc Representation --------—*- C++ -*-===//
static bool hasSingleVariadicArgumentWithValue(const CallExpr *C, uint64_t I)