[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