https://github.com/iitianpushkar updated 
https://github.com/llvm/llvm-project/pull/204900

>From 9d03e57fe0ae3543622d4cdfcc951369cac05faa Mon Sep 17 00:00:00 2001
From: iitianpushkar <[email protected]>
Date: Sat, 20 Jun 2026 02:02:02 +0530
Subject: [PATCH 1/6] added storage description in destroyed/invalidated here
 notes

---
 clang/include/clang/Basic/DiagnosticSemaKinds.td | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td 
b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index f84cd8dca6d4c..92e80f299dbbb 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11052,8 +11052,10 @@ def warn_lifetime_safety_inapplicable_lifetimebound
       DefaultIgnore;
 
 def note_lifetime_safety_used_here : Note<"later used here">;
-def note_lifetime_safety_invalidated_here : Note<"invalidated here">;
-def note_lifetime_safety_destroyed_here : Note<"destroyed here">;
+def note_lifetime_safety_invalidated_here : Note<"%0 is invalidated here">;
+def note_lifetime_safety_destroyed_here : Note<
+  "%0 is destroyed here at the end of "
+  "%select{its scope|the full-expression}1">;
 def note_lifetime_safety_freed_here : Note<"freed here">;
 def note_lifetime_safety_returned_here : Note<"returned here">;
 def note_lifetime_safety_moved_here : Note<"potentially moved here">;

>From 382e367e9aef80ece6dbc89b23b2b83f6f21f267 Mon Sep 17 00:00:00 2001
From: iitianpushkar <[email protected]>
Date: Sat, 20 Jun 2026 03:58:57 +0530
Subject: [PATCH 2/6] passed AccessPath info in the header

---
 .../Analyses/LifetimeSafety/LifetimeSafety.h  | 27 ++++++++++++++-----
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git 
a/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h 
b/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h
index 28886b826f72f..3e03de134ea6b 100644
--- a/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h
+++ b/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h
@@ -64,6 +64,7 @@ class LifetimeSafetySemaHelper {
   virtual void reportUseAfterScope(const Expr *IssueExpr, const Expr *UseExpr,
                                    const Expr *MovedExpr,
                                    SourceLocation FreeLoc,
+                                   const internal::AccessPath &ExpiredPath,
                                    llvm::ArrayRef<const Expr *> ExprChain) {}
 
   virtual void reportUseAfterReturn(const Expr *IssueExpr,
@@ -82,24 +83,36 @@ class LifetimeSafetySemaHelper {
 
   // Reports when a reference/iterator is used after the container operation
   // that invalidated it.
-  virtual void reportUseAfterInvalidation(const Expr *IssueExpr,
+   virtual void reportUseAfterInvalidation(const Expr *IssueExpr,
                                           const Expr *UseExpr,
-                                          const Expr *InvalidationExpr) {}
+                                          const Expr *InvalidationExpr,
+                                          const internal::AccessPath
+                                              &InvalidatedPath) {}
   virtual void reportUseAfterInvalidation(const ParmVarDecl *PVD,
                                           const Expr *UseExpr,
-                                          const Expr *InvalidationExpr) {}
+                                          const Expr *InvalidationExpr,
+                                          const internal::AccessPath
+                                              &InvalidatedPath) {}
   virtual void reportInvalidatedField(const Expr *IssueExpr,
                                       const FieldDecl *Field,
-                                      const Expr *InvalidationExpr) {}
+                                      const Expr *InvalidationExpr,
+                                      const internal::AccessPath
+                                          &InvalidatedPath) {}
   virtual void reportInvalidatedField(const ParmVarDecl *PVD,
                                       const FieldDecl *Field,
-                                      const Expr *InvalidationExpr) {}
+                                      const Expr *InvalidationExpr,
+                                      const internal::AccessPath
+                                          &InvalidatedPath) {}
   virtual void reportInvalidatedGlobal(const Expr *IssueExpr,
                                        const VarDecl *Global,
-                                       const Expr *InvalidationExpr) {}
+                                       const Expr *InvalidationExpr,
+                                       const internal::AccessPath
+                                           &InvalidatedPath) {}
   virtual void reportInvalidatedGlobal(const ParmVarDecl *PVD,
                                        const VarDecl *Global,
-                                       const Expr *InvalidationExpr) {}
+                                       const Expr *InvalidationExpr,
+                                       const internal::AccessPath
+                                           &InvalidatedPath) {}
 
   using EscapingTarget =
       llvm::PointerUnion<const Expr *, const FieldDecl *, const VarDecl *>;

