https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/165636
>From f29accd639928c3560309a15bf42e81b65e5b20f Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Thu, 30 Oct 2025 02:56:11 +0800 Subject: [PATCH 01/12] [clang-tidy] Fix `readability-container-data-pointer` check --- .../readability/ContainerDataPointerCheck.cpp | 7 +++++-- .../checkers/readability/container-data-pointer.cpp | 12 ++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index 11756d10a8221..d9338888cc40e 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -107,8 +107,11 @@ void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange), *Result.SourceManager, getLangOpts())}; - if (!isa<DeclRefExpr, ArraySubscriptExpr, CXXOperatorCallExpr, CallExpr, - MemberExpr>(CE)) + const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(CE); + bool NeedsParens = + OpCall ? (OpCall->getOperator() != OO_Subscript) + : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>(CE); + if (NeedsParens) ReplacementText = "(" + ReplacementText + ")"; if (CE->getType()->isPointerType()) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp index a8e0eb6d262e6..26f9d9f16ac8c 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp @@ -35,6 +35,12 @@ template <typename T> struct enable_if<true, T> { typedef T type; }; + +template <typename T> +struct unique_ptr { + T &operator*() const; + T *operator->() const; +}; } template <typename T> @@ -144,3 +150,9 @@ int *r() { // CHECK-MESSAGES: :[[@LINE-1]]:10: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] // CHECK-FIXES: return holder.v.data(); } + +void s(std::unique_ptr<std::vector<unsigned char>> p) { + f(&(*p)[0]); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] + // CHECK-FIXES: f((*p).data()); +} >From b7dcb77b75d080d9003a96c669c40ca09c11fedc Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Thu, 30 Oct 2025 23:54:29 +0800 Subject: [PATCH 02/12] add release notes and fix minor issue --- .../clang-tidy/readability/ContainerDataPointerCheck.cpp | 2 +- clang-tools-extra/docs/ReleaseNotes.rst | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index d9338888cc40e..dba4aa8d5fc6e 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -108,7 +108,7 @@ void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { *Result.SourceManager, getLangOpts())}; const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(CE); - bool NeedsParens = + const bool NeedsParens = OpCall ? (OpCall->getOperator() != OO_Subscript) : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>(CE); if (NeedsParens) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 8f4be0d1cb259..40c00c8206aff 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -362,7 +362,7 @@ Changes in existing checks - Improved :doc:`misc-const-correctness <clang-tidy/checks/misc/const-correctness>` check to avoid false - positives when pointers is transferred to non-const references + positives when pointers is transferred to non-const references and avoid false positives of function pointer and fix false positives on return of non-const pointer. @@ -429,6 +429,10 @@ Changes in existing checks comparisons to ``npos``. Internal changes may cause new rare false positives in non-standard containers. +- Improved :doc:`readability-container-data-pointer + <clang-tidy/checks/readability/container-data-pointer>`check by correctly + adding parentheses when the container expression is a dereference. + - Improved :doc:`readability-container-size-empty <clang-tidy/checks/readability/container-size-empty>` check by correctly generating fix-it hints when size method is called from implicit ``this``, >From 76bc6cfdcb8faa6ff24016baa9fb40051c28f9fd Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Fri, 31 Oct 2025 00:19:10 +0800 Subject: [PATCH 03/12] fix docs --- clang-tools-extra/docs/ReleaseNotes.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 40c00c8206aff..11337aa3d628e 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -430,7 +430,7 @@ Changes in existing checks in non-standard containers. - Improved :doc:`readability-container-data-pointer - <clang-tidy/checks/readability/container-data-pointer>`check by correctly + <clang-tidy/checks/readability/container-data-pointer>` check by correctly adding parentheses when the container expression is a dereference. - Improved :doc:`readability-container-size-empty >From f63a789bac9970206a38e41cd386dc012fbee704 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sat, 1 Nov 2025 01:41:26 +0800 Subject: [PATCH 04/12] Add more tests --- .../readability/ContainerDataPointerCheck.cpp | 33 ++++++++++--------- .../readability/ContainerDataPointerCheck.h | 2 +- .../readability/container-data-pointer.cpp | 9 +++++ 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index dba4aa8d5fc6e..b9b8c9a829bfe 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -71,20 +71,20 @@ void ContainerDataPointerCheck::registerMatchers(MatchFinder *Finder) { const auto Zero = integerLiteral(equals(0)); - const auto SubscriptOperator = callee(cxxMethodDecl(hasName("operator[]"))); - - Finder->addMatcher( + const auto AddressOfMatcher = unaryOperator( unless(isExpansionInSystemHeader()), hasOperatorName("&"), - hasUnaryOperand(expr( - anyOf(cxxOperatorCallExpr(SubscriptOperator, argumentCountIs(2), - hasArgument(0, ContainerExpr), - hasArgument(1, Zero)), - cxxMemberCallExpr(SubscriptOperator, on(ContainerExpr), - argumentCountIs(1), hasArgument(0, Zero)), - arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero)))))) - .bind(AddressOfName), - this); + hasUnaryOperand(ignoringParenImpCasts(expr(anyOf( + cxxOperatorCallExpr( + hasOverloadedOperatorName("[]"), argumentCountIs(2), + hasArgument(0, ContainerExpr), hasArgument(1, Zero)), + cxxMemberCallExpr(callee(cxxMethodDecl(hasName("operator[]"))), + on(ContainerExpr), argumentCountIs(1), + hasArgument(0, Zero)), + arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero))))))) + .bind(AddressOfName); + + Finder->addMatcher(AddressOfMatcher, this); } void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { @@ -101,16 +101,19 @@ void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { else if (ACE) CE = ACE; - SourceRange SrcRange = CE->getSourceRange(); + const Expr *PrintedCE = CE->IgnoreParenImpCasts(); + + SourceRange SrcRange = PrintedCE->getSourceRange(); std::string ReplacementText{ Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange), *Result.SourceManager, getLangOpts())}; - const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(CE); + const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(PrintedCE); const bool NeedsParens = OpCall ? (OpCall->getOperator() != OO_Subscript) - : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>(CE); + : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>( + PrintedCE); if (NeedsParens) ReplacementText = "(" + ReplacementText + ")"; diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h index 71fde87fbb093..d71cb7ff21904 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h @@ -34,7 +34,7 @@ class ContainerDataPointerCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; std::optional<TraversalKind> getCheckTraversalKind() const override { - return TK_IgnoreUnlessSpelledInSource; + return TK_AsIs; } private: diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp index 26f9d9f16ac8c..12fa030fc0af2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp @@ -156,3 +156,12 @@ void s(std::unique_ptr<std::vector<unsigned char>> p) { // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] // CHECK-FIXES: f((*p).data()); } + +template <typename Cont> +void u(std::unique_ptr<Cont> p) { + f(&(*p)[0]); + // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] + // CHECK-FIXES: f((*p).data()); +} + +template void u<std::vector<int>>(std::unique_ptr<std::vector<int>>); >From 1c60089727f9ddfe2b66e4ce79750db21a134f6d Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sat, 1 Nov 2025 01:57:07 +0800 Subject: [PATCH 05/12] minor fix --- .../checkers/readability/container-data-pointer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp index 12fa030fc0af2..80a8e03b25def 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp @@ -157,8 +157,8 @@ void s(std::unique_ptr<std::vector<unsigned char>> p) { // CHECK-FIXES: f((*p).data()); } -template <typename Cont> -void u(std::unique_ptr<Cont> p) { +template <typename T> +void u(std::unique_ptr<T> p) { f(&(*p)[0]); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] // CHECK-FIXES: f((*p).data()); >From 4170744d95a80db81e6caf0be5837486ab5dfb9c Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sat, 1 Nov 2025 02:03:28 +0800 Subject: [PATCH 06/12] fix format issue --- .../clang-tidy/readability/ContainerDataPointerCheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index b9b8c9a829bfe..a03a06c71ba9a 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -103,7 +103,7 @@ void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { const Expr *PrintedCE = CE->IgnoreParenImpCasts(); - SourceRange SrcRange = PrintedCE->getSourceRange(); + const SourceRange SrcRange = PrintedCE->getSourceRange(); std::string ReplacementText{ Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange), >From 3c551a91399d4e4534fc6658d5e108e9a6ae9ab8 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Mon, 3 Nov 2025 22:39:30 +0800 Subject: [PATCH 07/12] fix `AsIs` --- .../clang-tidy/readability/ContainerDataPointerCheck.cpp | 2 +- .../clang-tidy/readability/ContainerDataPointerCheck.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index a03a06c71ba9a..5e1cd70b26930 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -84,7 +84,7 @@ void ContainerDataPointerCheck::registerMatchers(MatchFinder *Finder) { arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero))))))) .bind(AddressOfName); - Finder->addMatcher(AddressOfMatcher, this); + Finder->addMatcher(traverse(TK_AsIs, AddressOfMatcher), this); } void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h index d71cb7ff21904..71fde87fbb093 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h @@ -34,7 +34,7 @@ class ContainerDataPointerCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; std::optional<TraversalKind> getCheckTraversalKind() const override { - return TK_AsIs; + return TK_IgnoreUnlessSpelledInSource; } private: >From 0eaa462e887512b7b9e8c5093ff529d20a093211 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sun, 9 Nov 2025 10:32:52 +0800 Subject: [PATCH 08/12] Revert "fix `AsIs`" This reverts commit 3c551a91399d4e4534fc6658d5e108e9a6ae9ab8. --- .../clang-tidy/readability/ContainerDataPointerCheck.cpp | 2 +- .../clang-tidy/readability/ContainerDataPointerCheck.h | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index 5e1cd70b26930..a03a06c71ba9a 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -84,7 +84,7 @@ void ContainerDataPointerCheck::registerMatchers(MatchFinder *Finder) { arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero))))))) .bind(AddressOfName); - Finder->addMatcher(traverse(TK_AsIs, AddressOfMatcher), this); + Finder->addMatcher(AddressOfMatcher, this); } void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h index 71fde87fbb093..d71cb7ff21904 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h @@ -34,7 +34,7 @@ class ContainerDataPointerCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; std::optional<TraversalKind> getCheckTraversalKind() const override { - return TK_IgnoreUnlessSpelledInSource; + return TK_AsIs; } private: >From f981d8cab60383c2e38f3905a36b84c975b40150 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sun, 9 Nov 2025 10:32:52 +0800 Subject: [PATCH 09/12] Revert "fix format issue" This reverts commit 4170744d95a80db81e6caf0be5837486ab5dfb9c. --- .../clang-tidy/readability/ContainerDataPointerCheck.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index a03a06c71ba9a..b9b8c9a829bfe 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -103,7 +103,7 @@ void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { const Expr *PrintedCE = CE->IgnoreParenImpCasts(); - const SourceRange SrcRange = PrintedCE->getSourceRange(); + SourceRange SrcRange = PrintedCE->getSourceRange(); std::string ReplacementText{ Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange), >From f8193db2e9d14de4e645e8485846d68289df4ce8 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sun, 9 Nov 2025 10:32:52 +0800 Subject: [PATCH 10/12] Revert "minor fix" This reverts commit 1c60089727f9ddfe2b66e4ce79750db21a134f6d. --- .../checkers/readability/container-data-pointer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp index 80a8e03b25def..12fa030fc0af2 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp @@ -157,8 +157,8 @@ void s(std::unique_ptr<std::vector<unsigned char>> p) { // CHECK-FIXES: f((*p).data()); } -template <typename T> -void u(std::unique_ptr<T> p) { +template <typename Cont> +void u(std::unique_ptr<Cont> p) { f(&(*p)[0]); // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] // CHECK-FIXES: f((*p).data()); >From 253c39d13028a22271b4fe98e19cfca02b3beb25 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Sun, 9 Nov 2025 10:32:53 +0800 Subject: [PATCH 11/12] Revert "Add more tests" This reverts commit f63a789bac9970206a38e41cd386dc012fbee704. --- .../readability/ContainerDataPointerCheck.cpp | 33 +++++++++---------- .../readability/ContainerDataPointerCheck.h | 2 +- .../readability/container-data-pointer.cpp | 9 ----- 3 files changed, 16 insertions(+), 28 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp index b9b8c9a829bfe..dba4aa8d5fc6e 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.cpp @@ -71,20 +71,20 @@ void ContainerDataPointerCheck::registerMatchers(MatchFinder *Finder) { const auto Zero = integerLiteral(equals(0)); - const auto AddressOfMatcher = + const auto SubscriptOperator = callee(cxxMethodDecl(hasName("operator[]"))); + + Finder->addMatcher( unaryOperator( unless(isExpansionInSystemHeader()), hasOperatorName("&"), - hasUnaryOperand(ignoringParenImpCasts(expr(anyOf( - cxxOperatorCallExpr( - hasOverloadedOperatorName("[]"), argumentCountIs(2), - hasArgument(0, ContainerExpr), hasArgument(1, Zero)), - cxxMemberCallExpr(callee(cxxMethodDecl(hasName("operator[]"))), - on(ContainerExpr), argumentCountIs(1), - hasArgument(0, Zero)), - arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero))))))) - .bind(AddressOfName); - - Finder->addMatcher(AddressOfMatcher, this); + hasUnaryOperand(expr( + anyOf(cxxOperatorCallExpr(SubscriptOperator, argumentCountIs(2), + hasArgument(0, ContainerExpr), + hasArgument(1, Zero)), + cxxMemberCallExpr(SubscriptOperator, on(ContainerExpr), + argumentCountIs(1), hasArgument(0, Zero)), + arraySubscriptExpr(hasLHS(ContainerExpr), hasRHS(Zero)))))) + .bind(AddressOfName), + this); } void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { @@ -101,19 +101,16 @@ void ContainerDataPointerCheck::check(const MatchFinder::MatchResult &Result) { else if (ACE) CE = ACE; - const Expr *PrintedCE = CE->IgnoreParenImpCasts(); - - SourceRange SrcRange = PrintedCE->getSourceRange(); + SourceRange SrcRange = CE->getSourceRange(); std::string ReplacementText{ Lexer::getSourceText(CharSourceRange::getTokenRange(SrcRange), *Result.SourceManager, getLangOpts())}; - const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(PrintedCE); + const auto *OpCall = dyn_cast<CXXOperatorCallExpr>(CE); const bool NeedsParens = OpCall ? (OpCall->getOperator() != OO_Subscript) - : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>( - PrintedCE); + : !isa<DeclRefExpr, MemberExpr, ArraySubscriptExpr, CallExpr>(CE); if (NeedsParens) ReplacementText = "(" + ReplacementText + ")"; diff --git a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h index d71cb7ff21904..71fde87fbb093 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h +++ b/clang-tools-extra/clang-tidy/readability/ContainerDataPointerCheck.h @@ -34,7 +34,7 @@ class ContainerDataPointerCheck : public ClangTidyCheck { void check(const ast_matchers::MatchFinder::MatchResult &Result) override; std::optional<TraversalKind> getCheckTraversalKind() const override { - return TK_AsIs; + return TK_IgnoreUnlessSpelledInSource; } private: diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp index 12fa030fc0af2..26f9d9f16ac8c 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp @@ -156,12 +156,3 @@ void s(std::unique_ptr<std::vector<unsigned char>> p) { // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] // CHECK-FIXES: f((*p).data()); } - -template <typename Cont> -void u(std::unique_ptr<Cont> p) { - f(&(*p)[0]); - // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] - // CHECK-FIXES: f((*p).data()); -} - -template void u<std::vector<int>>(std::unique_ptr<std::vector<int>>); >From 4ebc962c733aa04c0bc6867d44597547b0bda21d Mon Sep 17 00:00:00 2001 From: mitchell <[email protected]> Date: Sun, 9 Nov 2025 18:47:55 +0800 Subject: [PATCH 12/12] Update clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp Co-authored-by: Baranov Victor <[email protected]> --- .../checkers/readability/container-data-pointer.cpp | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp index 26f9d9f16ac8c..2ed1e939d71d4 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-data-pointer.cpp @@ -156,3 +156,14 @@ void s(std::unique_ptr<std::vector<unsigned char>> p) { // CHECK-MESSAGES: :[[@LINE-1]]:5: warning: 'data' should be used for accessing the data pointer instead of taking the address of the 0-th element [readability-container-data-pointer] // CHECK-FIXES: f((*p).data()); } + +void t(std::unique_ptr<container_without_data<unsigned char>> p) { + // p has no "data" member function, so no warning + f(&(*p)[0]); +} + +template <typename T> +void u(std::unique_ptr<T> p) { + // we don't know if 'T' will always have "data" member function, so no warning + f(&(*p)[0]); +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
