Author: Zeyi Xu Date: 2026-08-08T20:16:55+08:00 New Revision: 4e274280c33edd820ab04d469d9edc1f9239d567
URL: https://github.com/llvm/llvm-project/commit/4e274280c33edd820ab04d469d9edc1f9239d567 DIFF: https://github.com/llvm/llvm-project/commit/4e274280c33edd820ab04d469d9edc1f9239d567.diff LOG: [clang-tidy] Fix a crash in bugprone-std-namespace-modification (#214704) Check the namespaces of template argument types directly from their declarations. This avoids querying the AST parent map (since it may not contain lambda closure types) and fixes the crash. Fixes #213981 Added: clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification-no-crash.cpp Modified: clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp clang-tools-extra/docs/ReleaseNotes.md Removed: ################################################################################ diff --git a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp index a623ed690697b..709de88a71f48 100644 --- a/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/StdNamespaceModificationCheck.cpp @@ -34,6 +34,19 @@ AST_POLYMORPHIC_MATCHER_P( Builder) != Args.end(); } +AST_MATCHER(Decl, isInStdOrPosixNamespace) { + for (const auto *DC = dyn_cast<DeclContext>(&Node); DC; + DC = DC->getParent()) { + if (DC->isStdNamespace()) + return true; + + if (const auto *NS = dyn_cast<NamespaceDecl>(DC); + NS && NS->getName() == "posix" && NS->getParent()->isTranslationUnit()) + return true; + } + return false; +} + } // namespace namespace clang::tidy::bugprone { @@ -43,10 +56,11 @@ void StdNamespaceModificationCheck::registerMatchers(MatchFinder *Finder) { hasDeclContext(namespaceDecl(hasAnyName("std", "posix"), unless(hasParent(namespaceDecl()))) .bind("nmspc")); + // FIXME: Investigate why lambda closure declarations can be absent from the + // AST parent map. const auto UserDefinedDecl = namedDecl(anyOf(classTemplateDecl(), tagDecl()), - hasAncestor(namespaceDecl(hasAnyName("std", "posix"), - unless(hasParent(namespaceDecl()))))); + hasDeclContext(isInStdOrPosixNamespace())); const auto UserDefinedType = qualType(hasUnqualifiedDesugaredType(anyOf( tagType(unless(hasDeclaration(UserDefinedDecl))), templateSpecializationType(unless(hasDeclaration(UserDefinedDecl)))))); diff --git a/clang-tools-extra/docs/ReleaseNotes.md b/clang-tools-extra/docs/ReleaseNotes.md index 28da9da42d8ce..5ded07934d906 100644 --- a/clang-tools-extra/docs/ReleaseNotes.md +++ b/clang-tools-extra/docs/ReleaseNotes.md @@ -102,6 +102,10 @@ infrastructure are described first, followed by tool-specific sections. #### Changes in existing checks +- Fixed a crash in {doc}`bugprone-std-namespace-modification + <clang-tidy/checks/bugprone/std-namespace-modification>` when checking + lambda closure types used as template arguments. + - 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. @@ -141,4 +145,3 @@ infrastructure are described first, followed by tool-specific sections. ### Improvements to pp-trace ### Clang-tidy Visual Studio plugin - diff --git a/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification-no-crash.cpp b/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification-no-crash.cpp new file mode 100644 index 0000000000000..bb2bf0eefeebb --- /dev/null +++ b/clang-tools-extra/test/clang-tidy/checkers/bugprone/std-namespace-modification-no-crash.cpp @@ -0,0 +1,10 @@ +// RUN: %check_clang_tidy -std=c++20-or-later -expect-clang-tidy-error %s bugprone-std-namespace-modification %t + +template <class A, class B> struct O : A, B {}; +template <class T> void f() { + auto a = [] {}; + auto b = [] {}; + O(a, b)(); + // CHECK-MESSAGES: :[[@LINE-1]]:3: error: member 'operator()' found in multiple base classes of diff erent types +} +template void f<int>(); _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
