https://github.com/usx95 created https://github.com/llvm/llvm-project/pull/170007
None >From a1b450994cbbac0a95ba2f06bf8172822dcb075b Mon Sep 17 00:00:00 2001 From: Utkarsh Saxena <[email protected]> Date: Sat, 29 Nov 2025 16:43:06 +0000 Subject: [PATCH] std_move false positive --- .../Analyses/LifetimeSafety/FactsGenerator.h | 2 ++ .../lib/Analysis/LifetimeSafety/FactsGenerator.cpp | 14 ++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h b/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h index 939f421505463..eb251fa1400b6 100644 --- a/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h +++ b/clang/include/clang/Analysis/Analyses/LifetimeSafety/FactsGenerator.h @@ -101,6 +101,8 @@ class FactsGenerator : public ConstStmtVisitor<FactsGenerator> { // corresponding to the left-hand side is updated to be a "write", thereby // exempting it from the check. llvm::DenseMap<const DeclRefExpr *, UseFact *> UseFacts; + + llvm::DenseSet<const ValueDecl* > MovedDecls; }; } // namespace clang::lifetimes::internal diff --git a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp index c098069720c79..41a7d69edbdd8 100644 --- a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp +++ b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp @@ -168,9 +168,21 @@ void FactsGenerator::VisitCXXMemberCallExpr(const CXXMemberCallExpr *MCE) { } } +static bool isStdMove(const FunctionDecl *FD) { + return FD && FD->isInStdNamespace() && FD->getIdentifier() && + FD->getName() == "move"; +} + void FactsGenerator::VisitCallExpr(const CallExpr *CE) { handleFunctionCall(CE, CE->getDirectCallee(), {CE->getArgs(), CE->getNumArgs()}); + // Remember accessPath which moved using std::move. + // TODO: If there is need, this could flow-sensitive + if (isStdMove(CE->getDirectCallee())) + if (CE->getNumArgs() == 1) + if (auto *DRE = + dyn_cast<DeclRefExpr>(CE->getArg(0)->IgnoreParenImpCasts())) + MovedDecls.insert(DRE->getDecl()); } void FactsGenerator::VisitCXXNullPtrLiteralExpr( @@ -349,6 +361,8 @@ void FactsGenerator::handleLifetimeEnds(const CFGLifetimeEnds &LifetimeEnds) { // Iterate through all loans to see if any expire. for (const auto &Loan : FactMgr.getLoanMgr().getLoans()) { const AccessPath &LoanPath = Loan.Path; + if (MovedDecls.contains(LoanPath.D)) + continue; // Check if the loan is for a stack variable and if that variable // is the one being destructed. if (LoanPath.D == LifetimeEndsVD) _______________________________________________ llvm-branch-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits
