Skip to content

Commit a28c3b6

Browse files
[clang][CodeComplete] Use HeuristicResolver to resolve CXXDependentScopeMemberExpr
1 parent 7fd8426 commit a28c3b6

File tree

2 files changed

+22
-17
lines changed

2 files changed

+22
-17
lines changed

clang/lib/Sema/SemaCodeComplete.cpp

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5796,24 +5796,11 @@ QualType getApproximateType(const Expr *E, HeuristicResolver &Resolver) {
57965796
return QualType(Common, 0);
57975797
}
57985798
}
5799-
// A dependent member: approximate-resolve the base, then lookup.
5799+
// A dependent member: resolve using HeuristicResolver.
58005800
if (const auto *CDSME = llvm::dyn_cast<CXXDependentScopeMemberExpr>(E)) {
5801-
QualType Base = CDSME->isImplicitAccess()
5802-
? CDSME->getBaseType()
5803-
: getApproximateType(CDSME->getBase(), Resolver);
5804-
if (CDSME->isArrow() && !Base.isNull())
5805-
Base = Base->getPointeeType(); // could handle unique_ptr etc here?
5806-
auto *RD =
5807-
Base.isNull()
5808-
? nullptr
5809-
: llvm::dyn_cast_or_null<CXXRecordDecl>(getAsRecordDecl(Base));
5810-
if (RD && RD->isCompleteDefinition()) {
5811-
// Look up member heuristically, including in bases.
5812-
for (const auto *Member : RD->lookupDependentName(
5813-
CDSME->getMember(), [](const NamedDecl *Member) {
5814-
return llvm::isa<ValueDecl>(Member);
5815-
})) {
5816-
return llvm::cast<ValueDecl>(Member)->getType().getNonReferenceType();
5801+
for (const auto *Member : Resolver.resolveMemberExpr(CDSME)) {
5802+
if (const auto *VD = dyn_cast<ValueDecl>(Member)) {
5803+
return VD->getType().getNonReferenceType();
58175804
}
58185805
}
58195806
}

clang/test/CodeCompletion/member-access.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -417,3 +417,21 @@ void f() {
417417
// CHECK-DEPENDENT-NESTEDCLASS: [#int#]field
418418
}
419419
}
420+
421+
namespace template_alias {
422+
struct A {
423+
int b;
424+
};
425+
template <typename T>
426+
struct S {
427+
A a;
428+
};
429+
template <typename T>
430+
using Alias = S<T>;
431+
template <typename T>
432+
void f(Alias<T> s) {
433+
s.a.b;
434+
// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:433:7 %s -o - | FileCheck -check-prefix=CHECK-TEMPLATE-ALIAS %s
435+
// CHECK-TEMPLATE-ALIAS: [#int#]b
436+
}
437+
}

0 commit comments

Comments
 (0)