[clang-tools-extra] [clang-tidy] Support comments in WarningsAsErrors (PR #171816)
via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 11 21:24:08 PST 2025
https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/171816
>From 8e3055437d6e29c0dce4ab49e02c083053ae3360 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Thu, 11 Dec 2025 20:08:59 +0800
Subject: [PATCH 1/3] [clang-tidy] Support comments in WarningsAsErrors
---
.../clang-tidy/ClangTidyOptions.cpp | 26 +++++++++-------
.../clang-tidy/ClangTidyOptionsTest.cpp | 31 +++++++++++++++++++
2 files changed, 45 insertions(+), 12 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
index 550f7809d75f9..46a30d25ec441 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
@@ -178,12 +178,13 @@ template <> struct MappingTraits<ClangTidyOptions::CustomCheckValue> {
}
};
-struct ChecksVariant {
+struct GlobListVariant {
std::optional<std::string> AsString;
std::optional<std::vector<std::string>> AsVector;
};
-template <> void yamlize(IO &IO, ChecksVariant &Val, bool, EmptyContext &Ctx) {
+template <>
+void yamlize(IO &IO, GlobListVariant &Val, bool, EmptyContext &Ctx) {
if (!IO.outputting()) {
// Special case for reading from YAML
// Must support reading from both a string or a list
@@ -200,25 +201,26 @@ template <> void yamlize(IO &IO, ChecksVariant &Val, bool, EmptyContext &Ctx) {
}
}
-static void mapChecks(IO &IO, std::optional<std::string> &Checks) {
+static void mapGlobList(IO &IO, std::optional<std::string> &GlobList,
+ const char *Key) {
if (IO.outputting()) {
// Output always a string
- IO.mapOptional("Checks", Checks);
+ IO.mapOptional(Key, GlobList);
} else {
// Input as either a string or a list
- ChecksVariant ChecksAsVariant;
- IO.mapOptional("Checks", ChecksAsVariant);
- if (ChecksAsVariant.AsString)
- Checks = ChecksAsVariant.AsString;
- else if (ChecksAsVariant.AsVector)
- Checks = llvm::join(*ChecksAsVariant.AsVector, ",");
+ GlobListVariant GlobListAsVariant;
+ IO.mapOptional(Key, GlobListAsVariant);
+ if (GlobListAsVariant.AsString)
+ GlobList = GlobListAsVariant.AsString;
+ else if (GlobListAsVariant.AsVector)
+ GlobList = llvm::join(*GlobListAsVariant.AsVector, ",");
}
}
template <> struct MappingTraits<ClangTidyOptions> {
static void mapping(IO &IO, ClangTidyOptions &Options) {
- mapChecks(IO, Options.Checks);
- IO.mapOptional("WarningsAsErrors", Options.WarningsAsErrors);
+ mapGlobList(IO, Options.Checks, "Checks");
+ mapGlobList(IO, Options.WarningsAsErrors, "WarningsAsErrors");
IO.mapOptional("HeaderFileExtensions", Options.HeaderFileExtensions);
IO.mapOptional("ImplementationFileExtensions",
Options.ImplementationFileExtensions);
diff --git a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
index 410cebf90913d..aee3313f2263b 100644
--- a/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
+++ b/clang-tools-extra/unittests/clang-tidy/ClangTidyOptionsTest.cpp
@@ -107,6 +107,37 @@ TEST(ParseConfiguration, ChecksSeparatedByNewlines) {
EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n", *Options->Checks);
}
+TEST(ParseConfiguration, WarningsAsErrorsSeparatedByNewlines) {
+ const auto MemoryBuffer = llvm::MemoryBufferRef("WarningsAsErrors: |\n"
+ " -*,misc-*\n"
+ " llvm-*\n"
+ " -clang-*,\n"
+ " google-*",
+ "Options");
+
+ const auto Options = parseConfiguration(MemoryBuffer);
+
+ EXPECT_TRUE(!!Options);
+ EXPECT_EQ("-*,misc-*\nllvm-*\n-clang-*,\ngoogle-*\n",
+ *Options->WarningsAsErrors);
+}
+
+TEST(ParseConfiguration, WarningsAsErrorsAsList) {
+ const auto MemoryBuffer = llvm::MemoryBufferRef("WarningsAsErrors: [\n"
+ " '-*',\n"
+ " 'misc-*',\n"
+ " 'llvm-*',\n"
+ " '-clang-*',\n"
+ " 'google-*'\n"
+ "]",
+ "Options");
+
+ const auto Options = parseConfiguration(MemoryBuffer);
+
+ EXPECT_TRUE(!!Options);
+ EXPECT_EQ("-*,misc-*,llvm-*,-clang-*,google-*", *Options->WarningsAsErrors);
+}
+
TEST(ParseConfiguration, MergeConfigurations) {
llvm::ErrorOr<ClangTidyOptions> Options1 =
parseConfiguration(llvm::MemoryBufferRef(R"(
>From 052c1fc0b5050764b0c51ad4146c9373da79addd Mon Sep 17 00:00:00 2001
From: mitchell <mitchell.xu2 at gmail.com>
Date: Thu, 11 Dec 2025 21:45:30 +0800
Subject: [PATCH 2/3] Update clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
Co-authored-by: Victor Chernyakin <chernyakin.victor.j at outlook.com>
---
clang-tools-extra/clang-tidy/ClangTidyOptions.cpp | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
index 46a30d25ec441..f61540069d071 100644
--- a/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
+++ b/clang-tools-extra/clang-tidy/ClangTidyOptions.cpp
@@ -202,7 +202,7 @@ void yamlize(IO &IO, GlobListVariant &Val, bool, EmptyContext &Ctx) {
}
static void mapGlobList(IO &IO, std::optional<std::string> &GlobList,
- const char *Key) {
+ StringRef Key) {
if (IO.outputting()) {
// Output always a string
IO.mapOptional(Key, GlobList);
>From b75a89d8a6cdc7692c70bcb381b8f62f2f9c285e Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Fri, 12 Dec 2025 13:20:51 +0800
Subject: [PATCH 3/3] Update docs
---
clang-tools-extra/docs/ReleaseNotes.rst | 3 +++
1 file changed, 3 insertions(+)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index d1fb1cba3e45a..9c39647737977 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -196,6 +196,9 @@ Improvements to clang-tidy
moved to the ``fuchsia`` module instead. The ``zircon`` module will be removed
in the 24th release.
+- Improved :program:`clang-tidy` configuration parsing by allowing the same list
+ syntax in `WarningsAsErrors` as in `Checks`.
+
New checks
^^^^^^^^^^
More information about the cfe-commits
mailing list