[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