46 auto AncestorCall = anyOf(
47 cxxConstructExpr(), callExpr(unless(cxxOperatorCallExpr())), lambdaExpr(),
49 hasType(qualType(hasCanonicalType(hasDeclaration(recordDecl()))))));
52 cxxMethodDecl(hasName(
"data"),
55 auto SizeCall = cxxMemberCallExpr(
56 callee(cxxMethodDecl(hasAnyName(
"size",
"length"))),
57 on(ignoringParenImpCasts(
58 matchers::isStatementIdenticalToBoundNode(
"self"))));
60 auto DescendantSizeCall = expr(hasDescendant(
61 expr(SizeCall, hasAncestor(expr(AncestorCall).bind(
"ancestor-size")),
62 hasAncestor(expr(equalsBoundNode(
"parent"),
63 equalsBoundNode(
"ancestor-size"))))));
67 on(ignoringParenImpCasts(expr().bind(
"self"))), callee(DataMethod),
68 expr().bind(
"data-call"),
71 expr().bind(
"parent"), unless(cxxOperatorCallExpr()),
73 ignoringParenImpCasts(equalsBoundNode(
"data-call"))),
74 unless(hasAnyArgument(ignoringParenImpCasts(SizeCall))),
75 unless(hasAnyArgument(DescendantSizeCall)),
76 hasDeclaration(namedDecl(
78 initListExpr(expr().bind(
"parent"),
79 hasType(qualType(hasCanonicalType(hasDeclaration(
81 AllowedCallees))))))),
82 unless(DescendantSizeCall)))))),
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.