llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang Author: Nathan Ridge (HighCommander4) <details> <summary>Changes</summary> Fixes https://github.com/clangd/clangd/issues/810 --- Full diff: https://github.com/llvm/llvm-project/pull/121315.diff 3 Files Affected: - (modified) clang/include/clang/Sema/SemaCodeCompletion.h (+2) - (modified) clang/lib/Sema/SemaCodeComplete.cpp (+10-5) - (modified) clang/test/CodeCompletion/member-access.cpp (+17) ``````````diff diff --git a/clang/include/clang/Sema/SemaCodeCompletion.h b/clang/include/clang/Sema/SemaCodeCompletion.h index 50409439389b06..e931596c215d31 100644 --- a/clang/include/clang/Sema/SemaCodeCompletion.h +++ b/clang/include/clang/Sema/SemaCodeCompletion.h @@ -23,6 +23,7 @@ #include "clang/Sema/CodeCompleteConsumer.h" #include "clang/Sema/DeclSpec.h" #include "clang/Sema/Designator.h" +#include "clang/Sema/HeuristicResolver.h" #include "clang/Sema/Ownership.h" #include "clang/Sema/SemaBase.h" #include "llvm/ADT/StringRef.h" @@ -43,6 +44,7 @@ class SemaCodeCompletion : public SemaBase { /// Code-completion consumer. CodeCompleteConsumer *CodeCompleter; + HeuristicResolver Resolver; /// Describes the context in which code completion occurs. enum ParserCompletionContext { diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 8a848df70cc5a1..69cda6e68bd36b 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -34,6 +34,7 @@ #include "clang/Sema/CodeCompleteConsumer.h" #include "clang/Sema/DeclSpec.h" #include "clang/Sema/Designator.h" +#include "clang/Sema/HeuristicResolver.h" #include "clang/Sema/Lookup.h" #include "clang/Sema/Overload.h" #include "clang/Sema/ParsedAttr.h" @@ -5861,8 +5862,10 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr( enum CodeCompletionContext::Kind contextKind; if (IsArrow) { - if (const auto *Ptr = ConvertedBaseType->getAs<PointerType>()) - ConvertedBaseType = Ptr->getPointeeType(); + if (QualType PointeeType = Resolver.getPointeeType(ConvertedBaseType); + !PointeeType.isNull()) { + ConvertedBaseType = PointeeType; + } } if (IsArrow) { @@ -5899,8 +5902,9 @@ void SemaCodeCompletion::CodeCompleteMemberReferenceExpr( ExprValueKind BaseKind = Base->getValueKind(); if (IsArrow) { - if (const PointerType *Ptr = BaseType->getAs<PointerType>()) { - BaseType = Ptr->getPointeeType(); + if (QualType PointeeType = Resolver.getPointeeType(BaseType); + !PointeeType.isNull()) { + BaseType = PointeeType; BaseKind = VK_LValue; } else if (BaseType->isObjCObjectPointerType() || BaseType->isTemplateTypeParmType()) { @@ -10472,4 +10476,5 @@ void SemaCodeCompletion::GatherGlobalCodeCompletions( SemaCodeCompletion::SemaCodeCompletion(Sema &S, CodeCompleteConsumer *CompletionConsumer) - : SemaBase(S), CodeCompleter(CompletionConsumer) {} + : SemaBase(S), CodeCompleter(CompletionConsumer), + Resolver(S.getASTContext()) {} diff --git a/clang/test/CodeCompletion/member-access.cpp b/clang/test/CodeCompletion/member-access.cpp index 912f269db6c1ac..ab6dc69bf2923d 100644 --- a/clang/test/CodeCompletion/member-access.cpp +++ b/clang/test/CodeCompletion/member-access.cpp @@ -384,3 +384,20 @@ void Foo() { // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:382:5 %s -o - | FileCheck -check-prefix=CHECK-DEREF-DEPENDENT %s // CHECK-DEREF-DEPENDENT: [#void#]Add() } + +namespace dependent_smart_pointer { +template <typename T> +struct smart_pointer { + T* operator->(); +}; + +template <typename T> +struct node { + smart_pointer<node<T>> next; + void foo() { + next->next; + // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:398:11 %s -o - | FileCheck -check-prefix=CHECK-DEPENDENT-SMARTPTR %s + // CHECK-DEPENDENT-SMARTPTR: [#smart_pointer<node<T>>#]next + } +}; +} `````````` </details> https://github.com/llvm/llvm-project/pull/121315 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits