[clang] [LifetimeSafety] Move unique_ptr::release() handling to handleMovedArgsInCall (PR #181005)
Utkarsh Saxena via cfe-commits
cfe-commits at lists.llvm.org
Mon Feb 16 11:39:44 PST 2026
https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/181005
>From 7a1489fd021abe42231736afb40a6d458f848979 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <usx at google.com>
Date: Wed, 11 Feb 2026 19:53:42 +0000
Subject: [PATCH] move_unique_ptr_release
---
.../LifetimeSafety/FactsGenerator.cpp | 25 ++++++++++---------
1 file changed, 13 insertions(+), 12 deletions(-)
diff --git a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
index b69f69ddbae34..0b25a6a401e08 100644
--- a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
@@ -523,9 +523,20 @@ void FactsGenerator::handleGSLPointerConstruction(const CXXConstructExpr *CCE) {
void FactsGenerator::handleMovedArgsInCall(const FunctionDecl *FD,
ArrayRef<const Expr *> Args) {
unsigned IsInstance = 0;
- if (const auto *Method = dyn_cast<CXXMethodDecl>(FD);
- Method && Method->isInstance() && !isa<CXXConstructorDecl>(FD))
+ if (const auto *MD = dyn_cast<CXXMethodDecl>(FD);
+ MD && MD->isInstance() && !isa<CXXConstructorDecl>(FD)) {
IsInstance = 1;
+ // std::unique_ptr::release() transfers ownership.
+ // Treat it as a move to prevent false-positive warnings when the unique_ptr
+ // destructor runs after ownership has been transferred.
+ if (isUniquePtrRelease(*MD)) {
+ const Expr *UniquePtrExpr = Args[0];
+ OriginList *MovedOrigins = getOriginsList(*UniquePtrExpr);
+ if (MovedOrigins)
+ CurrentBlockFacts.push_back(FactMgr.createFact<MovedOriginFact>(
+ UniquePtrExpr, MovedOrigins->getOuterOriginID()));
+ }
+ }
// Skip 'this' arg as it cannot be moved.
for (unsigned I = IsInstance;
@@ -549,16 +560,6 @@ void FactsGenerator::handleInvalidatingCall(const Expr *Call,
const auto *MD = dyn_cast<CXXMethodDecl>(FD);
if (!MD || !MD->isInstance())
return;
- // std::unique_ptr::release() transfers ownership.
- // Treat it as a move to prevent false-positive warnings when the unique_ptr
- // destructor runs after ownership has been transferred.
- if (isUniquePtrRelease(*MD)) {
- const Expr *UniquePtrExpr = Args[0];
- OriginList *MovedOrigins = getOriginsList(*UniquePtrExpr);
- if (MovedOrigins)
- CurrentBlockFacts.push_back(FactMgr.createFact<MovedOriginFact>(
- UniquePtrExpr, MovedOrigins->getOuterOriginID()));
- }
if (!isContainerInvalidationMethod(*MD))
return;
More information about the cfe-commits
mailing list