https://github.com/MythreyaK updated 
https://github.com/llvm/llvm-project/pull/152445

>From d66aaec0a298433af6a52ad5ebe87fc578a3e7bc Mon Sep 17 00:00:00 2001
From: Mythreya Kuricheti <g...@mythreya.dev>
Date: Wed, 6 Aug 2025 22:49:28 -0700
Subject: [PATCH] [clang] CodeComplete fix for addr of deduced-this methods

---
 .../clangd/unittests/CodeCompleteTests.cpp    | 11 ++++----
 clang/lib/Sema/SemaCodeComplete.cpp           | 25 +++++++++++++------
 2 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp 
b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 61bd6318b46cf..8a7188ee7260c 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -4462,15 +4462,16 @@ TEST(CompletionTest, SkipExplicitObjectParameter) {
                                Preamble.get(), Inputs, Opts);
     EXPECT_THAT(
         Result.Completions,
-        ElementsAre(AllOf(named("foo"), signature("<class self:auto>(int 
arg)"),
-                          snippetSuffix("<${1:class self:auto}>"))));
+        ElementsAre(AllOf(named("foo"), signature("(auto &&self, int arg)"),
+                          snippetSuffix("(${1:auto &&self}, ${2:int arg})"))));
   }
   {
     auto Result = codeComplete(testPath(TU.Filename), Code.point("c3"),
                                Preamble.get(), Inputs, Opts);
-    EXPECT_THAT(Result.Completions,
-                ElementsAre(AllOf(named("bar"), signature("(int arg)"),
-                                  snippetSuffix(""))));
+    EXPECT_THAT(
+        Result.Completions,
+        ElementsAre(AllOf(named("bar"), signature("(A self, int arg)"),
+                          snippetSuffix("(${1:A self}, ${2:int arg})"))));
   }
 }
 } // namespace
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp 
b/clang/lib/Sema/SemaCodeComplete.cpp
index 0de55800ccdd1..357798e20aca3 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -1312,6 +1312,11 @@ bool ResultBuilder::canCxxMethodBeCalled(const 
CXXMethodDecl *Method,
       (CurrentClassScope == Method->getParent() ||
        CurrentClassScope->isDerivedFrom(Method->getParent()));
 
+  // if method is using C++23 "deducing this", then it is a call
+  if (Method->isExplicitObjectMemberFunction()) {
+    FunctionCanBeCall = true;
+  }
+
   // We skip the following calculation for exceptions if it's already true.
   if (FunctionCanBeCall)
     return true;
@@ -3240,6 +3245,7 @@ static std::string GetDefaultValueString(const 
ParmVarDecl *Param,
 static void AddFunctionParameterChunks(Preprocessor &PP,
                                        const PrintingPolicy &Policy,
                                        const FunctionDecl *Function,
+                                       const CodeCompletionContext &CCContext,
                                        CodeCompletionBuilder &Result,
                                        unsigned Start = 0,
                                        bool InOptional = false) {
@@ -3255,15 +3261,17 @@ static void AddFunctionParameterChunks(Preprocessor &PP,
                                 Result.getCodeCompletionTUInfo());
       if (!FirstParameter)
         Opt.AddChunk(CodeCompletionString::CK_Comma);
-      AddFunctionParameterChunks(PP, Policy, Function, Opt, P, true);
+      AddFunctionParameterChunks(PP, Policy, Function, CCContext, Opt, P, 
true);
       Result.AddOptionalChunk(Opt.TakeString());
       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()) {
+    // parameter. But if the context is a symbol, i.e., "A::method" call,
+    // do not skip
+    auto IsSymbol = CCContext.getKind() == CodeCompletionContext::CCC_Symbol;
+    if (FirstParameter && Param->isExplicitObjectParameter() && !IsSymbol) {
       continue;
     }
 
@@ -3726,7 +3734,7 @@ CodeCompletionString 
*CodeCompletionResult::createCodeCompletionStringForDecl(
                                    Ctx, Policy);
     AddTypedNameChunk(Ctx, Policy, ND, Result);
     Result.AddChunk(CodeCompletionString::CK_LeftParen);
-    AddFunctionParameterChunks(PP, Policy, Function, Result);
+    AddFunctionParameterChunks(PP, Policy, Function, CCContext, Result);
     Result.AddChunk(CodeCompletionString::CK_RightParen);
     AddFunctionTypeQualsToCompletionString(Result, Function);
   };
@@ -3808,7 +3816,7 @@ CodeCompletionString 
*CodeCompletionResult::createCodeCompletionStringForDecl(
 
     // Add the function parameters
     Result.AddChunk(CodeCompletionString::CK_LeftParen);
-    AddFunctionParameterChunks(PP, Policy, Function, Result);
+    AddFunctionParameterChunks(PP, Policy, Function, CCContext, Result);
     Result.AddChunk(CodeCompletionString::CK_RightParen);
     AddFunctionTypeQualsToCompletionString(Result, Function);
     return Result.TakeString();
@@ -7132,13 +7140,16 @@ void 
SemaCodeCompletion::CodeCompleteConstructorInitializer(
   auto GenerateCCS = [&](const NamedDecl *ND, const char *Name) {
     CodeCompletionBuilder Builder(Results.getAllocator(),
                                   Results.getCodeCompletionTUInfo());
+    auto CCContext = Results.getCompletionContext();
     Builder.AddTypedTextChunk(Name);
     Builder.AddChunk(CodeCompletionString::CK_LeftParen);
     if (const auto *Function = dyn_cast<FunctionDecl>(ND))
-      AddFunctionParameterChunks(SemaRef.PP, Policy, Function, Builder);
+      AddFunctionParameterChunks(SemaRef.PP, Policy, Function, CCContext,
+                                 Builder);
     else if (const auto *FunTemplDecl = dyn_cast<FunctionTemplateDecl>(ND))
       AddFunctionParameterChunks(SemaRef.PP, Policy,
-                                 FunTemplDecl->getTemplatedDecl(), Builder);
+                                 FunTemplDecl->getTemplatedDecl(), CCContext,
+                                 Builder);
     Builder.AddChunk(CodeCompletionString::CK_RightParen);
     return Builder.TakeString();
   };

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to