[clang] [LifetimeSafety] Suppress false field-escape warnings in destructors (PR #209614)

Utkarsh Saxena via cfe-commits cfe-commits at lists.llvm.org
Wed Jul 15 03:57:01 PDT 2026


https://github.com/usx95 updated https://github.com/llvm/llvm-project/pull/209614

>From 75506ca01e8db58467fb5a3e639784d10b959826 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <usx at google.com>
Date: Tue, 14 Jul 2026 20:20:11 +0000
Subject: [PATCH] fields in dtor do not dangle

---
 clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp |  7 +++++--
 clang/test/Sema/LifetimeSafety/dangling-field.cpp    | 10 ++++++++++
 2 files changed, 15 insertions(+), 2 deletions(-)

diff --git a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
index 095bee8135c20..dd2bffe22f4f5 100644
--- a/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/FactsGenerator.cpp
@@ -856,9 +856,12 @@ void FactsGenerator::handleFullExprCleanup(
 }
 
 void FactsGenerator::handleExitBlock() {
+  bool IsDestructor = isa_and_nonnull<CXXDestructorDecl>(AC.getDecl());
   for (const Origin &O : FactMgr.getOriginMgr().getOrigins())
-    if (auto *FD = dyn_cast_if_present<FieldDecl>(O.getDecl()))
-      // Create FieldEscapeFacts for all field origins that remain live at exit.
+    // Create FieldEscapeFacts for all field origins that remain live at exit.
+    // Fields in destructors do not escape since the object is being destroyed.
+    if (auto *FD = dyn_cast_if_present<FieldDecl>(O.getDecl());
+        FD && !IsDestructor)
       EscapesInCurrentBlock.push_back(
           FactMgr.createFact<FieldEscapeFact>(O.ID, FD));
     else if (auto *VD = dyn_cast_if_present<VarDecl>(O.getDecl())) {
diff --git a/clang/test/Sema/LifetimeSafety/dangling-field.cpp b/clang/test/Sema/LifetimeSafety/dangling-field.cpp
index b1eb31c4ee486..bc73c4f7e8644 100644
--- a/clang/test/Sema/LifetimeSafety/dangling-field.cpp
+++ b/clang/test/Sema/LifetimeSafety/dangling-field.cpp
@@ -245,3 +245,13 @@ struct HasUniquePtrField {
   }
 };
 } // namespace MakeUnique
+
+namespace DtorNoWarn {
+struct DtorSet {
+  std::string_view view;
+  ~DtorSet() {
+    std::string s;
+    view = s;
+  }
+};
+} // namespace DtorNoWarn



More information about the cfe-commits mailing list