Author: Dominik Kaszewski
Date: 2025-12-22T01:05:20+03:00
New Revision: 2ffaf9d676e6ed2cffc5312d3306f8345bc5a4e5

URL: 
https://github.com/llvm/llvm-project/commit/2ffaf9d676e6ed2cffc5312d3306f8345bc5a4e5
DIFF: 
https://github.com/llvm/llvm-project/commit/2ffaf9d676e6ed2cffc5312d3306f8345bc5a4e5.diff

LOG: readability-identifier-naming should add universal default options 
(#171686)

Adds a `DefaultCase` (and other options, but `DefaultPrefix/Suffix` is
probably not useful), which is used as a base in the override hierarchy.

Resolves #75688

Added: 
    
clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp
    
clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp
    
clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp

Modified: 
    clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
    clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
    clang-tools-extra/docs/ReleaseNotes.rst
    clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst

Removed: 
    


################################################################################
diff  --git 
a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index ae251a8bec0f4..9cee6ddb93d4d 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -70,6 +70,7 @@ namespace readability {
 
 // clang-format off
 #define NAMING_KEYS(m) \
+    m(Default) \
     m(Namespace) \
     m(InlineNamespace) \
     m(EnumConstant) \
@@ -1155,7 +1156,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
     if (NamingStyles[SK_Constant])
       return SK_Constant;
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (const auto *Decl = dyn_cast<RecordDecl>(D)) {
@@ -1187,7 +1188,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
         return SK_Enum;
     }
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (const auto *Decl = dyn_cast<FieldDecl>(D)) {
@@ -1230,7 +1231,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
     if (NamingStyles[SK_Parameter])
       return SK_Parameter;
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (const auto *Decl = dyn_cast<VarDecl>(D))
@@ -1275,7 +1276,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
     if (NamingStyles[SK_Function])
       return SK_Function;
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (const auto *Decl = dyn_cast<FunctionDecl>(D)) {
@@ -1299,7 +1300,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
     if (NamingStyles[SK_TemplateParameter])
       return SK_TemplateParameter;
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (isa<NonTypeTemplateParmDecl>(D)) {
@@ -1309,7 +1310,7 @@ StyleKind IdentifierNamingCheck::findStyleKind(
     if (NamingStyles[SK_TemplateParameter])
       return SK_TemplateParameter;
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (isa<TemplateTemplateParmDecl>(D)) {
@@ -1319,13 +1320,13 @@ StyleKind IdentifierNamingCheck::findStyleKind(
     if (NamingStyles[SK_TemplateParameter])
       return SK_TemplateParameter;
 
-    return SK_Invalid;
+    return undefinedStyle(NamingStyles);
   }
 
   if (isa<ConceptDecl>(D) && NamingStyles[SK_Concept])
     return SK_Concept;
 
-  return SK_Invalid;
+  return undefinedStyle(NamingStyles);
 }
 
 std::optional<RenamerClangTidyCheck::FailureInfo>
@@ -1346,8 +1347,10 @@ IdentifierNamingCheck::getFailureInfo(
     return std::nullopt;
 
   std::string KindName =
-      fixupWithCase(Type, StyleNames[SK], ND, Style, HNOption,
-                    IdentifierNamingCheck::CT_LowerCase);
+      SK == SK_Default
+          ? "identifier"
+          : fixupWithCase(Type, StyleNames[SK], ND, Style, HNOption,
+                          IdentifierNamingCheck::CT_LowerCase);
   llvm::replace(KindName, '_', ' ');
 
   std::string Fixup = fixupWithStyle(Type, Name, Style, HNOption, ND);
@@ -1392,9 +1395,14 @@ IdentifierNamingCheck::getMacroFailureInfo(const Token 
&MacroNameTok,
   if (!Style.isActive())
     return std::nullopt;
 
+  const auto &Styles = Style.getStyles();
+  const StyleKind UsedKind = !Styles[SK_MacroDefinition] && Styles[SK_Default]
+                                 ? SK_Default
+                                 : SK_MacroDefinition;
+
   return getFailureInfo("", MacroNameTok.getIdentifierInfo()->getName(),
                         nullptr, Loc, Style.getStyles(), Style.getHNOption(),
-                        SK_MacroDefinition, SM, IgnoreFailedSplit);
+                        UsedKind, SM, IgnoreFailedSplit);
 }
 
 RenamerClangTidyCheck::DiagInfo
@@ -1456,7 +1464,7 @@ StyleKind 
IdentifierNamingCheck::findStyleKindForAnonField(
   if (const auto *V = IFD->getVarDecl())
     return findStyleKindForVar(V, Type, NamingStyles);
 
-  return SK_Invalid;
+  return undefinedStyle(NamingStyles);
 }
 
 StyleKind IdentifierNamingCheck::findStyleKindForField(
@@ -1482,7 +1490,7 @@ StyleKind IdentifierNamingCheck::findStyleKindForField(
   if (NamingStyles[SK_Member])
     return SK_Member;
 
-  return SK_Invalid;
+  return undefinedStyle(NamingStyles);
 }
 
 StyleKind IdentifierNamingCheck::findStyleKindForVar(
@@ -1559,7 +1567,12 @@ StyleKind IdentifierNamingCheck::findStyleKindForVar(
   if (NamingStyles[SK_Variable])
     return SK_Variable;
 
-  return SK_Invalid;
+  return undefinedStyle(NamingStyles);
+}
+
+StyleKind IdentifierNamingCheck::undefinedStyle(
+    ArrayRef<std::optional<NamingStyle>> NamingStyles) const {
+  return NamingStyles[SK_Default] ? SK_Default : SK_Invalid;
 }
 
 } // namespace readability

diff  --git a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h 
b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
index 0b17af88810c2..87735808dff39 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.h
@@ -220,6 +220,9 @@ class IdentifierNamingCheck final : public 
RenamerClangTidyCheck {
   findStyleKindForVar(const VarDecl *Var, QualType Type,
                       ArrayRef<std::optional<NamingStyle>> NamingStyles) const;
 
+  StyleKind
+  undefinedStyle(ArrayRef<std::optional<NamingStyle>> NamingStyles) const;
+
   /// Stores the style options as a vector, indexed by the specified \ref
   /// StyleKind, for a given directory.
   mutable llvm::StringMap<FileStyle> NamingStylesCache;

diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index 924b2c03cfd18..f68a2cb751f30 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -607,7 +607,9 @@ Changes in existing checks
   <clang-tidy/checks/readability/identifier-naming>` check by ignoring
   declarations and macros in system headers. The documentation is also improved
   to 
diff erentiate the general options from the specific ones. Options for
-  fine-grained control over ``constexpr`` variables were added.
+  fine-grained control over ``constexpr`` variables were added. Added default
+  options which simplify configs by removing the need to specify each
+  identifier kind separately.
 
 - Improved :doc:`readability-implicit-bool-conversion
   <clang-tidy/checks/readability/implicit-bool-conversion>` check by correctly

diff  --git 
a/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst 
b/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst
index e9d46b730fe69..c8f87dcba8c0a 100644
--- a/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst
+++ b/clang-tools-extra/docs/clang-tidy/checks/readability/identifier-naming.rst
@@ -44,6 +44,36 @@ settings. The options and their corresponding values are:
  - ``LowerCase`` - example: ``int i_Variable``
  - ``CamelCase`` - example: ``int IVariable``
 
+The check only enforces style on kinds of identifiers which have been
+configured, so an empty config effectively disables it.
+The :option:`DefaultCase` option can be used to enforce style on all kinds of
+identifiers, then optionally overriden for specific kinds which are desired
+with a 
diff erent case.
+
+For example using values of:
+
+  - DefaultCase of ``lower_case``
+  - MacroDefinitionCase of ``UPPER_CASE``
+  - TemplateParameterCase of ``CamelCase``
+
+Identifies and transforms names as follows:
+
+Before:
+
+.. code-block:: c++
+
+  #define macroDefinition
+  template <typename typenameParameter>
+  int functionDeclaration(typenameParameter paramVal, int paramCount);
+
+After:
+
+.. code-block:: c++
+
+  #define MACRO_DEFINITION
+  template <typename TypenameParameter>
+  int function_declarations(TypenameParameter param_val, int param_count);
+
 Options summary
 ---------------
 
@@ -58,6 +88,9 @@ The available options are summarized below:
 
 **Specific options**
 
+ - :option:`DefaultCase`, :option:`DefaultPrefix`,
+   :option:`DefaultSuffix`, :option:`DefaultIgnoredRegexp`,
+   :option:`DefaultHungarianPrefix`
  - :option:`AbstractClassCase`, :option:`AbstractClassPrefix`,
    :option:`AbstractClassSuffix`, :option:`AbstractClassIgnoredRegexp`,
    :option:`AbstractClassHungarianPrefix`
@@ -223,6 +256,31 @@ Options description
 
 A detailed description of each option is presented below:
 
+.. option:: DefaultCase
+
+    When defined, the check will ensure all names by default conform to the
+    selected casing.
+
+.. option:: DefaultPrefix
+
+    When defined, the check will ensure all names by default will add the
+    prefix with the given value (regardless of casing).
+
+.. option:: DefaultIgnoredRegexp
+
+    Identifier naming checks won't be enforced for all names by default
+    matching this regular expression.
+
+.. option:: DefaultSuffix
+
+    When defined, the check will ensure all names by default will add the
+    suffix with the given value (regardless of casing).
+
+.. option:: DefaultHungarianPrefix
+
+    When enabled, the check ensures that the declared identifier will
+    have a Hungarian notation prefix based on the declared type.
+
 .. option:: AbstractClassCase
 
     When defined, the check will ensure abstract class names conform to the

diff  --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp
new file mode 100644
index 0000000000000..31026aca5c3e0
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-lower.cpp
@@ -0,0 +1,71 @@
+// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \
+// RUN:   -config='{CheckOptions: { \
+// RUN:     readability-identifier-naming.DefaultCase: "lower_case", \
+// RUN:   }}' \
+// RUN:   -- -fno-delayed-template-parsing
+
+// DefaultCase enables every type of identifier to be checked with same case
+#define MyMacro
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for identifier 
'MyMacro' [readability-identifier-naming]
+// CHECK-FIXES: #define my_macro
+
+namespace MyNamespace {
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: invalid case style for identifier 
'MyNamespace' [readability-identifier-naming]
+// CHECK-FIXES: namespace my_namespace {
+
+using MyAlias = int;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 
'MyAlias' [readability-identifier-naming]
+// CHECK-FIXES: using my_alias = int;
+
+int MyGlobal;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 
'MyGlobal' [readability-identifier-naming]
+// CHECK-FIXES: int my_global;
+
+struct MyStruct {
+// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for identifier 
'MyStruct' [readability-identifier-naming]
+// CHECK-FIXES: struct my_struct {
+  int MyField;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 
'MyField' [readability-identifier-naming]
+// CHECK-FIXES: int my_field;
+};
+
+template <typename MyTypename>
+// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for identifier 
'MyTypename' [readability-identifier-naming]
+// CHECK-FIXES: template <typename my_typename>
+int MyFunction(int MyArgument) {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 
'MyFunction' [readability-identifier-naming]
+// CHECK-MESSAGES: :[[@LINE-2]]:20: warning: invalid case style for identifier 
'MyArgument' [readability-identifier-naming]
+// CHECK-FIXES: int my_function(int my_argument) {
+  int MyVariable = MyArgument;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 
'MyVariable' [readability-identifier-naming]
+// CHECK-FIXES: int my_variable = my_argument;
+  return MyVariable;
+// CHECK-FIXES: return my_variable;
+}
+
+template int MyFunction<int>(int);
+
+} // namespace MyNamespace
+
+// These are all already formatted as desired.
+#define my_macro_2
+
+namespace my_namespace_2 {
+
+using my_alias = int;
+
+my_alias my_global;
+
+struct my_struct {
+  int my_field;
+};
+
+template <typename my_typename>
+int my_function(int my_argument) {
+  int my_variable = my_argument;
+  return my_variable;
+}
+
+template int my_function<int>(int);
+
+}  // namespace my_namespace_2

diff  --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp
new file mode 100644
index 0000000000000..7b1d64f450e0a
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-none.cpp
@@ -0,0 +1,49 @@
+// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \
+// RUN:   -config='{CheckOptions: {}}' \
+// RUN:   -- -fno-delayed-template-parsing
+
+// Empty options effectively disable the check, allowing PascalCase...
+#define MyMacro
+
+namespace MyNamespace {
+
+using MyAlias = int;
+
+int MyGlobal;
+
+struct MyStruct {
+  int MyField;
+};
+
+template <typename MyTypename>
+int MyFunction(int MyArgument) {
+  int MyVariable = MyArgument;
+  return MyVariable;
+}
+
+template int MyFunction<int>(int);
+
+}  // namespace MyNamespace
+
+// ...or lower_case for the same set of symbol types.
+#define my_macro_2
+
+namespace my_namespace_2 {
+
+using my_alias = int;
+
+my_alias my_global;
+
+struct my_struct {
+  int my_field;
+};
+
+template <typename my_typename>
+int my_function(int my_argument) {
+  int my_variable = my_argument;
+  return my_variable;
+}
+
+template int my_function<int>(int);
+
+}  // namespace my_namespace_2

diff  --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp
 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp
new file mode 100644
index 0000000000000..3a6f98951fefa
--- /dev/null
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-default-override.cpp
@@ -0,0 +1,75 @@
+// RUN: %check_clang_tidy %s readability-identifier-naming %t -- \
+// RUN:   -config='{CheckOptions: { \
+// RUN:     readability-identifier-naming.DefaultCase: "lower_case", \
+// RUN:     readability-identifier-naming.MacroDefinitionCase: "UPPER_CASE", \
+// RUN:     readability-identifier-naming.TemplateParameterCase: "UPPER_CASE", 
\
+// RUN:   }}' \
+// RUN:   -- -fno-delayed-template-parsing
+
+#define MyMacro
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for macro 
definition 'MyMacro' [readability-identifier-naming]
+// CHECK-FIXES: #define MY_MACRO
+
+namespace MyNamespace {
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: invalid case style for identifier 
'MyNamespace' [readability-identifier-naming]
+// CHECK-FIXES: namespace my_namespace {
+
+using MyAlias = int;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 
'MyAlias' [readability-identifier-naming]
+// CHECK-FIXES: using my_alias = int;
+
+int MyGlobal;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 
'MyGlobal' [readability-identifier-naming]
+// CHECK-FIXES: int my_global;
+
+struct MyStruct {
+// CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for identifier 
'MyStruct' [readability-identifier-naming]
+// CHECK-FIXES: struct my_struct {
+  int MyField;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 
'MyField' [readability-identifier-naming]
+// CHECK-FIXES: int my_field;
+};
+
+template <typename MyTypename>
+// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for template 
parameter 'MyTypename' [readability-identifier-naming]
+// CHECK-FIXES: template <typename MY_TYPENAME>
+int MyFunction(int MyArgument) {
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 
'MyFunction' [readability-identifier-naming]
+// CHECK-MESSAGES: :[[@LINE-2]]:20: warning: invalid case style for identifier 
'MyArgument' [readability-identifier-naming]
+// CHECK-FIXES: int my_function(int my_argument) {
+  int MyVariable = MyArgument;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for identifier 
'MyVariable' [readability-identifier-naming]
+// CHECK-FIXES: int my_variable = my_argument;
+  return MyVariable;
+// CHECK-FIXES: return my_variable;
+}
+
+template int MyFunction<int>(int);
+
+}  // namespace MyNamespace
+
+#define my_macro_2
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for macro 
definition 'my_macro_2' [readability-identifier-naming]
+// CHECK-FIXES: #define MY_MACRO_2
+
+namespace my_namespace_2 {
+
+using my_alias = int;
+
+my_alias my_global;
+
+struct my_struct {
+  int my_field;
+};
+
+template <typename my_typename>
+// CHECK-MESSAGES: :[[@LINE-1]]:20: warning: invalid case style for template 
parameter 'my_typename' [readability-identifier-naming]
+// CHECK-FIXES: template <typename MY_TYPENAME>
+int my_function(int my_argument) {
+  int my_variable = my_argument;
+  return my_variable;
+}
+
+template int my_function<int>(int);
+
+}  // namespace my_namespace_2


        
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to