Skip to content

Commit

Permalink
[clang-tidy] Support SystemHeaders in .clang-tidy
Browse files Browse the repository at this point in the history
A previous patch update the clang-tidy documentation
incorrectly claiming that SystemHeaders can be provided
in the .clang-tidy configuration file.

This patch adds support for it, together with tests.

Differential Revision: https://reviews.llvm.org/D149899
  • Loading branch information
carlosgalvezp committed May 7, 2023
1 parent bd89b1f commit 26f4762
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 4 deletions.
1 change: 1 addition & 0 deletions clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,7 @@ template <> struct MappingTraits<ClangTidyOptions> {
IO.mapOptional("ExtraArgsBefore", Options.ExtraArgsBefore);
IO.mapOptional("InheritParentConfig", Options.InheritParentConfig);
IO.mapOptional("UseColor", Options.UseColor);
IO.mapOptional("SystemHeaders", Options.SystemHeaders);
}
};

Expand Down
11 changes: 7 additions & 4 deletions clang-tools-extra/clang-tidy/tool/ClangTidyMain.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -134,10 +134,13 @@ option in .clang-tidy file, if any.
cl::init(""),
cl::cat(ClangTidyCategory));

static cl::opt<bool>
SystemHeaders("system-headers",
desc("Display the errors from system headers."),
cl::init(false), cl::cat(ClangTidyCategory));
static cl::opt<bool> SystemHeaders("system-headers", desc(R"(
Display the errors from system headers.
This option overrides the 'SystemHeaders' option
in .clang-tidy file, if any.
)"),
cl::init(false), cl::cat(ClangTidyCategory));

static cl::opt<std::string> LineFilter("line-filter", desc(R"(
List of files with line ranges to filter the
warnings. Can be used together with
Expand Down
3 changes: 3 additions & 0 deletions clang-tools-extra/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,9 @@ Improvements to clang-tidy

- Fix a potential crash when using the `--dump-config` option.

- Support specifying `SystemHeaders` in the `.clang-tidy` configuration file,
with the same functionality as the command-line option `--system-headers`.

New checks
^^^^^^^^^^

Expand Down
2 changes: 2 additions & 0 deletions clang-tools-extra/docs/clang-tidy/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -211,6 +211,8 @@ An overview of all the command-line options:
format to stderr. When this option is passed,
these per-TU profiles are instead stored as JSON.
--system-headers - Display the errors from system headers.
This option overrides the 'SystemHeaders' option
in .clang-tidy file, if any.
--use-color - Use colors in diagnostics. If not set, colors
will be used if the terminal connected to
standard output supports colors.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
class Foo { Foo(int); };
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// RUN: clang-tidy -dump-config -system-headers=true | FileCheck -check-prefix=CHECK-CONFIG-SYSTEM-HEADERS %s
// RUN: clang-tidy -dump-config -system-headers=false | FileCheck -check-prefix=CHECK-CONFIG-NO-SYSTEM-HEADERS %s
// RUN: clang-tidy -config='SystemHeaders: true' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-SYSTEM-HEADERS %s
// RUN: clang-tidy -config='SystemHeaders: false' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-NO-SYSTEM-HEADERS %s

// RUN: clang-tidy -system-headers=true -config='SystemHeaders: true' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-SYSTEM-HEADERS %s
// RUN: clang-tidy -system-headers=true -config='SystemHeaders: false' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-SYSTEM-HEADERS %s
// RUN: clang-tidy -system-headers=false -config='SystemHeaders: true' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-NO-SYSTEM-HEADERS %s
// RUN: clang-tidy -system-headers=false -config='SystemHeaders: false' -dump-config | FileCheck -check-prefix=CHECK-CONFIG-NO-SYSTEM-HEADERS %s

// RUN: clang-tidy -help | FileCheck -check-prefix=CHECK-OPT-PRESENT %s

// RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='.*' -system-headers=true %s -- -isystem %S/Inputs/system-headers 2>&1 | FileCheck -check-prefix=CHECK-SYSTEM-HEADERS %s
// RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='.*' -system-headers=false %s -- -isystem %S/Inputs/system-headers 2>&1 | FileCheck -check-prefix=CHECK-NO-SYSTEM-HEADERS %s
// RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='.*' -config='SystemHeaders: true' %s -- -isystem %S/Inputs/system-headers 2>&1 | FileCheck -check-prefix=CHECK-SYSTEM-HEADERS %s
// RUN: clang-tidy -checks='-*,google-explicit-constructor' -header-filter='.*' -config='SystemHeaders: false' %s -- -isystem %S/Inputs/system-headers 2>&1 | FileCheck -check-prefix=CHECK-NO-SYSTEM-HEADERS %s

#include <system_header.h>
// CHECK-SYSTEM-HEADERS: system_header.h:1:13: warning: single-argument constructors must be marked explicit
// CHECK-NO-SYSTEM-HEADERS-NOT: system_header.h:1:13: warning: single-argument constructors must be marked explicit

// CHECK-CONFIG-NO-SYSTEM-HEADERS: SystemHeaders: false
// CHECK-CONFIG-SYSTEM-HEADERS: SystemHeaders: true
// CHECK-OPT-PRESENT: --system-headers
16 changes: 16 additions & 0 deletions clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ TEST(ParseConfiguration, MergeConfigurations) {
ExtraArgs: ['arg1', 'arg2']
ExtraArgsBefore: ['arg-before1', 'arg-before2']
UseColor: false
SystemHeaders: false
)",
"Options1"));
ASSERT_TRUE(!!Options1);
Expand All @@ -134,6 +135,7 @@ TEST(ParseConfiguration, MergeConfigurations) {
ExtraArgs: ['arg3', 'arg4']
ExtraArgsBefore: ['arg-before3', 'arg-before4']
UseColor: true
SystemHeaders: true
)",
"Options2"));
ASSERT_TRUE(!!Options2);
Expand All @@ -154,6 +156,9 @@ TEST(ParseConfiguration, MergeConfigurations) {
Options.ExtraArgsBefore->end(), ","));
ASSERT_TRUE(Options.UseColor.has_value());
EXPECT_TRUE(*Options.UseColor);

ASSERT_TRUE(Options.SystemHeaders.has_value());
EXPECT_TRUE(*Options.SystemHeaders);
}

namespace {
Expand Down Expand Up @@ -249,6 +254,17 @@ TEST(ParseConfiguration, CollectDiags) {
DiagKind(llvm::SourceMgr::DK_Error),
DiagPos(Options.range().Begin),
DiagRange(Options.range()))));

Options = llvm::Annotations(R"(
SystemHeaders: [[NotABool]]
)");
ParsedOpt = ParseWithDiags(Options.code());
EXPECT_TRUE(!ParsedOpt);
EXPECT_THAT(Collector.getDiags(),
testing::ElementsAre(AllOf(DiagMessage("invalid boolean"),
DiagKind(llvm::SourceMgr::DK_Error),
DiagPos(Options.range().Begin),
DiagRange(Options.range()))));
}

namespace {
Expand Down

0 comments on commit 26f4762

Please sign in to comment.