[clang] [clang-tools-extra] [clang] Skip unqualified members in explicit member functions (PR #153760)
Mythreya Kuricheti via cfe-commits
cfe-commits at lists.llvm.org
Fri Aug 15 00:56:01 PDT 2025
https://github.com/MythreyaK created https://github.com/llvm/llvm-project/pull/153760
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]
>From 690ca3d679c2df1386a212533afecab3bc86995f Mon Sep 17 00:00:00 2001
From: Mythreya Kuricheti <git at mythreya.dev>
Date: Fri, 15 Aug 2025 00:52:37 -0700
Subject: [PATCH] [clang] Skip unqualified members in explicit-member functions
---
.../clangd/unittests/CodeCompleteTests.cpp | 39 +++++++++++++++++++
clang/lib/Sema/SemaCodeComplete.cpp | 10 +++++
2 files changed, 49 insertions(+)
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()) {
More information about the cfe-commits
mailing list