[PATCH] D158873: [clangd] Do not ignore qualifier in heuristic resolution of dependent MemberExpr

Nathan Ridge via Phabricator via cfe-commits cfe-commits at lists.llvm.org
Fri Aug 25 13:54:51 PDT 2023


This revision was landed with ongoing or failed builds.
This revision was automatically updated to reflect the committed changes.
Closed by commit rGf0f53cb4bfb2: [clangd] Do not ignore qualifier in heuristic resolution of dependent MemberExpr (authored by nridge).

Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D158873/new/

https://reviews.llvm.org/D158873

Files:
  clang-tools-extra/clangd/HeuristicResolver.cpp
  clang-tools-extra/clangd/unittests/XRefsTests.cpp


Index: clang-tools-extra/clangd/unittests/XRefsTests.cpp
===================================================================
--- clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -1009,7 +1009,17 @@
         void play(Dog *dog) {
           [dog ho^wl];
         }
-      )objc"};
+      )objc",
+      R"cpp(
+        struct PointerIntPairInfo {
+          static void *getPointer(void *Value);
+        };
+
+        template <typename Info = PointerIntPairInfo> struct PointerIntPair {
+          void *Value;
+          void *getPointer() const { return Info::get^Pointer(Value); }
+        };
+    )cpp"};
   for (const char *Test : Tests) {
     Annotations T(Test);
     std::optional<Range> WantDecl;
Index: clang-tools-extra/clangd/HeuristicResolver.cpp
===================================================================
--- clang-tools-extra/clangd/HeuristicResolver.cpp
+++ clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -119,8 +119,8 @@
 
 std::vector<const NamedDecl *> HeuristicResolver::resolveMemberExpr(
     const CXXDependentScopeMemberExpr *ME) const {
-  // If the expression has a qualifier, first try resolving the member
-  // inside the qualifier's type.
+  // If the expression has a qualifier, try resolving the member inside the
+  // qualifier's type.
   // Note that we cannot use a NonStaticFilter in either case, for a couple
   // of reasons:
   //   1. It's valid to access a static member using instance member syntax,
@@ -137,10 +137,15 @@
       if (!Decls.empty())
         return Decls;
     }
+
+    // Do not proceed to try resolving the member in the expression's base type
+    // without regard to the qualifier, as that could produce incorrect results.
+    // For example, `void foo() { this->Base::foo(); }` shouldn't resolve to
+    // foo() itself!
+    return {};
   }
 
-  // If that didn't yield any results, try resolving the member inside
-  // the expression's base type.
+  // Try resolving the member inside the expression's base type.
   const Type *BaseType = ME->getBaseType().getTypePtrOrNull();
   if (ME->isArrow()) {
     BaseType = getPointeeType(BaseType);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D158873.553608.patch
Type: text/x-patch
Size: 2184 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20230825/20c2768b/attachment.bin>


More information about the cfe-commits mailing list