Author: void_17 Date: 2026-08-12T21:13:36+03:00 New Revision: 29316bece363e3bd09140968d62d29958cd4990d
URL: https://github.com/llvm/llvm-project/commit/29316bece363e3bd09140968d62d29958cd4990d DIFF: https://github.com/llvm/llvm-project/commit/29316bece363e3bd09140968d62d29958cd4990d.diff LOG: [clang-tidy] Fix `cppcoreguidelines-use-enum-class` anonymous enum bug (#215352) `UseEnumClassCheck::registerMatchers` implementing `cppcoreguidelines-use-enum-class` didn't check for empty enum names and suggested erroneous "fix" to make anonymous enums `class enum`, which is ill-defined, fix this. Fixes #215328 Added: Modified: clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp clang-tools-extra/docs/ReleaseNotes.md clang-tools-extra/docs/clang-tidy/checks/cppcoreguidelines/use-enum-class.rst clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class.cpp Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp b/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp index 84720d10c233e..0865148a2fad4 100644 --- a/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp +++ b/clang-tools-extra/clang-tidy/cppcoreguidelines/UseEnumClassCheck.cpp @@ -10,8 +10,15 @@ #include "clang/ASTMatchers/ASTMatchFinder.h" using namespace clang::ast_matchers; +using namespace clang::ast_matchers::internal; namespace clang::tidy::cppcoreguidelines { +namespace { +// FIXME: The matcher 'hasName(Name)' asserts that its argument 'Name' is +// nonempty. Perhaps remove that assertion and replace 'isUnnamed()' with +// 'hasName("")'. +AST_MATCHER(EnumDecl, isUnnamed) { return Node.getName().empty(); } +} // namespace UseEnumClassCheck::UseEnumClassCheck(StringRef Name, ClangTidyContext *Context) : ClangTidyCheck(Name, Context), @@ -26,10 +33,10 @@ void UseEnumClassCheck::storeOptions(ClangTidyOptions::OptionMap &Opts) { } void UseEnumClassCheck::registerMatchers(MatchFinder *Finder) { - const auto EnumDecl = - IgnoreUnscopedEnumsInClasses - ? enumDecl(unless(isScoped()), unless(hasParent(recordDecl()))) - : enumDecl(unless(isScoped())); + const auto EnumDecl = IgnoreUnscopedEnumsInClasses + ? enumDecl(unless(isScoped()), unless(isUnnamed()), + unless(hasParent(recordDecl()))) + : enumDecl(unless(isScoped()), unless(isUnnamed())); Finder->addMatcher(EnumDecl.bind("unscoped_enum"), this); } diff --git a/clang-tools-extra/docs/ReleaseNotes.md b/clang-tools-extra/docs/ReleaseNotes.md index f72beb0810b19..ef3e6c49ce172 100644 --- a/clang-tools-extra/docs/ReleaseNotes.md +++ b/clang-tools-extra/docs/ReleaseNotes.md @@ -121,6 +121,9 @@ infrastructure are described first, followed by tool-specific sections. - Improved {doc}`cppcoreguidelines-pro-type-member-init <clang-tidy/checks/cppcoreguidelines/pro-type-member-init>` check by treating `std::array` the same as built-in arrays when `IgnoreArrays` option is enabled. + +- Improved {doc}`cppcoreguidelines-use-enum-class + <clang-tidy/checks/cppcoreguidelines/use-enum-class>` check by omitting unnamed enums from the `enum class` requirement, as previously the check suggested users an ill-formed fix. - Improved {doc}`misc-const-correctness <clang-tidy/checks/misc/const-correctness>` check by fixing false positives 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 746d24aa8ea34..dd0f3fc25fa8b 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 @@ -4,7 +4,8 @@ cppcoreguidelines-use-enum-class ================================ Finds unscoped (non-class) ``enum`` declarations and suggests using -``enum class`` instead. +``enum class`` instead. Unnamed enum are ignored and will be handled by check implementing `Enum.6 +<https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#enum6-avoid-unnamed-enumerations>`_. This check implements `Enum.3 <https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#renum-class>`_ diff --git a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class.cpp b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class.cpp index f53d787f80efa..033865a7ac830 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/cppcoreguidelines/use-enum-class.cpp @@ -60,3 +60,5 @@ enum ForwardE : int; enum class ForwardEC : int; enum struct ForwardES : int; + +enum { A }; _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
