https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/171816
>From 8e3055437d6e29c0dce4ab49e02c083053ae3360 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> 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 <[email protected]> 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 <[email protected]> --- 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 <[email protected]> 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 ^^^^^^^^^^ _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
