47 auto AncestorCall = anyOf(
48 cxxConstructExpr(), callExpr(unless(cxxOperatorCallExpr())), lambdaExpr(),
50 hasType(qualType(hasCanonicalType(hasDeclaration(recordDecl()))))));
53 cxxMethodDecl(hasName(
"data"),
56 auto SizeCall = cxxMemberCallExpr(
57 callee(cxxMethodDecl(hasAnyName(
"size",
"length"))),
58 on(ignoringParenImpCasts(
59 matchers::isStatementIdenticalToBoundNode(
"self"))));
61 auto DescendantSizeCall = expr(hasDescendant(
62 expr(SizeCall, hasAncestor(expr(AncestorCall).bind(
"ancestor-size")),
63 hasAncestor(expr(equalsBoundNode(
"parent"),
64 equalsBoundNode(
"ancestor-size"))))));
68 on(ignoringParenImpCasts(expr().bind(
"self"))), callee(DataMethod),
69 expr().bind(
"data-call"),
72 expr().bind(
"parent"), unless(cxxOperatorCallExpr()),
74 ignoringParenImpCasts(equalsBoundNode(
"data-call"))),
75 unless(hasAnyArgument(ignoringParenImpCasts(SizeCall))),
76 unless(hasAnyArgument(DescendantSizeCall)),
77 hasDeclaration(namedDecl(
79 initListExpr(expr().bind(
"parent"),
80 hasType(qualType(hasCanonicalType(hasDeclaration(
82 AllowedCallees))))))),
83 unless(DescendantSizeCall)))))),
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.