[clang-tools-extra] 5c715d5 - [Tooling] Preserve backslashes in POSIX source paths (#207499)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Jul 6 19:45:59 PDT 2026
Author: Zeyi Xu
Date: 2026-07-07T10:45:54+08:00
New Revision: 5c715d56884364a3b05acb4d3e6b52a911f14667
URL: https://github.com/llvm/llvm-project/commit/5c715d56884364a3b05acb4d3e6b52a911f14667
DIFF: https://github.com/llvm/llvm-project/commit/5c715d56884364a3b05acb4d3e6b52a911f14667.diff
LOG: [Tooling] Preserve backslashes in POSIX source paths (#207499)
On POSIX, backslashes are valid filename characters. Avoid converting
them to slashes when computing absolute source paths in LibTooling,
since doing so changes paths such as `a\b.cc` into `a/b.cc`.
Closes #207396
Added:
Modified:
clang-tools-extra/docs/ReleaseNotes.rst
clang/lib/Tooling/Tooling.cpp
clang/unittests/Tooling/ToolingTest.cpp
Removed:
################################################################################
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 68f0fa568dbf9..b85ece288881e 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -202,6 +202,9 @@ Improvements to clang-tidy
- Improved :program:`clang-tidy` ``-store-check-profile`` by generating valid
JSON when the source file path contains characters that require JSON escaping.
+- Improved :program:`clang-tidy` by preserving literal backslash characters in
+ POSIX source paths.
+
- Ensured that :program:`clang-tidy` and the clang compiler uses the same logic
for the suppression of compiler diagnostics in system headers and expansions
of macros defined in system headers. Previously the default setting of tidy
diff --git a/clang/lib/Tooling/Tooling.cpp b/clang/lib/Tooling/Tooling.cpp
index 5da9c31ec47ec..71307d1fe7307 100644
--- a/clang/lib/Tooling/Tooling.cpp
+++ b/clang/lib/Tooling/Tooling.cpp
@@ -260,7 +260,7 @@ llvm::Expected<std::string> getAbsolutePath(llvm::vfs::FileSystem &FS,
SmallString<1024> AbsolutePath = RelativePath;
if (auto EC = FS.makeAbsolute(AbsolutePath))
return llvm::errorCodeToError(EC);
- llvm::sys::path::native(AbsolutePath);
+ llvm::sys::path::make_preferred(AbsolutePath);
return std::string(AbsolutePath);
}
diff --git a/clang/unittests/Tooling/ToolingTest.cpp b/clang/unittests/Tooling/ToolingTest.cpp
index 0f6cfbd2266bb..9b638c2d6c4ee 100644
--- a/clang/unittests/Tooling/ToolingTest.cpp
+++ b/clang/unittests/Tooling/ToolingTest.cpp
@@ -688,6 +688,30 @@ TEST(runToolOnCodeWithArgs, DiagnosticsColor) {
{"-fcolor-diagnostics"}));
}
+TEST(getAbsolutePath, BackslashPath) {
+ auto FS = llvm::vfs::getRealFileSystem();
+ llvm::Expected<std::string> Path = getAbsolutePath(*FS, "a\\b.cc");
+ if (!Path)
+ FAIL() << llvm::toString(Path.takeError());
+
+ llvm::ErrorOr<std::string> CWD = FS->getCurrentWorkingDirectory();
+ ASSERT_TRUE(CWD) << CWD.getError().message();
+
+#if defined(_WIN32)
+ SmallString<128> Expected(*CWD);
+ llvm::sys::path::append(Expected, "a", "b.cc");
+ llvm::sys::path::make_preferred(Expected);
+ EXPECT_EQ(std::string(Expected), *Path);
+#else
+ SmallString<128> Expected(*CWD);
+ llvm::sys::path::append(Expected, "a\\b.cc");
+ SmallString<128> WithSlash(*CWD);
+ llvm::sys::path::append(WithSlash, "a/b.cc");
+ EXPECT_EQ(std::string(Expected), *Path);
+ EXPECT_NE(std::string(WithSlash), *Path);
+#endif
+}
+
TEST(ClangToolTest, ArgumentAdjusters) {
FixedCompilationDatabase Compilations("/", std::vector<std::string>());
More information about the cfe-commits
mailing list