Author: Nathan Ridge
Date: 2026-02-25T01:09:40-05:00
New Revision: 0fa0bb10673cc8e55ff5d639cb741eded78aa255

URL: 
https://github.com/llvm/llvm-project/commit/0fa0bb10673cc8e55ff5d639cb741eded78aa255
DIFF: 
https://github.com/llvm/llvm-project/commit/0fa0bb10673cc8e55ff5d639cb741eded78aa255.diff

LOG: [clangd] Handle MemberPointerTypeLoc in SelectionTree (#183242)

This is another type loc that overlaps the name of the declaration whose
type it is, and so needs special handling to allow the declaration
itself to be targeted.

Fixes https://github.com/clangd/clangd/issues/2608

Added: 
    

Modified: 
    clang-tools-extra/clangd/Selection.cpp
    clang-tools-extra/clangd/unittests/XRefsTests.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clangd/Selection.cpp 
b/clang-tools-extra/clangd/Selection.cpp
index 01f1470f7fac3..fb2fb052388f5 100644
--- a/clang-tools-extra/clangd/Selection.cpp
+++ b/clang-tools-extra/clangd/Selection.cpp
@@ -959,6 +959,10 @@ class SelectionVisitor : public 
RecursiveASTVisitor<SelectionVisitor> {
         claimRange(PTL.getStarLoc(), Result);
         return;
       }
+      if (auto MPTL = TL->getAs<MemberPointerTypeLoc>()) {
+        claimRange(MPTL.getLocalSourceRange(), Result);
+        return;
+      }
       if (auto FTL = TL->getAs<FunctionTypeLoc>()) {
         claimRange(SourceRange(FTL.getLParenLoc(), FTL.getEndLoc()), Result);
         return;

diff  --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp 
b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
index 757833c58ee17..8e97db7ab17c5 100644
--- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -2370,6 +2370,16 @@ TEST(FindReferences, WithinAST) {
           [$(Bar)[[F^oo]]...$(Bar)[[Fo^o]] + 1] = 0,
           [$(Bar)[[^Foo]] + 2] = 1
         };
+      )cpp",
+      // Field of pointer-to-member type
+      R"cpp(
+        struct S { void foo(); };
+        struct A {
+          void (S::*$def(A)[[fi^eld]])();
+        };
+        void bar(A& a, S& s) {
+          (s.*(a.$(bar)[[field]]))();
+        }
       )cpp"};
   for (const char *Test : Tests)
     checkFindRefs(Test);


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

Reply via email to