https://github.com/HighCommander4 updated https://github.com/llvm/llvm-project/pull/124888
>From a28c3b66cfe3d12b05c45fdf9dc40ee961439c2e Mon Sep 17 00:00:00 2001 From: Nathan Ridge <zeratul...@hotmail.com> Date: Sun, 26 Jan 2025 01:30:28 -0500 Subject: [PATCH] [clang][CodeComplete] Use HeuristicResolver to resolve CXXDependentScopeMemberExpr --- clang/lib/Sema/SemaCodeComplete.cpp | 21 ++++----------------- clang/test/CodeCompletion/member-access.cpp | 18 ++++++++++++++++++ 2 files changed, 22 insertions(+), 17 deletions(-) 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 +} +} _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits