Author: Björn Svensson
Date: 2026-04-03T21:11:18+03:00
New Revision: 61115200435b24ed2917f5bdce55560b6bd6c595

URL: 
https://github.com/llvm/llvm-project/commit/61115200435b24ed2917f5bdce55560b6bd6c595
DIFF: 
https://github.com/llvm/llvm-project/commit/61115200435b24ed2917f5bdce55560b6bd6c595.diff

LOG: [clang-tidy] Fix readability-identifier-naming for C++17 structured 
bindings (#189500)

`BindingDecl` nodes, i.e. the individual names in a structured binding,
were not handled in `IdentifierNamingCheck::findStyleKind()`, causing
them to fall through to the Default style or be silently ignored.
This led to incorrect renames, e.g. applying member variable conventions
to local bindings.

---------

Signed-off-by: Björn Svensson <[email protected]>

Added: 
    

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

Removed: 
    


################################################################################
diff  --git 
a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp 
b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
index 3bf7d7eb18529..871eaeec69021 100644
--- a/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/IdentifierNamingCheck.cpp
@@ -1238,6 +1238,15 @@ StyleKind IdentifierNamingCheck::findStyleKind(
   if (const auto *Decl = dyn_cast<VarDecl>(D))
     return findStyleKindForVar(Decl, Decl->getType(), NamingStyles);
 
+  // C++17 structured bindings: treat each binding as if it were a variable
+  // with the same storage and qualifiers as the parent DecompositionDecl.
+  if (const auto *BD = dyn_cast<BindingDecl>(D)) {
+    if (const auto *Decomp = 
dyn_cast_or_null<VarDecl>(BD->getDecomposedDecl()))
+      if (!BD->getType().isNull())
+        return findStyleKindForVar(Decomp, BD->getType(), NamingStyles);
+    return SK_Invalid;
+  }
+
   if (const auto *Decl = dyn_cast<CXXMethodDecl>(D)) {
     if (Decl->isMain() || !Decl->isUserProvided() ||
         Decl->size_overridden_methods() > 0 || Decl->hasAttr<OverrideAttr>())

diff  --git a/clang-tools-extra/docs/ReleaseNotes.rst 
b/clang-tools-extra/docs/ReleaseNotes.rst
index ce0b9b17c87e9..36e311341f336 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -428,6 +428,10 @@ Changes in existing checks
   now uses separate note diagnostics for each uninitialized enumerator, making
   it easier to see which specific enumerators need explicit initialization.
 
+- Improved :doc:`readability-identifier-naming
+  <clang-tidy/checks/readability/identifier-naming>` check by fixing incorrect
+  naming style application to C++17 structured bindings.
+
 - Improved :doc:`readability-implicit-bool-conversion
   <clang-tidy/checks/readability/implicit-bool-conversion>` check:
 

diff  --git 
a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp
index 1d06df3bbfaf2..f0a72ee31bc21 100644
--- 
a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp
+++ 
b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming.cpp
@@ -479,6 +479,32 @@ void global_function(int PARAMETER_1, int const 
CONST_parameter) {
     }
 }
 
+struct Binding_holder {
+  int field_a;
+  int field_b;
+};
+
+Binding_holder GetHolder();
+
+void StructuredBindingTests() {
+    auto [BAD_Local_1, BAD_Local_2] = GetHolder();
+// CHECK-MESSAGES: :[[@LINE-1]]:11: warning: invalid case style for local 
variable 'BAD_Local_1'
+// CHECK-MESSAGES: :[[@LINE-2]]:24: warning: invalid case style for local 
variable 'BAD_Local_2'
+// CHECK-FIXES: auto [bad_local_1, bad_local_2] = GetHolder();
+
+    const auto [BAD_Const_1, BAD_Const_2] = GetHolder();
+// CHECK-MESSAGES: :[[@LINE-1]]:17: warning: invalid case style for local 
constant 'BAD_Const_1'
+// CHECK-MESSAGES: :[[@LINE-2]]:30: warning: invalid case style for local 
constant 'BAD_Const_2'
+// CHECK-FIXES: const auto [kBadConst1, kBadConst2] = GetHolder();
+
+    const auto &[BAD_ConstRef_1, BAD_ConstRef_2] = GetHolder();
+// CHECK-MESSAGES: :[[@LINE-1]]:18: warning: invalid case style for local 
constant 'BAD_ConstRef_1'
+// CHECK-MESSAGES: :[[@LINE-2]]:34: warning: invalid case style for local 
constant 'BAD_ConstRef_2'
+// CHECK-FIXES: const auto &[kBadConstRef1, kBadConstRef2] = GetHolder();
+
+    auto [good_local_1, good_local_2] = GetHolder();
+}
+
 template<typename ... TYPE_parameters>
 // CHECK-MESSAGES: :[[@LINE-1]]:23: warning: invalid case style for type 
template parameter 'TYPE_parameters'
 // CHECK-FIXES: template<typename ... typeParameters_t>


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

Reply via email to