>From 717a38322cb430a237a73762b77206fc4fa51cba Mon Sep 17 00:00:00 2001
From: iitianpushkar <[email protected]>
Date: Sat, 20 Jun 2026 04:30:01 +0530
Subject: [PATCH 3/6] implemented method to create storage-aware destruction
 and invalidation notes

---
 clang/lib/Sema/SemaLifetimeSafety.h | 115 ++++++++++++++++------------
 1 file changed, 68 insertions(+), 47 deletions(-)

diff --git a/clang/lib/Sema/SemaLifetimeSafety.h 
b/clang/lib/Sema/SemaLifetimeSafety.h
index a8bde363e3397..e67478afcf351 100644
--- a/clang/lib/Sema/SemaLifetimeSafety.h
+++ b/clang/lib/Sema/SemaLifetimeSafety.h
@@ -82,6 +82,7 @@ class LifetimeSafetySemaHelperImpl : public 
LifetimeSafetySemaHelper {
 
   void reportUseAfterScope(const Expr *IssueExpr, const Expr *UseExpr,
                            const Expr *MovedExpr, SourceLocation FreeLoc,
+                           const internal::AccessPath &ExpiredPath,
                            llvm::ArrayRef<const Expr *> ExprChain) override {
     unsigned DiagID = MovedExpr
                           ? diag::warn_lifetime_safety_use_after_scope_moved
@@ -92,7 +93,10 @@ class LifetimeSafetySemaHelperImpl : public 
LifetimeSafetySemaHelper {
     if (MovedExpr)
       S.Diag(MovedExpr->getExprLoc(), diag::note_lifetime_safety_moved_here)
           << MovedExpr->getSourceRange();
-    S.Diag(FreeLoc, diag::note_lifetime_safety_destroyed_here);
+    S.Diag(FreeLoc, diag::note_lifetime_safety_destroyed_here)
+        << getDiagStorageDescription(ExpiredPath)
+        << (ExpiredPath.getKind() ==
+            internal::AccessPath::Kind::MaterializeTemporary);
 
     reportAliasingChain(ExprChain);
 
@@ -161,87 +165,72 @@ class LifetimeSafetySemaHelperImpl : public 
LifetimeSafetySemaHelper {
           << DanglingGlobal->getEndLoc();
   }
 
-  void reportUseAfterInvalidation(const Expr *IssueExpr, const Expr *UseExpr,
-                                  const Expr *InvalidationExpr) override {
+  void reportUseAfterInvalidation(
+      const Expr *IssueExpr, const Expr *UseExpr, const Expr *InvalidationExpr,
+      const internal::AccessPath &InvalidatedPath) override {
     auto WarnDiag = isa<CXXDeleteExpr>(InvalidationExpr)
                         ? diag::warn_lifetime_safety_use_after_free
                         : diag::warn_lifetime_safety_invalidation;
-    auto UseDiag = isa<CXXDeleteExpr>(InvalidationExpr)
-                       ? diag::note_lifetime_safety_freed_here
-                       : diag::note_lifetime_safety_invalidated_here;
     S.Diag(IssueExpr->getExprLoc(), WarnDiag)
         << getDiagSubjectDescription(IssueExpr) << IssueExpr->getSourceRange();
-    S.Diag(InvalidationExpr->getExprLoc(), UseDiag)
-        << InvalidationExpr->getSourceRange();
+    reportInvalidationNote(InvalidationExpr, InvalidatedPath);
     S.Diag(UseExpr->getExprLoc(), diag::note_lifetime_safety_used_here)
         << UseExpr->getSourceRange();
   }
-  void reportUseAfterInvalidation(const ParmVarDecl *PVD, const Expr *UseExpr,
-                                  const Expr *InvalidationExpr) override {
+  void reportUseAfterInvalidation(
+      const ParmVarDecl *PVD, const Expr *UseExpr, const Expr 
*InvalidationExpr,
+      const internal::AccessPath &InvalidatedPath) override {
 
     auto WarnDiag = isa<CXXDeleteExpr>(InvalidationExpr)
                         ? diag::warn_lifetime_safety_use_after_free
                         : diag::warn_lifetime_safety_invalidation;
-    auto UseDiag = isa<CXXDeleteExpr>(InvalidationExpr)
-                       ? diag::note_lifetime_safety_freed_here
-                       : diag::note_lifetime_safety_invalidated_here;
 
     S.Diag(PVD->getSourceRange().getBegin(), WarnDiag)
         << getDiagSubjectDescription(PVD) << PVD->getSourceRange();
-    S.Diag(InvalidationExpr->getExprLoc(), UseDiag)
-        << InvalidationExpr->getSourceRange();
+    reportInvalidationNote(InvalidationExpr, InvalidatedPath);
     S.Diag(UseExpr->getExprLoc(), diag::note_lifetime_safety_used_here)
         << UseExpr->getSourceRange();
   }
 
-  void reportInvalidatedField(const Expr *IssueExpr,
-                              const FieldDecl *DanglingField,
-                              const Expr *InvalidationExpr) override {
-    auto InvalidationDiag = isa<CXXDeleteExpr>(InvalidationExpr)
-                                ? diag::note_lifetime_safety_freed_here
-                                : diag::note_lifetime_safety_invalidated_here;
+  void
+  reportInvalidatedField(const Expr *IssueExpr, const FieldDecl *DanglingField,
+                         const Expr *InvalidationExpr,
+                         const internal::AccessPath &InvalidatedPath) override 
{
     S.Diag(IssueExpr->getExprLoc(),
            diag::warn_lifetime_safety_invalidated_field)
         << getDiagSubjectDescription(IssueExpr)
         << getDiagSubjectDescription(DanglingField)
         << IssueExpr->getSourceRange();
-    S.Diag(InvalidationExpr->getExprLoc(), InvalidationDiag)
-        << InvalidationExpr->getSourceRange();
+    reportInvalidationNote(InvalidationExpr, InvalidatedPath);
     S.Diag(DanglingField->getLocation(),
            diag::note_lifetime_safety_dangling_field_here)
         << DanglingField->getEndLoc();
   }
 
-  void reportInvalidatedField(const ParmVarDecl *PVD,
-                              const FieldDecl *DanglingField,
-                              const Expr *InvalidationExpr) override {
-    auto InvalidationDiag = isa<CXXDeleteExpr>(InvalidationExpr)
-                                ? diag::note_lifetime_safety_freed_here
-                                : diag::note_lifetime_safety_invalidated_here;
+  void
+  reportInvalidatedField(const ParmVarDecl *PVD, const FieldDecl 
*DanglingField,
+                         const Expr *InvalidationExpr,
+                         const internal::AccessPath &InvalidatedPath) override 
{
     S.Diag(PVD->getSourceRange().getBegin(),
            diag::warn_lifetime_safety_invalidated_field)
         << getDiagSubjectDescription(PVD)
         << getDiagSubjectDescription(DanglingField) << PVD->getSourceRange();
-    S.Diag(InvalidationExpr->getExprLoc(), InvalidationDiag)
-        << InvalidationExpr->getSourceRange();
+    reportInvalidationNote(InvalidationExpr, InvalidatedPath);
     S.Diag(DanglingField->getLocation(),
            diag::note_lifetime_safety_dangling_field_here)
         << DanglingField->getEndLoc();
   }
 
-  void reportInvalidatedGlobal(const Expr *IssueExpr,
-                               const VarDecl *DanglingGlobal,
-                               const Expr *InvalidationExpr) override {
-    auto InvalidationDiag = isa<CXXDeleteExpr>(InvalidationExpr)
-                                ? diag::note_lifetime_safety_freed_here
-                                : diag::note_lifetime_safety_invalidated_here;
+  void reportInvalidatedGlobal(
+      const Expr *IssueExpr, const VarDecl *DanglingGlobal,
+      const Expr *InvalidationExpr,
+      const internal::AccessPath &InvalidatedPath) override {
     S.Diag(IssueExpr->getExprLoc(),
            diag::warn_lifetime_safety_invalidated_global)
         << getDiagSubjectDescription(IssueExpr)
         << getDiagSubjectDescription(DanglingGlobal)
         << IssueExpr->getSourceRange();
-    S.Diag(InvalidationExpr->getExprLoc(), InvalidationDiag)
-        << InvalidationExpr->getSourceRange();
+    reportInvalidationNote(InvalidationExpr, InvalidatedPath);
     if (DanglingGlobal->isStaticLocal() || 
DanglingGlobal->isStaticDataMember())
       S.Diag(DanglingGlobal->getLocation(),
              diag::note_lifetime_safety_dangling_static_here)
@@ -252,18 +241,15 @@ class LifetimeSafetySemaHelperImpl : public 
LifetimeSafetySemaHelper {
           << DanglingGlobal->getEndLoc();
   }
 
-  void reportInvalidatedGlobal(const ParmVarDecl *PVD,
-                               const VarDecl *DanglingGlobal,
-                               const Expr *InvalidationExpr) override {
-    auto InvalidationDiag = isa<CXXDeleteExpr>(InvalidationExpr)
-                                ? diag::note_lifetime_safety_freed_here
-                                : diag::note_lifetime_safety_invalidated_here;
+  void reportInvalidatedGlobal(
+      const ParmVarDecl *PVD, const VarDecl *DanglingGlobal,
+      const Expr *InvalidationExpr,
+      const internal::AccessPath &InvalidatedPath) override {
     S.Diag(PVD->getSourceRange().getBegin(),
            diag::warn_lifetime_safety_invalidated_global)
         << getDiagSubjectDescription(PVD)
         << getDiagSubjectDescription(DanglingGlobal) << PVD->getSourceRange();
-    S.Diag(InvalidationExpr->getExprLoc(), InvalidationDiag)
-        << InvalidationExpr->getSourceRange();
+    reportInvalidationNote(InvalidationExpr, InvalidatedPath);
     if (DanglingGlobal->isStaticLocal() || 
DanglingGlobal->isStaticDataMember())
       S.Diag(DanglingGlobal->getLocation(),
              diag::note_lifetime_safety_dangling_static_here)
@@ -441,6 +427,41 @@ class LifetimeSafetySemaHelperImpl : public 
LifetimeSafetySemaHelper {
   }
 
 private:
+  std::string
+  getDiagStorageDescription(const internal::AccessPath &AccessPath) {
+    if (const auto *VD = AccessPath.getAsValueDecl()) {
+      std::string Res;
+      llvm::raw_string_ostream OS(Res);
+      OS << "'";
+      VD->getNameForDiagnostic(OS, S.getPrintingPolicy(), /*Qualified=*/false);
+      OS << "'";
+      return Res;
+    }
+    if (AccessPath.getAsMaterializeTemporaryExpr())
+      return "temporary object";
+    if (const auto *PVD = AccessPath.getAsPlaceholderParam())
+      return getDiagSubjectDescription(PVD);
+    if (AccessPath.getAsPlaceholderThis())
+      return "the object referenced by 'this'";
+    if (AccessPath.getAsNewAllocation())
+      return "allocated object";
+    return "object";
+  }
+
+  void reportInvalidationNote(const Expr *InvalidationExpr,
+                              const internal::AccessPath &InvalidatedPath) {
+    if (isa<CXXDeleteExpr>(InvalidationExpr)) {
+      S.Diag(InvalidationExpr->getExprLoc(),
+             diag::note_lifetime_safety_freed_here)
+          << InvalidationExpr->getSourceRange();
+      return;
+    }
+    S.Diag(InvalidationExpr->getExprLoc(),
+           diag::note_lifetime_safety_invalidated_here)
+        << getDiagStorageDescription(InvalidatedPath)
+        << InvalidationExpr->getSourceRange();
+  }
+
   std::pair<SourceLocation, StringRef>
   getLifetimeBoundFixIt(const ParmVarDecl *Decl) {
     SourceLocation InsertionPoint = Lexer::getLocForEndOfToken(

>From b88c9aa41c826f9a5c8859c550da491218342e17 Mon Sep 17 00:00:00 2001
From: iitianpushkar <[email protected]>
Date: Sat, 20 Jun 2026 04:53:45 +0530
Subject: [PATCH 4/6] passed accesspath in semahelper's afterScope/invalidated
 report methods

---
 clang/lib/Analysis/LifetimeSafety/Checker.cpp | 20 ++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/clang/lib/Analysis/LifetimeSafety/Checker.cpp 
b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
index d41d6f43f837b..4c6542599ef31 100644
--- a/clang/lib/Analysis/LifetimeSafety/Checker.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
@@ -258,16 +258,18 @@ class LifetimeChecker {
           if (IssueExpr)
             // Use-after-invalidation of an object on stack.
             SemaHelper->reportUseAfterInvalidation(IssueExpr, UF->getUseExpr(),
-                                                   Warning.InvalidatedByExpr);
+                                                   Warning.InvalidatedByExpr,
+                                                   L->getAccessPath());
           else if (InvalidatedPVD)
             // Use-after-invalidation of a parameter.
             SemaHelper->reportUseAfterInvalidation(
-                InvalidatedPVD, UF->getUseExpr(), Warning.InvalidatedByExpr);
-
+                InvalidatedPVD, UF->getUseExpr(), Warning.InvalidatedByExpr,
+                L->getAccessPath());
         } else
           // Scope-based expiry (use-after-scope).
           SemaHelper->reportUseAfterScope(
               IssueExpr, UF->getUseExpr(), MovedExpr, ExpiryLoc,
+              L->getAccessPath(),
               getExprChain(LoanPropagation.buildOriginFlowChain(UF, LID)));
 
       } else if (const auto *OEF =
@@ -279,12 +281,14 @@ class LifetimeChecker {
               // Invalidated object on stack escapes to a field.
               SemaHelper->reportInvalidatedField(IssueExpr,
                                                  FieldEscape->getFieldDecl(),
-                                                 Warning.InvalidatedByExpr);
+                                                 Warning.InvalidatedByExpr,
+                                                 L->getAccessPath());
             else if (InvalidatedPVD)
               // Invalidated parameter escapes to a field.
               SemaHelper->reportInvalidatedField(InvalidatedPVD,
                                                  FieldEscape->getFieldDecl(),
-                                                 Warning.InvalidatedByExpr);
+                                                 Warning.InvalidatedByExpr,
+                                                 L->getAccessPath());
           } else if (const auto *GlobalEscape =
                          dyn_cast<GlobalEscapeFact>(OEF)) {
             // Invalidated object escapes to global or static storage.
@@ -293,12 +297,14 @@ class LifetimeChecker {
               // storage.
               SemaHelper->reportInvalidatedGlobal(IssueExpr,
                                                   GlobalEscape->getGlobal(),
-                                                  Warning.InvalidatedByExpr);
+                                                  Warning.InvalidatedByExpr,
+                                                  L->getAccessPath());
             else if (InvalidatedPVD)
               // Invalidated parameter escapes to global or static storage.
               SemaHelper->reportInvalidatedGlobal(InvalidatedPVD,
                                                   GlobalEscape->getGlobal(),
-                                                  Warning.InvalidatedByExpr);
+                                                  Warning.InvalidatedByExpr,
+                                                  L->getAccessPath());
           } else if (isa<ReturnEscapeFact>(OEF)) {
             // FIXME: Diagnose invalidated return escapes separately.
           } else

>From 577fdc8ee7658e1134cce3b6d93425521deadfab Mon Sep 17 00:00:00 2001
From: iitianpushkar <[email protected]>
Date: Sat, 20 Jun 2026 05:12:11 +0530
Subject: [PATCH 5/6] tests passed for storage-aware destruction/invalidations
 notes

---
 clang/test/Sema/LifetimeSafety/invalidations.cpp | 2 +-
 clang/test/Sema/LifetimeSafety/safety.cpp        | 4 ++--
 2 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/clang/test/Sema/LifetimeSafety/invalidations.cpp 
b/clang/test/Sema/LifetimeSafety/invalidations.cpp
index 301822f066de8..b5eb886980ce0 100644
--- a/clang/test/Sema/LifetimeSafety/invalidations.cpp
+++ b/clang/test/Sema/LifetimeSafety/invalidations.cpp
@@ -8,7 +8,7 @@ namespace SimpleResize {
 void IteratorInvalidAfterResize(int new_size) {
   std::vector<int> v;
   auto it = std::begin(v);  // expected-warning {{local variable 'v' is later 
invalidated}}
-  v.resize(new_size);       // expected-note {{invalidated here}}
+  v.resize(new_size);       // expected-note {{'v' is invalidated here}}
   *it;                      // expected-note {{later used here}}
 }
 
diff --git a/clang/test/Sema/LifetimeSafety/safety.cpp 
b/clang/test/Sema/LifetimeSafety/safety.cpp
index 7a2644e46a6e1..4d78276fa4f78 100644
--- a/clang/test/Sema/LifetimeSafety/safety.cpp
+++ b/clang/test/Sema/LifetimeSafety/safety.cpp
@@ -55,7 +55,7 @@ void simple_case() {
   {
     MyObj s;
     p = &s;     // expected-warning {{local variable 's' does not live long 
enough}}
-  }             // expected-note {{destroyed here}}
+  }             // expected-note {{'s' is destroyed here at the end of its 
scope}}
   (void)*p;     // expected-note {{later used here}}
 }
 
@@ -1926,7 +1926,7 @@ const std::string& identity(const std::string& in 
[[clang::lifetimebound]]);
 const S& identity(const S& in [[clang::lifetimebound]]);
 
 void test_temporary() {
-  const std::string& x = S().x(); // expected-warning {{temporary object does 
not live long enough}} expected-note {{destroyed here}} \
+  const std::string& x = S().x(); // expected-warning {{temporary object does 
not live long enough}} expected-note {{temporary object is destroyed here at 
the end of the full-expression}} \
                                   // expected-note {{result of call to 'x' 
