44 has(cxxMethodDecl(isPublic(), hasName(
"data")).bind(
"data")))
48 const auto NonTemplateContainerType =
49 qualType(hasUnqualifiedDesugaredType(recordType(hasDeclaration(Record))));
50 const auto TemplateContainerType =
51 qualType(hasUnqualifiedDesugaredType(templateSpecializationType(
52 hasDeclaration(classTemplateDecl(has(Record))))));
54 const auto Container =
55 qualType(anyOf(NonTemplateContainerType, TemplateContainerType));
57 const auto ContainerExpr = anyOf(
63 unaryOperator(hasOperatorName(
"&"),
64 hasUnaryOperand(expr(anyOf(hasType(Container),
65 hasType(references(Container))))
68 expr(anyOf(hasType(Container), hasType(pointsTo(Container)),
69 hasType(references(Container))))
72 const auto Zero = integerLiteral(equals(0));
74 const auto SubscriptOperator = callee(cxxMethodDecl(hasName(
"operator[]")));
78 unless(isExpansionInSystemHeader()), hasOperatorName(
"&"),
80 anyOf(cxxOperatorCallExpr(SubscriptOperator, argumentCountIs(2),
81 hasArgument(0, ContainerExpr),
82 hasArgument(1, Zero)),
83 cxxMemberCallExpr(SubscriptOperator, on(ContainerExpr),
84 argumentCountIs(1), hasArgument(0, Zero)),
85 arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero))))))
91 const auto *UO = Result.Nodes.getNodeAs<UnaryOperator>(
AddressOfName);
99 if (DCE && !CE->getType()->isPointerType())
104 SourceRange SrcRange = CE->getSourceRange();
106 std::string ReplacementText{
107 Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange),
108 *Result.SourceManager, getLangOpts())};
110 if (!isa<DeclRefExpr, ArraySubscriptExpr, CXXOperatorCallExpr, CallExpr,
112 ReplacementText =
"(" + ReplacementText +
")";
114 if (CE->getType()->isPointerType())
115 ReplacementText +=
"->data()";
117 ReplacementText +=
".data()";
120 FixItHint::CreateReplacement(UO->getSourceRange(), ReplacementText);
121 diag(UO->getBeginLoc(),
122 "'data' should be used for accessing the data pointer instead of taking "
123 "the address of the 0-th element")
Every ClangTidyCheck reports errors through a DiagnosticsEngine provided by this context.