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
