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 1/2] [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 >From 8b015eb8011033b021c92654ef33498bef244e6e Mon Sep 17 00:00:00 2001 From: Mythreya Kuricheti <g...@mythreya.dev> Date: Sun, 29 Jun 2025 16:10:01 -0700 Subject: [PATCH 2/2] address review comments --- .../clangd/unittests/CodeCompleteTests.cpp | 3 ++- .../CodeCompletion/explicit-object-parameter.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 clang/test/CodeCompletion/explicit-object-parameter.cpp diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp index 34cab8a957a19..d163b4bff4f0c 100644 --- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp +++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp @@ -4390,7 +4390,8 @@ TEST(CompletionTest, DeducingThisIgnoreSelf) { Preamble.get(), Inputs, Opts); EXPECT_THAT(Result.Completions, - ElementsAre(AllOf(named("f"), snippetSuffix("(${1:int arg})")))); + ElementsAre(AllOf(named("f"), signature("(int arg)"), + snippetSuffix("(${1:int arg})")))); } } // namespace } // namespace clangd diff --git a/clang/test/CodeCompletion/explicit-object-parameter.cpp b/clang/test/CodeCompletion/explicit-object-parameter.cpp new file mode 100644 index 0000000000000..3ed315321c04a --- /dev/null +++ b/clang/test/CodeCompletion/explicit-object-parameter.cpp @@ -0,0 +1,14 @@ +struct A { + void f(this A self, int arg); +}; + +int main() { + A a {}; + a. +} +// RUN: %clang_cc1 -cc1 -fsyntax-only -code-completion-at=%s:%(line-2):5 -std=c++23 %s | FileCheck %s +// CHECK: COMPLETION: A : A:: +// CHECK-NEXT: COMPLETION: f : [#void#]f(<#int arg#>) +// CHECK-NEXT: COMPLETION: operator= : [#A &#]operator=(<#const A &#>) +// CHECK-NEXT: COMPLETION: operator= : [#A &#]operator=(<#A &&#>) +// CHECK-NEXT: COMPLETION: ~A : [#void#]~A() _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits