[clang-tools-extra] [clangd][test] Fix test failures when LLVM_WINDOWS_PREFER_FORWARD_SLA… (PR #193160)

Takuto Ikuta via cfe-commits cfe-commits at lists.llvm.org
Tue Apr 21 02:24:43 PDT 2026


https://github.com/atetubou updated https://github.com/llvm/llvm-project/pull/193160

>From c28aa1f038ab27434fd0264f76238bf6a9bb218f Mon Sep 17 00:00:00 2001
From: Takuto Ikuta <tikuta at google.com>
Date: Tue, 21 Apr 2026 16:36:49 +0900
Subject: [PATCH] [clangd][test] Fix test failures when
 LLVM_WINDOWS_PREFER_FORWARD_SLASH is ON

This commit addresses several test failures in Clangd that occur on Windows when
the CMake option -DLLVM_WINDOWS_PREFER_FORWARD_SLASH=ON is enabled.

Key changes:
- Updated testRoot() and TestScheme to dynamically return native path styles.
- Normalized expected paths in URI tests using a helper that calls llvm::sys::path::native.
---
 clang-tools-extra/clangd/tool/ClangdMain.cpp  | 21 ++++++++++-------
 clang-tools-extra/clangd/unittests/TestFS.cpp |  9 +++++++-
 .../clangd/unittests/URITests.cpp             | 23 +++++++++++++++----
 3 files changed, 39 insertions(+), 14 deletions(-)

diff --git a/clang-tools-extra/clangd/tool/ClangdMain.cpp b/clang-tools-extra/clangd/tool/ClangdMain.cpp
index e6d49008c22f9..50c58a9a8ca47 100644
--- a/clang-tools-extra/clangd/tool/ClangdMain.cpp
+++ b/clang-tools-extra/clangd/tool/ClangdMain.cpp
@@ -597,30 +597,35 @@ class TestScheme : public URIScheme {
     Body = Body.ltrim('/');
     llvm::SmallString<16> Path(Body);
     path::native(Path);
-    path::make_absolute(TestScheme::TestDir, Path);
+    path::make_absolute(getTestDir(), Path);
     return std::string(Path);
   }
 
   llvm::Expected<URI>
   uriFromAbsolutePath(llvm::StringRef AbsolutePath) const override {
     llvm::StringRef Body = AbsolutePath;
-    if (!Body.consume_front(TestScheme::TestDir))
+    if (!Body.consume_front(getTestDir()))
       return error("Path {0} doesn't start with root {1}", AbsolutePath,
-                   TestDir);
+                   getTestDir());
 
     return URI("test", /*Authority=*/"",
                llvm::sys::path::convert_to_slash(Body));
   }
 
 private:
-  const static char TestDir[];
-};
-
+  static llvm::StringRef getTestDir() {
 #ifdef _WIN32
-const char TestScheme::TestDir[] = "C:\\clangd-test";
+    static const std::string TestDir = []() {
+      llvm::SmallString<32> Path("C:/clangd-test");
+      llvm::sys::path::native(Path);
+      return std::string(Path.str());
+    }();
+    return TestDir;
 #else
-const char TestScheme::TestDir[] = "/clangd-test";
+    return "/clangd-test";
 #endif
+  }
+};
 
 std::unique_ptr<SymbolIndex>
 loadExternalIndex(const Config::ExternalIndexSpec &External,
diff --git a/clang-tools-extra/clangd/unittests/TestFS.cpp b/clang-tools-extra/clangd/unittests/TestFS.cpp
index bb309609eda20..657d73971d6e6 100644
--- a/clang-tools-extra/clangd/unittests/TestFS.cpp
+++ b/clang-tools-extra/clangd/unittests/TestFS.cpp
@@ -84,7 +84,14 @@ MockCompilationDatabase::getCompileCommand(PathRef File) const {
 
 const char *testRoot() {
 #ifdef _WIN32
-  return "C:\\clangd-test";
+  // We use a static SmallString to hold the native path, as testRoot() returns
+  // a const char *.
+  static llvm::SmallString<32> Root = []() {
+    llvm::SmallString<32> Path("C:/clangd-test");
+    llvm::sys::path::native(Path);
+    return Path;
+  }();
+  return Root.c_str();
 #else
   return "/clangd-test";
 #endif
diff --git a/clang-tools-extra/clangd/unittests/URITests.cpp b/clang-tools-extra/clangd/unittests/URITests.cpp
index c0ccfc539c452..038b939b532ba 100644
--- a/clang-tools-extra/clangd/unittests/URITests.cpp
+++ b/clang-tools-extra/clangd/unittests/URITests.cpp
@@ -133,8 +133,15 @@ TEST(URITest, ParseFailed) {
 
 TEST(URITest, Resolve) {
 #ifdef _WIN32
-  EXPECT_THAT(resolveOrDie(parseOrDie("file:///c%3a/x/y/z")), "c:\\x\\y\\z");
-  EXPECT_THAT(resolveOrDie(parseOrDie("file:///c:/x/y/z")), "c:\\x\\y\\z");
+  // Expected path style depends on LLVM_WINDOWS_PREFER_FORWARD_SLASH.
+  auto Native = [](llvm::StringRef Path) {
+    llvm::SmallString<32> NativePath(Path);
+    llvm::sys::path::native(NativePath);
+    return std::string(NativePath.str());
+  };
+  EXPECT_THAT(resolveOrDie(parseOrDie("file:///c%3a/x/y/z")),
+              Native("c:/x/y/z"));
+  EXPECT_THAT(resolveOrDie(parseOrDie("file:///c:/x/y/z")), Native("c:/x/y/z"));
 #else
   EXPECT_EQ(resolveOrDie(parseOrDie("file:/a/b/c")), "/a/b/c");
   EXPECT_EQ(resolveOrDie(parseOrDie("file://auth/a/b/c")), "//auth/a/b/c");
@@ -148,13 +155,19 @@ TEST(URITest, Resolve) {
 
 TEST(URITest, ResolveUNC) {
 #ifdef _WIN32
+  // Expected path style depends on LLVM_WINDOWS_PREFER_FORWARD_SLASH.
+  auto Native = [](llvm::StringRef Path) {
+    llvm::SmallString<32> NativePath(Path);
+    llvm::sys::path::native(NativePath);
+    return std::string(NativePath.str());
+  };
   EXPECT_THAT(resolveOrDie(parseOrDie("file://example.com/x/y/z")),
-              "\\\\example.com\\x\\y\\z");
+              Native("//example.com/x/y/z"));
   EXPECT_THAT(resolveOrDie(parseOrDie("file://127.0.0.1/x/y/z")),
-              "\\\\127.0.0.1\\x\\y\\z");
+              Native("//127.0.0.1/x/y/z"));
   // Ensure non-traditional file URI still resolves to correct UNC path.
   EXPECT_THAT(resolveOrDie(parseOrDie("file:////127.0.0.1/x/y/z")),
-              "\\\\127.0.0.1\\x\\y\\z");
+              Native("//127.0.0.1/x/y/z"));
 #else
   EXPECT_THAT(resolveOrDie(parseOrDie("file://example.com/x/y/z")),
               "//example.com/x/y/z");



More information about the cfe-commits mailing list