llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-tools-extra Author: Mythreya Kuricheti (MythreyaK) <details> <summary>Changes</summary> Fixes #<!-- -->141291 Skip suggesting members when not using `self.` in explicit object methods. [TODO: Need to add a semacodecomplete test too, will add it in a new commit] --- Full diff: https://github.com/llvm/llvm-project/pull/153760.diff 3 Files Affected: - (modified) clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp (+39) - (modified) clang/lib/Sema/SemaCodeComplete.cpp (+10) - (renamed) clang/test/CodeCompletion/cpp23-explicit-object.cpp (+17-1) ``````````diff diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 1a1c32c241602..360693a02a1f5 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -4473,6 +4473,45 @@ TEST(CompletionTest, SkipExplicitObjectParameter) { snippetSuffix("")))); } } + +TEST(CompletionTest, MemberAccessInExplicitObjMemfn) { + Annotations Code(R"cpp( + struct A { + int member {}; + + void foo(this A& self) { + // Should not offer `member` here, since it needs to be + // referenced as `self.member`. + mem$c1^; + self.mem$c2^; + } + }; + )cpp"); + + auto TU = TestTU::withCode(Code.code()); + TU.ExtraArgs = {"-std=c++23"}; + + auto Preamble = TU.preamble(); + ASSERT_TRUE(Preamble); + + CodeCompleteOptions Opts{}; + + MockFS FS; + auto Inputs = TU.inputs(FS); + + { + auto Result = codeComplete(testPath(TU.Filename), Code.point("c1"), + Preamble.get(), Inputs, Opts); + + EXPECT_THAT(Result.Completions, ElementsAre()); + } + { + auto Result = codeComplete(testPath(TU.Filename), Code.point("c2"), + Preamble.get(), Inputs, Opts); + + EXPECT_THAT(Result.Completions, ElementsAre(named("member"))); + } +} } // namespace } // namespace clangd } // namespace clang diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index e4f276086af25..224d105c313e6 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -1428,6 +1428,16 @@ void ResultBuilder::AddResult(Result R, DeclContext *CurContext, AdjustResultPriorityForDecl(R); + if (isa<FieldDecl>(R.Declaration)) { + // If result is a member in the context of an explicit-object member + // function, drop it because it must be accessed through the object + // parameter + if (auto *MethodDecl = dyn_cast<CXXMethodDecl>(CurContext); + MethodDecl && MethodDecl->isExplicitObjectMemberFunction()) { + return; + } + } + if (HasObjectTypeQualifiers) if (const auto *Method = dyn_cast<CXXMethodDecl>(R.Declaration)) if (Method->isInstance()) { diff --git a/clang/test/CodeCompletion/skip-explicit-object-parameter.cpp b/clang/test/CodeCompletion/cpp23-explicit-object.cpp similarity index 75% rename from clang/test/CodeCompletion/skip-explicit-object-parameter.cpp rename to clang/test/CodeCompletion/cpp23-explicit-object.cpp index 587d6cb044d19..c903e2dbbf0a9 100644 --- a/clang/test/CodeCompletion/skip-explicit-object-parameter.cpp +++ b/clang/test/CodeCompletion/cpp23-explicit-object.cpp @@ -42,7 +42,23 @@ int func3() { int func4() { // TODO (&A::foo)( - (&A::bar)( + (&A::bar)() } // RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:%(line-2):13 -std=c++23 %s | FileCheck -check-prefix=CHECK-CC5 %s // CHECK-CC5: OVERLOAD: [#void#](<#A#>, int) + +struct C { + int member {}; + void foo(this C& self) { + // Should not offer `member` here, since it needs to be + // referenced as `self.member`. + mem + } + void bar(this C& self) { + self.mem + } +}; +// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:%(line-8):8 -std=c++23 %s | FileCheck --allow-empty %s +// CHECK-NOT: COMPLETION: member : [#int#]member +// RUN: %clang_cc1 -fsyntax-only -code-completion-at=%s:%(line-5):13 -std=c++23 %s | FileCheck -check-prefix=CHECK-CC6 %s +// CHECK-CC6: COMPLETION: member : [#int#]member `````````` </details> https://github.com/llvm/llvm-project/pull/153760 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits