[clang-tools-extra] f0f53cb - [clangd] Do not ignore qualifier in heuristic resolution of dependent MemberExpr
Nathan Ridge via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 25 13:54:42 PDT 2023
Author: Nathan Ridge
Date: 2023-08-25T16:54:29-04:00
New Revision: f0f53cb4bfb2b6c5ec6661b565a764c704484fa2
URL: https://github.com/llvm/llvm-project/commit/f0f53cb4bfb2b6c5ec6661b565a764c704484fa2
DIFF: https://github.com/llvm/llvm-project/commit/f0f53cb4bfb2b6c5ec6661b565a764c704484fa2.diff
LOG: [clangd] Do not ignore qualifier in heuristic resolution of dependent MemberExpr
Fixes https://github.com/llvm/llvm-project/issues/64841
Differential Revision: https://reviews.llvm.org/D158873
Added:
Modified:
clang-tools-extra/clangd/HeuristicResolver.cpp
clang-tools-extra/clangd/unittests/XRefsTests.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/clangd/HeuristicResolver.cpp b/clang-tools-extra/clangd/HeuristicResolver.cpp
index 719094dbf2b7e5..3c147b6b582bf0 100644
--- a/clang-tools-extra/clangd/HeuristicResolver.cpp
+++ b/clang-tools-extra/clangd/HeuristicResolver.cpp
@@ -119,8 +119,8 @@ const Type *HeuristicResolver::getPointeeType(const Type *T) const {
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 @@ std::vector<const NamedDecl *> HeuristicResolver::resolveMemberExpr(
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);
diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
index 6d7fd62016991a..f53cbf01b7992c 100644
--- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp
@@ -1009,7 +1009,17 @@ TEST(LocateSymbol, All) {
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;
More information about the cfe-commits
mailing list