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/11] [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/11] 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/11] 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/11] 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/11] 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/11] 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/11] 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/11] 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/11] 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/11] 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/11] 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>>);

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to