[clang] [clang-tools-extra] fixed signature help for c++23 static () operator (PR #234918)

Daniel Aviv via cfe-commits cfe-commits at lists.llvm.org
Sat Oct 24 08:44:34 PDT 2026


https://github.com/o3wiz updated https://github.com/llvm/llvm-project/pull/234918

>From 666315f2f64d8eb75881f28252faf5dbe946828b Mon Sep 17 00:00:00 2001
From: Daniel Aviv <dani6laviv at gmail.com>
Date: Fri, 23 Oct 2026 15:04:21 +0300
Subject: [PATCH] fixed signature help for c++23 static () operator

---
 .../clangd/unittests/CodeCompleteTests.cpp    | 43 +++++++++++++++++++
 clang/lib/Sema/SemaCodeComplete.cpp           |  3 +-
 2 files changed, 45 insertions(+), 1 deletion(-)

diff --git a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
index edfd29136881fd..a7b7f6c773486e 100644
--- a/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
+++ b/clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp
@@ -3529,6 +3529,49 @@ TEST(SignatureHelpTest, VariadicType) {
   }
 }
 
+TEST(SignatureHelpTest, StaticCallOperator) {
+  Annotations Code(R"cpp(
+    struct A { static void operator()(bool a); };
+    struct B { static void operator()(bool a, bool b); };
+    struct C { template <typename T> static void operator()(T a); };
+    struct D { template <typename T> static void operator()(T a, bool b); };
+    void test() {
+      A{}($a^);
+      B{}($b^);
+      B{}(true, $b2^);
+      C{}($c^);
+      D{}($d^);
+      D{}(true, $d2^);
+    }
+  )cpp");
+  auto TU = TestTU::withCode(Code.code());
+  TU.ExtraArgs = {"-std=c++23"};
+  MockFS FS;
+  auto Inputs = TU.inputs(FS);
+  auto Preamble = TU.preamble();
+  ASSERT_TRUE(Preamble);
+
+  const struct {
+    const char *Point;
+    const char *Signature;
+    int ActiveParameter;
+  } Cases[] = {
+      {"a", "operator()([[bool a]]) -> void", 0},
+      {"b", "operator()([[bool a]], [[bool b]]) -> void", 0},
+      {"b2", "operator()([[bool a]], [[bool b]]) -> void", 1},
+      {"c", "operator()([[T a]]) -> void", 0},
+      {"d", "operator()([[T a]], [[bool b]]) -> void", 0},
+      {"d2", "operator()([[T a]], [[bool b]]) -> void", 1},
+  };
+  for (const auto &Case : Cases) {
+    SCOPED_TRACE(Case.Point);
+    auto Result = signatureHelp(testPath(TU.Filename), Code.point(Case.Point),
+                                *Preamble, Inputs, MarkupKind::PlainText);
+    EXPECT_THAT(Result.signatures, ElementsAre(sig(Case.Signature)));
+    EXPECT_EQ(Case.ActiveParameter, Result.activeParameter);
+  }
+}
+
 TEST(SignatureHelpTest, SkipExplicitObjectParameter) {
   Annotations Code(R"cpp(
     struct A {
diff --git a/clang/lib/Sema/SemaCodeComplete.cpp b/clang/lib/Sema/SemaCodeComplete.cpp
index 2e852281395280..727933f7d7195f 100644
--- a/clang/lib/Sema/SemaCodeComplete.cpp
+++ b/clang/lib/Sema/SemaCodeComplete.cpp
@@ -6567,7 +6567,8 @@ SemaCodeCompletion::ProduceCallSignatureHelp(Expr *Fn, ArrayRef<Expr *> Args,
                                       CandidateSet,
                                       /*ExplicitArgs=*/nullptr,
                                       /*SuppressUserConversions=*/false,
-                                      /*PartialOverloading=*/true);
+                                      /*PartialOverloading=*/true,
+                                      /*FirstArgumentIsBase=*/true);
       }
     } else {
       // Lastly we check whether expression's type is function pointer or



More information about the cfe-commits mailing list