42 has(cxxMethodDecl(isPublic(), hasName(
"data")).bind(
"data")))
46 const auto NonTemplateContainerType =
47 qualType(hasUnqualifiedDesugaredType(recordType(hasDeclaration(Record))));
48 const auto TemplateContainerType =
49 qualType(hasUnqualifiedDesugaredType(templateSpecializationType(
50 hasDeclaration(classTemplateDecl(has(Record))))));
52 const auto Container =
53 qualType(anyOf(NonTemplateContainerType, TemplateContainerType));
55 const auto ContainerExpr = anyOf(
61 unaryOperator(hasOperatorName(
"&"),
62 hasUnaryOperand(expr(anyOf(hasType(Container),
63 hasType(references(Container))))
66 expr(anyOf(hasType(Container), hasType(pointsTo(Container)),
67 hasType(references(Container))))
70 const auto Zero = integerLiteral(equals(0));
72 const auto SubscriptOperator = callee(cxxMethodDecl(hasName(
"operator[]")));
78 anyOf(cxxOperatorCallExpr(SubscriptOperator, argumentCountIs(2),
79 hasArgument(0, ContainerExpr),
80 hasArgument(1, Zero)),
81 cxxMemberCallExpr(SubscriptOperator, on(ContainerExpr),
82 argumentCountIs(1), hasArgument(0, Zero)),
83 arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero))))))
89 const auto *UO = Result.Nodes.getNodeAs<UnaryOperator>(
AddressOfName);
97 if (DCE && !CE->getType()->isPointerType())
102 const SourceRange SrcRange = CE->getSourceRange();
104 std::string ReplacementText{
105 Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange),
106 *Result.SourceManager, getLangOpts())};
108 const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(CE);
109 const bool NeedsParens =
110 OpCall ? (OpCall->getOperator() != OO_Subscript)
111 : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>(CE);
113 ReplacementText =
"(" + ReplacementText +
")";
115 if (CE->getType()->isPointerType())
116 ReplacementText +=
"->data()";
118 ReplacementText +=
".data()";
120 const FixItHint Hint =
121 FixItHint::CreateReplacement(UO->getSourceRange(), ReplacementText);
122 diag(UO->getBeginLoc(),
123 "'data' should be used for accessing the data pointer instead of taking "
124 "the address of the 0-th element")
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.