diff options
author | Benjamin Kramer <benny.kra@googlemail.com> | 2014-08-13 13:57:57 +0000 |
---|---|---|
committer | Benjamin Kramer <benny.kra@googlemail.com> | 2014-08-13 13:57:57 +0000 |
commit | 498cce575f348ae645561665fcfd0d5ef83280db (patch) | |
tree | 244186fc4bf3c21916f6112ab194aa89e2e87069 /clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp | |
parent | 0a5eb23bbdd65ede49ac6a3d0d101c963ed455d3 (diff) | |
download | llvm-498cce575f348ae645561665fcfd0d5ef83280db.zip llvm-498cce575f348ae645561665fcfd0d5ef83280db.tar.gz llvm-498cce575f348ae645561665fcfd0d5ef83280db.tar.bz2 |
[clang-tidy] Add a generic header guard checker + LLVM implementation.
The implementation is split into a generic part and a LLVM-specific part.
Other codebases can implement it with their own style. The specific features
supported are:
- Verification (and fixing) of header guards against a style based on the file path
- Automatic insertion of header guards for headers that are missing them
- A warning when the header guard doesn't enable our fancy header guard optimization
(e.g. when there's an include preceeding the guard)
- Automatic insertion of a comment with the guard name after #endif.
For the LLVM style we disable #endif comments for now, they're not very common
in the codebase. We also only flag headers in the include directories, there
doesn't seem to be a common style outside.
Differential Revision: http://reviews.llvm.org/D4867
llvm-svn: 215548
Diffstat (limited to 'clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp')
-rw-r--r-- | clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp | 41 |
1 files changed, 41 insertions, 0 deletions
diff --git a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp index 6bc52b2..b57630d 100644 --- a/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp +++ b/clang-tools-extra/unittests/clang-tidy/LLVMModuleTest.cpp @@ -1,4 +1,5 @@ #include "ClangTidyTest.h" +#include "llvm/HeaderGuardCheck.h" #include "llvm/IncludeOrderCheck.h" #include "llvm/NamespaceCommentCheck.h" #include "gtest/gtest.h" @@ -85,6 +86,46 @@ TEST(NamespaceCommentCheckTest, FixWrongComments) { "} // namespace asdf")); } +static std::string runHeaderGuardCheck(StringRef Code, const Twine &Filename) { + return test::runCheckOnCode<LLVMHeaderGuardCheck>( + Code, /*Errors=*/nullptr, Filename, std::string("-xc++-header")); +} + +TEST(LLVMHeaderGuardCheckTest, FixHeaderGuards) { + EXPECT_EQ("#ifndef LLVM_ADT_FOO_H\n#define LLVM_ADT_FOO_H\n#endif\n", + runHeaderGuardCheck("#ifndef FOO\n#define FOO\n#endif\n", + "include/llvm/ADT/foo.h")); + + // Allow trailing underscores. + EXPECT_EQ("#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", + runHeaderGuardCheck( + "#ifndef LLVM_ADT_FOO_H_\n#define LLVM_ADT_FOO_H_\n#endif\n", + "include/llvm/ADT/foo.h")); + + EXPECT_EQ("#ifndef LLVM_CLANG_C_BAR_H\n#define LLVM_CLANG_C_BAR_H\n\n\n#endif\n", + runHeaderGuardCheck("", "./include/clang-c/bar.h")); + + EXPECT_EQ("#ifndef LLVM_CLANG_LIB_CODEGEN_C_H\n#define " + "LLVM_CLANG_LIB_CODEGEN_C_H\n\n\n#endif\n", + runHeaderGuardCheck("", "tools/clang/lib/CodeGen/c.h")); + + EXPECT_EQ("#ifndef LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n#define " + "LLVM_CLANG_TOOLS_EXTRA_CLANG_TIDY_X_H\n\n\n#endif\n", + runHeaderGuardCheck("", "tools/clang/tools/extra/clang-tidy/x.h")); + + EXPECT_EQ( + "int foo;\n#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n#endif\n", + runHeaderGuardCheck("int foo;\n#ifndef LLVM_CLANG_BAR_H\n" + "#define LLVM_CLANG_BAR_H\n#endif\n", + "include/clang/bar.h")); + + EXPECT_EQ("#ifndef LLVM_CLANG_BAR_H\n#define LLVM_CLANG_BAR_H\n\n" + "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n\n#endif\n", + runHeaderGuardCheck( + "int foo;\n#ifndef FOOLOLO\n#define FOOLOLO\n#endif\n", + "include/clang/bar.h")); +} + } // namespace test } // namespace tidy } // namespace clang |