11 #include "clang/AST/ASTContext.h"
12 #include "clang/ASTMatchers/ASTMatchFinder.h"
14 using namespace clang::ast_matchers;
19 void SizeofContainerCheck::registerMatchers(MatchFinder *
Finder) {
21 expr(unless(isInTemplateInstantiation()),
23 expr(hasType(hasCanonicalType(hasDeclaration(cxxRecordDecl(
24 matchesName(
"^(::std::|::string)"),
25 unless(matchesName(
"^::std::(bitset|array)$")),
26 hasMethod(cxxMethodDecl(hasName(
"size"), isPublic(),
30 unless(hasAncestor(binaryOperator(
31 anyOf(hasOperatorName(
"/"), hasOperatorName(
"%")),
32 hasLHS(ignoringParenCasts(sizeOfExpr(expr()))),
33 hasRHS(ignoringParenCasts(equalsBoundNode(
"sizeof"))))))),
37 void SizeofContainerCheck::check(
const MatchFinder::MatchResult &
Result) {
39 Result.Nodes.getNodeAs<UnaryExprOrTypeTraitExpr>(
"sizeof");
42 diag(SizeOf->getLocStart(),
"sizeof() doesn't return the size of the "
43 "container; did you mean .size()?");
std::unique_ptr< ast_matchers::MatchFinder > Finder