diff --git a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp --- a/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp +++ b/clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp @@ -8,6 +8,7 @@ #include "HeaderGuardCheck.h" #include "clang/Tooling/Tooling.h" +#include "llvm/Support/Path.h" namespace clang { namespace tidy { @@ -21,6 +22,10 @@ StringRef OldGuard) { std::string Guard = tooling::getAbsolutePath(Filename); + // When running under Windows, need to convert the path separators from + // `\` to `/`. + Guard = llvm::sys::path::convert_to_slash(Guard); + // Sanitize the path. There are some rules for compatibility with the historic // style in include/llvm and include/clang which we want to preserve. diff --git a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp --- a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp @@ -9,8 +9,6 @@ namespace tidy { namespace test { -// FIXME: It seems this might be incompatible to dos path. Investigating. -#if !defined(_WIN32) static std::string runHeaderGuardCheck(StringRef Code, const Twine &Filename, Optional ExpectedWarning) { std::vector Errors; @@ -220,8 +218,38 @@ runHeaderGuardCheck( "", "/llvm-project/clang-tools-extra/clangd/foo.h", StringRef("header is missing header guard"))); -} + +#ifdef WIN32 + // Check interaction with Windows-style path separators (\). + EXPECT_EQ( + "#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_FOO_H\n" + "#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FOO_H\n" + "\n" + "\n" + "#endif\n", + runHeaderGuardCheck("", "llvm-project\\clang-tools-extra\\clangd\\foo.h", + StringRef("header is missing header guard"))); + + EXPECT_EQ("#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_FOO_H\n" + "#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FOO_H\n" + "\n" + "\n" + "#endif\n", + runHeaderGuardCheck( + "", "C:\\llvm-project\\clang-tools-extra\\clangd\\foo.h", + StringRef("header is missing header guard"))); + + EXPECT_EQ( + "#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANGD_FOO_H\n" + "#define LLVM_CLANG_TOOLS_EXTRA_CLANGD_FOO_H\n" + "\n" + "\n" + "#endif\n", + runHeaderGuardCheck( + "", "\\\\SambaShare\\llvm-project\\clang-tools-extra\\clangd\\foo.h", + StringRef("header is missing header guard"))); #endif +} } // namespace test } // namespace tidy