https://github.com/hongtaihu updated 
https://github.com/llvm/llvm-project/pull/212134

>From 4a676329523c8fc3b997762154105a6a31bec6dd Mon Sep 17 00:00:00 2001
From: hongtaihu <[email protected]>
Date: Mon, 27 Jul 2026 01:07:59 +0800
Subject: [PATCH 1/2] [clangd] Avoid invalid include-fixer fuzzy-find queries

---
 clang-tools-extra/clangd/IncludeFixer.cpp           |  7 +++++++
 .../clangd/unittests/DiagnosticsTests.cpp           | 13 +++++++++++++
 2 files changed, 20 insertions(+)

diff --git a/clang-tools-extra/clangd/IncludeFixer.cpp 
b/clang-tools-extra/clangd/IncludeFixer.cpp
index 5ecf853524a3f..40b82902576f4 100644
--- a/clang-tools-extra/clangd/IncludeFixer.cpp
+++ b/clang-tools-extra/clangd/IncludeFixer.cpp
@@ -397,6 +397,13 @@ std::optional<std::string> getSpelledSpecifier(const 
CXXScopeSpec &SS,
 std::optional<CheapUnresolvedName> extractUnresolvedNameCheaply(
     const SourceManager &SM, const DeclarationNameInfo &Unresolved,
     CXXScopeSpec *SS, const LangOptions &LangOpts, bool UnresolvedIsSpecifier) 
{
+  // A conversion function name contains a type rather than an unqualified
+  // symbol name. The type may itself be qualified, and cannot be represented
+  // by Name + Scopes.
+  if (Unresolved.getName().getNameKind() ==
+      DeclarationName::CXXConversionFunctionName)
+    return std::nullopt;
+
   CheapUnresolvedName Result;
   Result.Name = Unresolved.getAsString();
   if (SS && SS->isNotEmpty()) { // "::" or "ns::"
diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp 
b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
index 6d91ac1ef1e8e..cb1612fbd318b 100644
--- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -1560,6 +1560,19 @@ TEST(IncludeFixerTest, NoCrashMemberAccess) {
       UnorderedElementsAre(Diag(Test.range(), "no member named 'xy' in 'X'")));
 }
 
+TEST(IncludeFixerTest, IgnoreSpecialDeclarationName) {
+  auto TU = TestTU::withCode(R"cpp(// error-ok
+namespace std {}
+void f() { operator new[](0, operator::align_val_t{}); }
+  )cpp");
+  TU.ExtraArgs.push_back("-std=c++17");
+  auto Index = buildIndexWithSymbol(
+      SymbolWithHeader{"std::align_val_t", "unittest:///new.h", "<new>"});
+  TU.ExternalIndex = Index.get();
+
+  EXPECT_THAT(TU.build().getDiagnostics(), Not(IsEmpty()));
+}
+
 TEST(IncludeFixerTest, UseCachedIndexResults) {
   // As index results for the identical request are cached, more than 5 fixes
   // are generated.

>From f34417c1af36ed0e736707fa70613a6a1612749e Mon Sep 17 00:00:00 2001
From: hongtaihu <[email protected]>
Date: Mon, 27 Jul 2026 01:07:59 +0800
Subject: [PATCH 2/2] [clangd] Avoid invalid include-fixer fuzzy-find queries

---
 clang-tools-extra/clangd/IncludeFixer.cpp     |  6 ++---
 .../clangd/unittests/DiagnosticsTests.cpp     | 26 ++++++++++++++++++-
 2 files changed, 28 insertions(+), 4 deletions(-)

diff --git a/clang-tools-extra/clangd/IncludeFixer.cpp 
b/clang-tools-extra/clangd/IncludeFixer.cpp
index 40b82902576f4..2f056575702e0 100644
--- a/clang-tools-extra/clangd/IncludeFixer.cpp
+++ b/clang-tools-extra/clangd/IncludeFixer.cpp
@@ -397,9 +397,9 @@ std::optional<std::string> getSpelledSpecifier(const 
CXXScopeSpec &SS,
 std::optional<CheapUnresolvedName> extractUnresolvedNameCheaply(
     const SourceManager &SM, const DeclarationNameInfo &Unresolved,
     CXXScopeSpec *SS, const LangOptions &LangOpts, bool UnresolvedIsSpecifier) 
{
-  // A conversion function name contains a type rather than an unqualified
-  // symbol name. The type may itself be qualified, and cannot be represented
-  // by Name + Scopes.
+  // Sema reports an unresolved conversion target type separately. Don't
+  // overwrite that record with the enclosing conversion function name, whose
+  // type cannot be represented by Name + Scopes.
   if (Unresolved.getName().getNameKind() ==
       DeclarationName::CXXConversionFunctionName)
     return std::nullopt;
diff --git a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp 
b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
index cb1612fbd318b..dd1bc00a742c9 100644
--- a/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
+++ b/clang-tools-extra/clangd/unittests/DiagnosticsTests.cpp
@@ -1560,7 +1560,7 @@ TEST(IncludeFixerTest, NoCrashMemberAccess) {
       UnorderedElementsAre(Diag(Test.range(), "no member named 'xy' in 'X'")));
 }
 
-TEST(IncludeFixerTest, IgnoreSpecialDeclarationName) {
+TEST(IncludeFixerTest, NoCrashOnQualifiedConversionFunctionName) {
   auto TU = TestTU::withCode(R"cpp(// error-ok
 namespace std {}
 void f() { operator new[](0, operator::align_val_t{}); }
@@ -1573,6 +1573,30 @@ void f() { operator new[](0, operator::align_val_t{}); }
   EXPECT_THAT(TU.build().getDiagnostics(), Not(IsEmpty()));
 }
 
+TEST(IncludeFixerTest, FixConversionFunctionTargetType) {
+  Annotations Test(R"cpp(// error-ok
+$insert[[]]struct Wrapper {
+  template <typename T>
+  operator T() const { return T(); }
+};
+
+void f() {
+  Wrapper W;
+  auto V = W.operator::$target[[Something]]();
+}
+  )cpp");
+  auto TU = TestTU::withCode(Test.code());
+  auto Index = buildIndexWithSymbol(
+      SymbolWithHeader{"Something", "unittest:///test.h", "\"test.h\""});
+  TU.ExternalIndex = Index.get();
+
+  EXPECT_THAT(TU.build().getDiagnostics(),
+              Contains(Field(
+                  &Diag::Fixes,
+                  Contains(Fix(Test.range("insert"), "#include \"test.h\"\n",
+                               "Include \"test.h\" for symbol Something")))));
+}
+
 TEST(IncludeFixerTest, UseCachedIndexResults) {
   // As index results for the identical request are cached, more than 5 fixes
   // are generated.

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to