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

Attempts to fix code complete for 

```cpp
struct A {
  void foo(this auto&& self, int arg); 
  void bar(this A self, int arg);
};

int main() {
  A a {};
  (&A::fo$c^;
}
```

This should return 
```
signature = (auto&& self, int arg)
snippet = (${1: auto&& self}, ${2: int arg})
```

>From 90fe63ae00fe24a12ab83594fbd6655a9688c73d 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

---
 clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp | 4 ++--
 clang/lib/Sema/SemaCodeComplete.cpp                      | 5 +++++
 2 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp 
b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index 61bd6318b46cf..aff67d21fce7e 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -4462,8 +4462,8 @@ 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("(int arg)"),
+                          snippetSuffix("(${1:int arg})"))));
   }
   {
     auto Result = codeComplete(testPath(TU.Filename), Code.point("c3"),
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp 
b/clang/lib/Sema/SemaCodeComplete.cpp
index 0de55800ccdd1..8ccf91f17857f 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;

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

Reply via email to