aliases the storage of temporary object}}
   (void)x; // expected-note {{later used here}}
 

>From 8e0a03e31ff02523b0edeeae33f2db69daa4cc4a Mon Sep 17 00:00:00 2001
From: iitianpushkar <[email protected]>
Date: Sat, 20 Jun 2026 06:41:11 +0530
Subject: [PATCH 6/6] Fixed clang-format CI failure

---
 .../Analyses/LifetimeSafety/LifetimeSafety.h  | 54 +++++++++----------
 clang/lib/Analysis/LifetimeSafety/Checker.cpp | 28 +++++-----
 2 files changed, 36 insertions(+), 46 deletions(-)

diff --git 
a/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h 
b/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h
index 3e03de134ea6b..4e2412b17ceaf 100644
--- a/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h
+++ b/clang/include/clang/Analysis/Analyses/LifetimeSafety/LifetimeSafety.h
@@ -83,36 +83,30 @@ class LifetimeSafetySemaHelper {
 
   // Reports when a reference/iterator is used after the container operation
   // that invalidated it.
-   virtual void reportUseAfterInvalidation(const Expr *IssueExpr,
-                                          const Expr *UseExpr,
-                                          const Expr *InvalidationExpr,
-                                          const internal::AccessPath
-                                              &InvalidatedPath) {}
-  virtual void reportUseAfterInvalidation(const ParmVarDecl *PVD,
-                                          const Expr *UseExpr,
-                                          const Expr *InvalidationExpr,
-                                          const internal::AccessPath
-                                              &InvalidatedPath) {}
-  virtual void reportInvalidatedField(const Expr *IssueExpr,
-                                      const FieldDecl *Field,
-                                      const Expr *InvalidationExpr,
-                                      const internal::AccessPath
-                                          &InvalidatedPath) {}
-  virtual void reportInvalidatedField(const ParmVarDecl *PVD,
-                                      const FieldDecl *Field,
-                                      const Expr *InvalidationExpr,
-                                      const internal::AccessPath
-                                          &InvalidatedPath) {}
-  virtual void reportInvalidatedGlobal(const Expr *IssueExpr,
-                                       const VarDecl *Global,
-                                       const Expr *InvalidationExpr,
-                                       const internal::AccessPath
-                                           &InvalidatedPath) {}
-  virtual void reportInvalidatedGlobal(const ParmVarDecl *PVD,
-                                       const VarDecl *Global,
-                                       const Expr *InvalidationExpr,
-                                       const internal::AccessPath
-                                           &InvalidatedPath) {}
+  virtual void
+  reportUseAfterInvalidation(const Expr *IssueExpr, const Expr *UseExpr,
+                             const Expr *InvalidationExpr,
+                             const internal::AccessPath &InvalidatedPath) {}
+  virtual void
+  reportUseAfterInvalidation(const ParmVarDecl *PVD, const Expr *UseExpr,
+                             const Expr *InvalidationExpr,
+                             const internal::AccessPath &InvalidatedPath) {}
+  virtual void
+  reportInvalidatedField(const Expr *IssueExpr, const FieldDecl *Field,
+                         const Expr *InvalidationExpr,
+                         const internal::AccessPath &InvalidatedPath) {}
+  virtual void
+  reportInvalidatedField(const ParmVarDecl *PVD, const FieldDecl *Field,
+                         const Expr *InvalidationExpr,
+                         const internal::AccessPath &InvalidatedPath) {}
+  virtual void
+  reportInvalidatedGlobal(const Expr *IssueExpr, const VarDecl *Global,
+                          const Expr *InvalidationExpr,
+                          const internal::AccessPath &InvalidatedPath) {}
+  virtual void
+  reportInvalidatedGlobal(const ParmVarDecl *PVD, const VarDecl *Global,
+                          const Expr *InvalidationExpr,
+                          const internal::AccessPath &InvalidatedPath) {}
 
   using EscapingTarget =
       llvm::PointerUnion<const Expr *, const FieldDecl *, const VarDecl *>;
diff --git a/clang/lib/Analysis/LifetimeSafety/Checker.cpp 
b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
index 4c6542599ef31..ac20e83c8473d 100644
--- a/clang/lib/Analysis/LifetimeSafety/Checker.cpp
+++ b/clang/lib/Analysis/LifetimeSafety/Checker.cpp
@@ -279,32 +279,28 @@ class LifetimeChecker {
             // Invalidated object escapes to a field.
             if (IssueExpr)
               // Invalidated object on stack escapes to a field.
-              SemaHelper->reportInvalidatedField(IssueExpr,
-                                                 FieldEscape->getFieldDecl(),
-                                                 Warning.InvalidatedByExpr,
-                                                 L->getAccessPath());
+              SemaHelper->reportInvalidatedField(
+                  IssueExpr, FieldEscape->getFieldDecl(),
+                  Warning.InvalidatedByExpr, L->getAccessPath());
             else if (InvalidatedPVD)
               // Invalidated parameter escapes to a field.
-              SemaHelper->reportInvalidatedField(InvalidatedPVD,
-                                                 FieldEscape->getFieldDecl(),
-                                                 Warning.InvalidatedByExpr,
-                                                 L->getAccessPath());
+              SemaHelper->reportInvalidatedField(
+                  InvalidatedPVD, FieldEscape->getFieldDecl(),
+                  Warning.InvalidatedByExpr, L->getAccessPath());
           } else if (const auto *GlobalEscape =
                          dyn_cast<GlobalEscapeFact>(OEF)) {
             // Invalidated object escapes to global or static storage.
             if (IssueExpr)
               // Invalidated object on stack escapes to global or static
               // storage.
-              SemaHelper->reportInvalidatedGlobal(IssueExpr,
-                                                  GlobalEscape->getGlobal(),
-                                                  Warning.InvalidatedByExpr,
-                                                  L->getAccessPath());
+              SemaHelper->reportInvalidatedGlobal(
+                  IssueExpr, GlobalEscape->getGlobal(),
+                  Warning.InvalidatedByExpr, L->getAccessPath());
             else if (InvalidatedPVD)
               // Invalidated parameter escapes to global or static storage.
-              SemaHelper->reportInvalidatedGlobal(InvalidatedPVD,
-                                                  GlobalEscape->getGlobal(),
-                                                  Warning.InvalidatedByExpr,
-                                                  L->getAccessPath());
+              SemaHelper->reportInvalidatedGlobal(
+                  InvalidatedPVD, GlobalEscape->getGlobal(),
+                  Warning.InvalidatedByExpr, L->getAccessPath());
           } else if (isa<ReturnEscapeFact>(OEF)) {
             // FIXME: Diagnose invalidated return escapes separately.
           } else

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to