diff --git a/clang-tools-extra/clangd/Selection.cpp b/clang-tools-extra/clangd/Selection.cpp index 01f1470f7fac..fb2fb052388f 100644 --- a/clang-tools-extra/clangd/Selection.cpp +++ b/clang-tools-extra/clangd/Selection.cpp @@ -959,6 +959,10 @@ private: claimRange(PTL.getStarLoc(), Result); return; } + if (auto MPTL = TL->getAs()) { + claimRange(MPTL.getLocalSourceRange(), Result); + return; + } if (auto FTL = TL->getAs()) { 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 757833c58ee1..8e97db7ab17c 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);