[clang] 59da232 - [clang][CodeComplete] Use HeuristicResolver to resolve CXXDependentScopeMemberExpr (#124888)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Jan 30 07:05:30 PST 2025
Author: Nathan Ridge
Date: 2025-01-30T10:05:26-05:00
New Revision: 59da23232ae2824de278a7245d9b8183f9e9b27b
URL: https://github.com/llvm/llvm-project/commit/59da23232ae2824de278a7245d9b8183f9e9b27b
DIFF: https://github.com/llvm/llvm-project/commit/59da23232ae2824de278a7245d9b8183f9e9b27b.diff
LOG: [clang][CodeComplete] Use HeuristicResolver to resolve CXXDependentScopeMemberExpr (#124888)
Added:
Modified:
clang/lib/Sema/SemaCodeComplete.cpp
clang/test/CodeCompletion/member-access.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index f10f7f4768f8e8..80ae87e7c5725c 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -5796,24 +5796,11 @@ QualType getApproximateType(const Expr *E, HeuristicResolver &Resolver) {
return QualType(Common, 0);
}
}
- // A dependent member: approximate-resolve the base, then lookup.
+ // A dependent member: resolve using HeuristicResolver.
if (const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(E)) {
- QualType Base = CDSME->isImplicitAccess()
- ? CDSME->getBaseType()
- : getApproximateType(CDSME->getBase(), Resolver);
- if (CDSME->isArrow() && !Base.isNull())
- Base = Base->getPointeeType(); // could handle unique_ptr etc here?
- auto *RD =
- Base.isNull()
- ? nullptr
- : llvm::dyn_cast_or_null<CXXRecordDecl>(getAsRecordDecl(Base));
- if (RD && RD->isCompleteDefinition()) {
- // Look up member heuristically, including in bases.
- for (const auto *Member : RD->lookupDependentName(
- CDSME->getMember(), [](const NamedDecl *Member) {
- return llvm::isa<ValueDecl>(Member);
- })) {
- return llvm::cast<ValueDecl>(Member)->getType().getNonReferenceType();
+ for (const auto *Member : Resolver.resolveMemberExpr(CDSME)) {
+ if (const auto *VD = dyn_cast<ValueDecl>(Member)) {
+ return VD->getType().getNonReferenceType();
}
}
}
diff --git a/clang/test/CodeCompletion/member-access.cpp b/clang/test/CodeCompletion/member-access.cpp
index bf35f7ad021f71..b181466cdb6287 100644
--- a/clang/test/CodeCompletion/member-access.cpp
+++ b/clang/test/CodeCompletion/member-access.cpp
@@ -417,3 +417,21 @@ void f() {
// CHECK-DEPENDENT-NESTEDCLASS: [#int#]field
}
}
+
+namespace template_alias {
+struct A {
+ int b;
+};
+template <typename T>
+struct S {
+ A a;
+};
+template <typename T>
+using Alias = S<T>;
+template <typename T>
+void f(Alias<T> s) {
+ s.a.b;
+ // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:433:7 %s -o - | FileCheck -check-prefix=CHECK-TEMPLATE-ALIAS %s
+ // CHECK-TEMPLATE-ALIAS: [#int#]b
+}
+}
More information about the cfe-commits
mailing list