https://github.com/localspook created https://github.com/llvm/llvm-project/pull/182727
None >From 59e13c810553cc9fe783c175685a9ef72596a4f6 Mon Sep 17 00:00:00 2001 From: Victor Chernyakin <[email protected]> Date: Sat, 21 Feb 2026 23:02:17 -0800 Subject: [PATCH] [clang-tidy][NFC] Refactor `readability-reference-to-constructed-temporary` --- .../ReferenceToConstructedTemporaryCheck.cpp | 54 ++++--------------- .../ReferenceToConstructedTemporaryCheck.h | 8 ++- 2 files changed, 16 insertions(+), 46 deletions(-) diff --git a/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.cpp b/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.cpp index 398bee1d40923..2aea09226ede0 100644 --- a/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.cpp +++ b/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.cpp @@ -16,57 +16,23 @@ namespace clang::tidy::readability { namespace { -// Predicate structure to check if lifetime of temporary is not extended by -// ValueDecl pointed out by ID -struct NotExtendedByDeclBoundToPredicate { - bool operator()(const internal::BoundNodesMap &Nodes) const { - const auto *Other = Nodes.getNodeAs<ValueDecl>(ID); - if (!Other) - return true; - - const auto *Self = Node.get<MaterializeTemporaryExpr>(); - if (!Self) - return true; - - return Self->getExtendingDecl() != Other; - } - - StringRef ID; - ::clang::DynTypedNode Node; -}; - -AST_MATCHER_P(MaterializeTemporaryExpr, isExtendedByDeclBoundTo, StringRef, - ID) { - const NotExtendedByDeclBoundToPredicate Predicate{ - ID, ::clang::DynTypedNode::create(Node)}; - return Builder->removeBindings(Predicate); +AST_MATCHER_P(MaterializeTemporaryExpr, isExtendedBy, + ast_matchers::internal::Matcher<ValueDecl>, InnerMatcher) { + const ValueDecl *ExtendingDecl = Node.getExtendingDecl(); + return ExtendingDecl && InnerMatcher.matches(*ExtendingDecl, Finder, Builder); } } // namespace -bool ReferenceToConstructedTemporaryCheck::isLanguageVersionSupported( - const LangOptions &LangOpts) const { - return LangOpts.CPlusPlus; -} - -std::optional<TraversalKind> -ReferenceToConstructedTemporaryCheck::getCheckTraversalKind() const { - return TK_AsIs; -} - void ReferenceToConstructedTemporaryCheck::registerMatchers( MatchFinder *Finder) { Finder->addMatcher( - varDecl(unless(isExpansionInSystemHeader()), - hasType(qualType(references(qualType().bind("type")))), - decl().bind("var"), - hasInitializer(expr(hasDescendant( - materializeTemporaryExpr( - isExtendedByDeclBoundTo("var"), - has(expr(anyOf(cxxTemporaryObjectExpr(), initListExpr(), - cxxConstructExpr()), - hasType(qualType(equalsBoundNode("type")))))) - .bind("temporary"))))), + materializeTemporaryExpr( + hasType(qualType().bind("type")), + isExtendedBy(varDecl(hasType(qualType(references( + qualType(equalsBoundNode("type")))))) + .bind("var"))) + .bind("temporary"), this); } diff --git a/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.h b/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.h index 4c2b7f7e7f174..fe65e6f17f981 100644 --- a/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.h +++ b/clang-tools-extra/clang-tidy/readability/ReferenceToConstructedTemporaryCheck.h @@ -25,8 +25,12 @@ class ReferenceToConstructedTemporaryCheck : public ClangTidyCheck { : ClangTidyCheck(Name, Context) {} void registerMatchers(ast_matchers::MatchFinder *Finder) override; void check(const ast_matchers::MatchFinder::MatchResult &Result) override; - bool isLanguageVersionSupported(const LangOptions &LangOpts) const override; - std::optional<TraversalKind> getCheckTraversalKind() const override; + bool isLanguageVersionSupported(const LangOptions &LangOpts) const override { + return LangOpts.CPlusPlus; + } + std::optional<TraversalKind> getCheckTraversalKind() const override { + return TK_AsIs; + } }; } // namespace clang::tidy::readability _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
