salman-javed-nz created this revision. salman-javed-nz added reviewers: bkramer, hokein, aaron.ballman. salman-javed-nz added a project: clang-tools-extra. Herald added subscribers: carlosgalvezp, xazax.hun. salman-javed-nz requested review of this revision.
Fixes https://bugs.llvm.org/show_bug.cgi?id=40372. The llvm-header-guard check does not take into account that the path separator on Windows is `\`, not `/`. This means that instead of suggesting a header guard in the form of: LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_FOO_H it incorrectly suggests: C:\LLVM_PROJECT\CLANG_TOOLS_EXTRA\CLANG_TIDY\FOO_H Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D113450 Files: clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp Index: clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp =================================================================== --- clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp +++ 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<StringRef> ExpectedWarning) { std::vector<ClangTidyError> 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 Index: clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp +++ 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.
Index: clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp =================================================================== --- clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp +++ 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<StringRef> ExpectedWarning) { std::vector<ClangTidyError> 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 Index: clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp =================================================================== --- clang-tools-extra/clang-tidy/llvm/HeaderGuardCheck.cpp +++ 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.
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits