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

Reply via email to