https://github.com/zeyi2 created https://github.com/llvm/llvm-project/pull/181557
Closes https://github.com/llvm/llvm-project/issues/181552 >From 1f1cdcd7d2ec19abd33ded8748dd53237a017120 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> Date: Mon, 16 Feb 2026 00:37:36 +0800 Subject: [PATCH] [clang-tidy] Avoid crash on non-identifier names in readability-container-size-empty --- .../readability/ContainerSizeEmptyCheck.cpp | 12 ++++++++---- clang-tools-extra/docs/ReleaseNotes.rst | 4 ++++ .../checkers/readability/container-size-empty.cpp | 15 +++++++++++++++ 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp index 073fdce5018bf..f171cd0f44af4 100644 --- a/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ContainerSizeEmptyCheck.cpp @@ -116,11 +116,15 @@ AST_POLYMORPHIC_MATCHER_P( matchMemberName, AST_POLYMORPHIC_SUPPORTED_TYPES(MemberExpr, CXXDependentScopeMemberExpr), std::string, MemberName) { - if (const auto *E = dyn_cast<MemberExpr>(&Node)) - return E->getMemberDecl()->getName() == MemberName; + if (const auto *E = dyn_cast<MemberExpr>(&Node)) { + const IdentifierInfo *II = E->getMemberDecl()->getIdentifier(); + return II && II->getName() == MemberName; + } - if (const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node)) - return E->getMember().getAsString() == MemberName; + if (const auto *E = dyn_cast<CXXDependentScopeMemberExpr>(&Node)) { + const IdentifierInfo *II = E->getMember().getAsIdentifierInfo(); + return II && II->getName() == MemberName; + } return false; } diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst index 5c0060877a67f..0d39b4111d3a8 100644 --- a/clang-tools-extra/docs/ReleaseNotes.rst +++ b/clang-tools-extra/docs/ReleaseNotes.rst @@ -218,6 +218,10 @@ Changes in existing checks <clang-tidy/checks/performance/move-const-arg>` check by avoiding false positives on trivially copyable types with a non-public copy constructor. +- Improved :doc:`readability-container-size-empty + <clang-tidy/checks/readability/container-size-empty>` check by fixing a crash + when a member expression has a non-identifier name. + - Improved :doc:`readability-enum-initial-value <clang-tidy/checks/readability/enum-initial-value>` check: the warning message now uses separate note diagnostics for each uninitialized enumerator, making diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/container-size-empty.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/container-size-empty.cpp index 7844275c3a960..aacb74306edc7 100644 --- a/clang-tools-extra/test/clang-tidy/checkers/readability/container-size-empty.cpp +++ b/clang-tools-extra/test/clang-tidy/checkers/readability/container-size-empty.cpp @@ -985,3 +985,18 @@ class ReportInContainerNonEmptyMethodCompare { } } }; + +namespace GH181552 { +struct DestructorContainer { + unsigned long size() const; + bool empty() const; + ~DestructorContainer(); +}; + +struct DestructorUser { + DestructorContainer Indexes; + ~DestructorUser() { + Indexes.~DestructorContainer(); + } +}; +} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
