[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