Skip to content

Commit 6f0ff1b

Browse files
[clang][CodeComplete] Use HeuristicResolver to resolve CXXDependentScopeMemberExpr
1 parent 753028b commit 6f0ff1b

File tree

1 file changed

+4
-17
lines changed

1 file changed

+4
-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
}

0 commit comments

Comments
 (0)