https://github.com/MythreyaK updated https://github.com/llvm/llvm-project/pull/146258
>From a839ba01fc05750ca880ac430a70f7df766f7694 Mon Sep 17 00:00:00 2001 From: Mythreya Kuricheti <g...@mythreya.dev> Date: Sat, 28 Jun 2025 19:06:06 -0700 Subject: [PATCH] [clang] skip explicit obj param in code complete Skips the first explicit object parameter when generating autocomplete suggestion string --- .../clangd/unittests/CodeCompleteTests.cpp | 29 +++++++++++++++++++ clang/lib/Sema/SemaCodeComplete.cpp | 7 +++++ 2 files changed, 36 insertions(+) diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 311f0d98904ad..34cab8a957a19 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -4363,6 +4363,35 @@ TEST(CompletionTest, PreambleFromDifferentTarget) { EXPECT_THAT(Result.Completions, Not(testing::IsEmpty())); EXPECT_THAT(Signatures.signatures, Not(testing::IsEmpty())); } + +TEST(CompletionTest, DeducingThisIgnoreSelf) { + Annotations Test(R"cpp( + struct A { + void f(this auto&& self, int arg); + }; + + int main() { + A a {}; + a.^ + } + )cpp"); + + auto TU = TestTU::withCode(Test.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), Test.point(), + Preamble.get(), Inputs, Opts); + + EXPECT_THAT(Result.Completions, + ElementsAre(AllOf(named("f"), snippetSuffix("(${1:int arg})")))); +} } // namespace } // namespace clangd } // namespace clang diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp index 78d4586e45978..b5d4a94da83df 100644 --- a/clang/lib/Sema/SemaCodeComplete.cpp +++ b/clang/lib/Sema/SemaCodeComplete.cpp @@ -3260,6 +3260,13 @@ static void AddFunctionParameterChunks(Preprocessor &PP, break; } + // C++23 introduces an explicit object parameter, a.k.a. "deducing this" + // Skip it for autocomplete and treat the next parameter as the first + // parameter + if (FirstParameter && Param->isExplicitObjectParameter()) { + continue; + } + if (FirstParameter) FirstParameter = false; else _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits