https://github.com/berkaysahiin created https://github.com/llvm/llvm-project/pull/197470
Adds an option to ignore macros for: https://clang.llvm.org/extra/clang-tidy/checks/cppcoreguidelines/use-enum-class.html >From 670ff2f30dd5d26683670a4016737c7c9585bf65 Mon Sep 17 00:00:00 2001 From: Berkay Sahin <[email protected]> Date: Wed, 13 May 2026 18:11:26 +0300 Subject: [PATCH] [clang-tidy] Add IgnoreMacros option to UseEnumClassCheck --- .../cppcoreguidelines/UseEnumClassCheck.cpp | 11 ++++++++--- .../cppcoreguidelines/UseEnumClassCheck.h | 1 + .../checks/cppcoreguidelines/use-enum-class.rst | 5 +++++ .../cppcoreguidelines/use-enum-class-macros.cpp | 13 +++++++++++++ 4 files changed, 27 insertions(+), 3 deletions(-) create mode 100644 clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class-macros.cpp diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp index 9e809e0bedb49..348abafdda1b0 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp @@ -16,11 +16,13 @@ namespace clang::tidy::cppcoreguidelines { UseEnumClassCheck::UseEnumClassCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), IgnoreUnscopedEnumsInClasses( - Options.get("IgnoreUnscopedEnumsInClasses", false)) {} + Options.get("IgnoreUnscopedEnumsInClasses", false)), + IgnoreMacros(Options.get("IgnoreMacros", false)) {} void UseEnumClassCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { Options.store(Opts, "IgnoreUnscopedEnumsInClasses", IgnoreUnscopedEnumsInClasses); + Options.store(Opts, "IgnoreMacros", IgnoreMacros); } void UseEnumClassCheck::registerMatchers(MatchFinder *Finder) { @@ -33,9 +35,12 @@ void UseEnumClassCheck::registerMatchers(MatchFinder *Finder) { void UseEnumClassCheck::check(const MatchFinder::MatchResult &Result) { const auto *UnscopedEnum = Result.Nodes.getNodeAs<EnumDecl>("unscoped_enum"); + const auto SourceLoc = UnscopedEnum->getLocation(); - diag(UnscopedEnum->getLocation(), - "enum %0 is unscoped, use 'enum class' instead") + if (IgnoreMacros && SourceLoc.isMacroID()) + return; + + diag(SourceLoc, "enum %0 is unscoped, use 'enum class' instead") << UnscopedEnum; } diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.h b/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.h index c269affc563b3..85093f7b898e0 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.h +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.h @@ -33,6 +33,7 @@ class UseEnumClassCheck : public ClangTidyCheck { private: const bool IgnoreUnscopedEnumsInClasses; + const bool IgnoreMacros; }; } // namespace clang::tidy::cppcoreguidelines diff --git a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/use-enum-class.rst b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/use-enum-class.rst index 9358996a36eba..746d24aa8ea34 100644 --- a/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/use-enum-class.rst +++ b/clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/use-enum-class.rst @@ -33,3 +33,8 @@ Options When `true`, ignores unscoped ``enum`` declarations in classes. Default is `false`. + +.. option:: IgnoreMacros + + When `true`, ignores unscoped ``enum`` declarations within macros. + Default is `false`. diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class-macros.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class-macros.cpp new file mode 100644 index 0000000000000..1dec0c2bd7de2 --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class-macros.cpp @@ -0,0 +1,13 @@ +// RUN: %check_clang_tidy -std=c++11-or-later %s cppcoreguidelines-use-enum-class %t -- \ +// RUN: -config="{CheckOptions: {cppcoreguidelines-use-enum-class.IgnoreMacros: false}}" -- +// RUN: %check_clang_tidy -std=c++11-or-later %s -check-suffixes=IGNORE-MACROS cppcoreguidelines-use-enum-class %t -- \ +// RUN: -config="{CheckOptions: {cppcoreguidelines-use-enum-class.IgnoreMacros: true}}" -- + +enum UnscopedRegular { A, B, C }; +// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: enum 'UnscopedRegular' is unscoped, use 'enum class' instead +// CHECK-MESSAGES-IGNORE-MACROS: :[[@LINE-2]]:6: warning: enum 'UnscopedRegular' is unscoped, use 'enum class' instead + +#define NAMED_ENUM enum E { G, H, I }; + +NAMED_ENUM +// CHECK-MESSAGES: :[[@LINE-1]]:1: warning: enum 'E' is unscoped, use 'enum class' instead _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
