https://github.com/usx95 created 
https://github.com/llvm/llvm-project/pull/153951

None

>From c39264cdf41989fa9c189bc30e6e5bf3eeb57612 Mon Sep 17 00:00:00 2001
From: Utkarsh Saxena <u...@google.com>
Date: Sat, 16 Aug 2025 11:45:30 +0000
Subject: [PATCH] Add decl/expr name to Origin's debug output

---
 clang/lib/Analysis/LifetimeSafety.cpp         |  48 ++++--
 .../Sema/warn-lifetime-safety-dataflow.cpp    | 160 +++++++++---------
 2 files changed, 115 insertions(+), 93 deletions(-)

diff --git a/clang/lib/Analysis/LifetimeSafety.cpp 
b/clang/lib/Analysis/LifetimeSafety.cpp
index 86d9517dde45c..fd3554ad76ccf 100644
--- a/clang/lib/Analysis/LifetimeSafety.cpp
+++ b/clang/lib/Analysis/LifetimeSafety.cpp
@@ -175,6 +175,18 @@ class OriginManager {
     return NewID;
   }
 
+  void dump(OriginID OID, llvm::raw_ostream &OS) const {
+    OS << "Origin " << OID << " (";
+    Origin O = getOrigin(OID);
+    if (const ValueDecl *VD = O.getDecl())
+      OS << "Decl: " << VD->getNameAsString();
+    else if (const Expr *E = O.getExpr())
+      OS << "Expr: " << E->getStmtClassName();
+    else
+      OS << "Unknown";
+    OS << ")";
+  }
+
 private:
   OriginID getNextOriginID() { return NextOriginID++; }
 
@@ -222,7 +234,7 @@ class Fact {
     return nullptr;
   }
 
-  virtual void dump(llvm::raw_ostream &OS) const {
+  virtual void dump(llvm::raw_ostream &OS, const OriginManager &) const {
     OS << "Fact (Kind: " << static_cast<int>(K) << ")\n";
   }
 };
@@ -237,9 +249,10 @@ class IssueFact : public Fact {
   IssueFact(LoanID LID, OriginID OID) : Fact(Kind::Issue), LID(LID), OID(OID) 
{}
   LoanID getLoanID() const { return LID; }
   OriginID getOriginID() const { return OID; }
-  void dump(llvm::raw_ostream &OS) const override {
-    OS << "Issue (LoanID: " << getLoanID() << ", OriginID: " << getOriginID()
-       << ")\n";
+  void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
+    OS << "Issue (LoanID: " << getLoanID() << ", ";
+    OM.dump(getOriginID(), OS);
+    OS << ")\n";
   }
 };
 
@@ -256,7 +269,7 @@ class ExpireFact : public Fact {
   LoanID getLoanID() const { return LID; }
   SourceLocation getExpiryLoc() const { return ExpiryLoc; }
 
-  void dump(llvm::raw_ostream &OS) const override {
+  void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
     OS << "Expire (LoanID: " << getLoanID() << ")\n";
   }
 };
@@ -274,9 +287,12 @@ class AssignOriginFact : public Fact {
       : Fact(Kind::AssignOrigin), OIDDest(OIDDest), OIDSrc(OIDSrc) {}
   OriginID getDestOriginID() const { return OIDDest; }
   OriginID getSrcOriginID() const { return OIDSrc; }
-  void dump(llvm::raw_ostream &OS) const override {
-    OS << "AssignOrigin (DestID: " << getDestOriginID()
-       << ", SrcID: " << getSrcOriginID() << ")\n";
+  void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
+    OS << "AssignOrigin (Dest: ";
+    OM.dump(getDestOriginID(), OS);
+    OS << ", Src: ";
+    OM.dump(getSrcOriginID(), OS);
+    OS << ")\n";
   }
 };
 
@@ -290,8 +306,10 @@ class ReturnOfOriginFact : public Fact {
 
   ReturnOfOriginFact(OriginID OID) : Fact(Kind::ReturnOfOrigin), OID(OID) {}
   OriginID getReturnedOriginID() const { return OID; }
-  void dump(llvm::raw_ostream &OS) const override {
-    OS << "ReturnOfOrigin (OriginID: " << getReturnedOriginID() << ")\n";
+  void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
+    OS << "ReturnOfOrigin (Origin: ";
+    OM.dump(getReturnedOriginID(), OS);
+    OS << ")\n";
   }
 };
 
@@ -308,8 +326,10 @@ class UseFact : public Fact {
   OriginID getUsedOrigin() const { return UsedOrigin; }
   const Expr *getUseExpr() const { return UseExpr; }
 
-  void dump(llvm::raw_ostream &OS) const override {
-    OS << "Use (OriginID: " << UsedOrigin << ")\n";
+  void dump(llvm::raw_ostream &OS, const OriginManager &OM) const override {
+    OS << "Use (Origin: ";
+    OM.dump(getUsedOrigin(), OS);
+    OS << ")\n";
   }
 };
 
@@ -326,7 +346,7 @@ class TestPointFact : public Fact {
 
   StringRef getAnnotation() const { return Annotation; }
 
-  void dump(llvm::raw_ostream &OS) const override {
+  void dump(llvm::raw_ostream &OS, const OriginManager &) const override {
     OS << "TestPoint (Annotation: \"" << getAnnotation() << "\")\n";
   }
 };
@@ -365,7 +385,7 @@ class FactManager {
       if (It != BlockToFactsMap.end()) {
         for (const Fact *F : It->second) {
           llvm::dbgs() << "    ";
-          F->dump(llvm::dbgs());
+          F->dump(llvm::dbgs(), OriginMgr);
         }
       }
       llvm::dbgs() << "  End of Block\n";
diff --git a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp 
b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp
index 2b934ac23b92d..fbcff57a2f108 100644
--- a/clang/test/Sema/warn-lifetime-safety-dataflow.cpp
+++ b/clang/test/Sema/warn-lifetime-safety-dataflow.cpp
@@ -12,11 +12,11 @@ MyObj* return_local_addr() {
   MyObj x {10};
   MyObj* p = &x;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_X:[0-9]+]], OriginID: [[O_ADDR_X:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_X]])
+// CHECK:   Issue (LoanID: [[L_X:[0-9]+]], Origin [[O_ADDR_X:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
[[O_ADDR_X]] (Expr: UnaryOperator))
   return p;
-// CHECK:   AssignOrigin (DestID: [[O_RET_VAL:[0-9]+]], SrcID: [[O_P]])
-// CHECK:   ReturnOfOrigin (OriginID: [[O_RET_VAL]])
+// CHECK:   AssignOrigin (Dest: Origin [[O_RET_VAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_P]] (Decl: p))
+// CHECK:   ReturnOfOrigin (Origin: Origin [[O_RET_VAL]] (Expr: 
ImplicitCastExpr))
 // CHECK:   Expire (LoanID: [[L_X]])
 }
 
@@ -27,20 +27,20 @@ MyObj* return_local_addr() {
 MyObj* assign_and_return_local_addr() {
   MyObj y{20};
   MyObj* ptr1 = &y;
-// CHECK: Issue (LoanID: [[L_Y:[0-9]+]], OriginID: [[O_ADDR_Y:[0-9]+]])
-// CHECK: AssignOrigin (DestID: [[O_PTR1:[0-9]+]], SrcID: [[O_ADDR_Y]])
+// CHECK: Issue (LoanID: [[L_Y:[0-9]+]], Origin [[O_ADDR_Y:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR1:[0-9]+]] (Decl: ptr1), Src: 
Origin [[O_ADDR_Y]] (Expr: UnaryOperator))
   MyObj* ptr2 = ptr1;
-// CHECK: AssignOrigin (DestID: [[O_PTR1_RVAL:[0-9]+]], SrcID: [[O_PTR1]])
-// CHECK: AssignOrigin (DestID: [[O_PTR2:[0-9]+]], SrcID: [[O_PTR1_RVAL]])
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR1_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_PTR1]] (Decl: ptr1))
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR2:[0-9]+]] (Decl: ptr2), Src: 
Origin [[O_PTR1_RVAL]] (Expr: ImplicitCastExpr))
   ptr2 = ptr1;
-// CHECK: AssignOrigin (DestID: [[O_PTR1_RVAL_2:[0-9]+]], SrcID: [[O_PTR1]])
-// CHECK: AssignOrigin (DestID: [[O_PTR2]], SrcID: [[O_PTR1_RVAL_2]])
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR1_RVAL_2:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_PTR1]] (Decl: ptr1))
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR2]] (Decl: ptr2), Src: Origin 
[[O_PTR1_RVAL_2]] (Expr: ImplicitCastExpr))
   ptr2 = ptr2; // Self assignment.
-// CHECK: AssignOrigin (DestID: [[O_PTR2_RVAL:[0-9]+]], SrcID: [[O_PTR2]])
-// CHECK: AssignOrigin (DestID: [[O_PTR2]], SrcID: [[O_PTR2_RVAL]])
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR2_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_PTR2]] (Decl: ptr2))
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR2]] (Decl: ptr2), Src: Origin 
[[O_PTR2_RVAL]] (Expr: ImplicitCastExpr))
   return ptr2;
-// CHECK: AssignOrigin (DestID: [[O_PTR2_RVAL_2:[0-9]+]], SrcID: [[O_PTR2]])
-// CHECK: ReturnOfOrigin (OriginID: [[O_PTR2_RVAL_2]])
+// CHECK: AssignOrigin (Dest: Origin [[O_PTR2_RVAL_2:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_PTR2]] (Decl: ptr2))
+// CHECK: ReturnOfOrigin (Origin: Origin [[O_PTR2_RVAL_2]] (Expr: 
ImplicitCastExpr))
 // CHECK: Expire (LoanID: [[L_Y]])
 }
 
@@ -60,8 +60,8 @@ int return_int_val() {
 void loan_expires_cpp() {
   MyObj obj{1};
   MyObj* pObj = &obj;
-// CHECK: Issue (LoanID: [[L_OBJ:[0-9]+]], OriginID: [[O_ADDR_OBJ:[0-9]+]])
-// CHECK: AssignOrigin (DestID: [[O_POBJ:[0-9]+]], SrcID: [[O_ADDR_OBJ]])
+// CHECK: Issue (LoanID: [[L_OBJ:[0-9]+]], Origin [[O_ADDR_OBJ:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK: AssignOrigin (Dest: Origin [[O_POBJ:[0-9]+]] (Decl: pObj), Src: 
Origin [[O_ADDR_OBJ]] (Expr: UnaryOperator))
 // CHECK: Expire (LoanID: [[L_OBJ]])
 }
 
@@ -72,8 +72,8 @@ void loan_expires_cpp() {
 void loan_expires_trivial() {
   int trivial_obj = 1;
   int* pTrivialObj = &trivial_obj;
-// CHECK: Issue (LoanID: [[L_TRIVIAL_OBJ:[0-9]+]], OriginID: 
[[O_ADDR_TRIVIAL_OBJ:[0-9]+]])
-// CHECK: AssignOrigin (DestID: [[O_PTOBJ:[0-9]+]], SrcID: 
[[O_ADDR_TRIVIAL_OBJ]])
+// CHECK: Issue (LoanID: [[L_TRIVIAL_OBJ:[0-9]+]], Origin 
[[O_ADDR_TRIVIAL_OBJ:[0-9]+]] (Expr: UnaryOperator))
+// CHECK: AssignOrigin (Dest: Origin [[O_PTOBJ:[0-9]+]] (Decl: pTrivialObj), 
Src: Origin [[O_ADDR_TRIVIAL_OBJ]] (Expr: UnaryOperator))
 // CHECK-NOT: Expire (LoanID: [[L_TRIVIAL_OBJ]])
 // CHECK-NEXT: End of Block
   // FIXME: Add check for Expire once trivial destructors are handled for 
expiration.
@@ -84,18 +84,19 @@ void conditional(bool condition) {
   int a = 5;
   int b = 10;
   int* p = nullptr;
-
+// CHECK: AssignOrigin (Dest: Origin {{[0-9]+}} (Expr: ImplicitCastExpr), Src: 
Origin {{[0-9]+}} (Expr: CXXNullPtrLiteralExpr))
+// CHECK: AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
{{[0-9]+}} (Expr: ImplicitCastExpr))
   if (condition)
     p = &a;
-  // CHECK: Issue (LoanID: [[L_A:[0-9]+]], OriginID: [[O_ADDR_A:[0-9]+]])
-  // CHECK: AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_A]])
+// CHECK: Issue (LoanID: [[L_A:[0-9]+]], Origin [[O_ADDR_A:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK: AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_A]] (Expr: UnaryOperator))
   else
     p = &b;
-  // CHECK: Issue (LoanID: [[L_B:[0-9]+]], OriginID: [[O_ADDR_B:[0-9]+]])
-  // CHECK: AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_B]])
+// CHECK: Issue (LoanID: [[L_B:[0-9]+]], Origin [[O_ADDR_B:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK: AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_B]] (Expr: UnaryOperator))
   int *q = p;
-  // CHECK: AssignOrigin (DestID: [[O_P_RVAL:[0-9]+]], SrcID: [[O_P]])
-  // CHECK: AssignOrigin (DestID: [[O_Q:[0-9]+]], SrcID: [[O_P_RVAL]])
+// CHECK: AssignOrigin (Dest: Origin [[O_P_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_P]] (Decl: p))
+// CHECK: AssignOrigin (Dest: Origin [[O_Q:[0-9]+]] (Decl: q), Src: Origin 
[[O_P_RVAL]] (Expr: ImplicitCastExpr))
 }
 
 
@@ -109,12 +110,12 @@ void pointers_in_a_cycle(bool condition) {
   MyObj* p2 = &v2;
   MyObj* p3 = &v3;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_V1:[0-9]+]], OriginID: [[O_ADDR_V1:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P1:[0-9]+]], SrcID: [[O_ADDR_V1]])
-// CHECK:   Issue (LoanID: [[L_V2:[0-9]+]], OriginID: [[O_ADDR_V2:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P2:[0-9]+]], SrcID: [[O_ADDR_V2]])
-// CHECK:   Issue (LoanID: [[L_V3:[0-9]+]], OriginID: [[O_ADDR_V3:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P3:[0-9]+]], SrcID: [[O_ADDR_V3]])
+// CHECK:   Issue (LoanID: [[L_V1:[0-9]+]], Origin [[O_ADDR_V1:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P1:[0-9]+]] (Decl: p1), Src: Origin 
[[O_ADDR_V1]] (Expr: UnaryOperator))
+// CHECK:   Issue (LoanID: [[L_V2:[0-9]+]], Origin [[O_ADDR_V2:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P2:[0-9]+]] (Decl: p2), Src: Origin 
[[O_ADDR_V2]] (Expr: UnaryOperator))
+// CHECK:   Issue (LoanID: [[L_V3:[0-9]+]], Origin [[O_ADDR_V3:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P3:[0-9]+]] (Decl: p3), Src: Origin 
[[O_ADDR_V3]] (Expr: UnaryOperator))
 
   while (condition) {
     MyObj* temp = p1;
@@ -122,14 +123,14 @@ void pointers_in_a_cycle(bool condition) {
     p2 = p3;
     p3 = temp;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   AssignOrigin (DestID: [[O_P1_RVAL:[0-9]+]], SrcID: [[O_P1]])
-// CHECK:   AssignOrigin (DestID: [[O_TEMP:[0-9]+]], SrcID: [[O_P1_RVAL]])
-// CHECK:   AssignOrigin (DestID: [[O_P2_RVAL:[0-9]+]], SrcID: [[O_P2]])
-// CHECK:   AssignOrigin (DestID: [[O_P1]], SrcID: [[O_P2_RVAL]])
-// CHECK:   AssignOrigin (DestID: [[O_P3_RVAL:[0-9]+]], SrcID: [[O_P3]])
-// CHECK:   AssignOrigin (DestID: [[O_P2]], SrcID: [[O_P3_RVAL]])
-// CHECK:   AssignOrigin (DestID: [[O_TEMP_RVAL:[0-9]+]], SrcID: [[O_TEMP]])
-// CHECK:   AssignOrigin (DestID: [[O_P3]], SrcID: [[O_TEMP_RVAL]])
+// CHECK:   AssignOrigin (Dest: Origin [[O_P1_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_P1]] (Decl: p1))
+// CHECK:   AssignOrigin (Dest: Origin [[O_TEMP:[0-9]+]] (Decl: temp), Src: 
Origin [[O_P1_RVAL]] (Expr: ImplicitCastExpr))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P2_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_P2]] (Decl: p2))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P1]] (Decl: p1), Src: Origin 
[[O_P2_RVAL]] (Expr: ImplicitCastExpr))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P3_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_P3]] (Decl: p3))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P2]] (Decl: p2), Src: Origin 
[[O_P3_RVAL]] (Expr: ImplicitCastExpr))
+// CHECK:   AssignOrigin (Dest: Origin [[O_TEMP_RVAL:[0-9]+]] (Expr: 
ImplicitCastExpr), Src: Origin [[O_TEMP]] (Decl: temp))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P3]] (Decl: p3), Src: Origin 
[[O_TEMP_RVAL]] (Expr: ImplicitCastExpr))
   }
 }
 
@@ -139,11 +140,11 @@ void overwrite_origin() {
   MyObj s2;
   MyObj* p = &s1;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], OriginID: [[O_ADDR_S1:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_S1]])
+// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], Origin [[O_ADDR_S1:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
[[O_ADDR_S1]] (Expr: UnaryOperator))
   p = &s2;
-// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], OriginID: [[O_ADDR_S2:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_S2]])
+// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], Origin [[O_ADDR_S2:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_S2]] (Expr: UnaryOperator))
 // CHECK:   Expire (LoanID: [[L_S2]])
 // CHECK:   Expire (LoanID: [[L_S1]])
 }
@@ -153,13 +154,14 @@ void reassign_to_null() {
   MyObj s1;
   MyObj* p = &s1;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], OriginID: [[O_ADDR_S1:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_S1]])
+// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], Origin [[O_ADDR_S1:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
[[O_ADDR_S1]] (Expr: UnaryOperator))
   p = nullptr;
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_NULLPTR:[0-9]+]])
+// CHECK:   AssignOrigin (Dest: Origin {{[0-9]+}} (Expr: ImplicitCastExpr), 
Src: Origin [[O_NULLPTR:[0-9]+]] (Expr: CXXNullPtrLiteralExpr))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
{{[0-9]+}} (Expr: ImplicitCastExpr))
 // CHECK:   Expire (LoanID: [[L_S1]])
 }
-// FIXME: Have a better representation for nullptr than just an empty origin. 
+// FIXME: Have a better representation for nullptr than just an empty origin.
 //        It should be a separate loan and origin kind.
 
 
@@ -169,13 +171,13 @@ void reassign_in_if(bool condition) {
   MyObj s2;
   MyObj* p = &s1;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], OriginID: [[O_ADDR_S1:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_S1]])
+// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], Origin [[O_ADDR_S1:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
[[O_ADDR_S1]] (Expr: UnaryOperator))
   if (condition) {
     p = &s2;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], OriginID: [[O_ADDR_S2:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_S2]])
+// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], Origin [[O_ADDR_S2:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_S2]] (Expr: UnaryOperator))
   }
 // CHECK: Block B{{[0-9]+}}:
 // CHECK:   Expire (LoanID: [[L_S2]])
@@ -190,26 +192,26 @@ void assign_in_switch(int mode) {
   MyObj s3;
   MyObj* p = nullptr;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   AssignOrigin (DestID: [[O_NULLPTR_CAST:[0-9]+]], SrcID: 
[[O_NULLPTR:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_NULLPTR_CAST]])
+// CHECK:   AssignOrigin (Dest: Origin {{[0-9]+}} (Expr: ImplicitCastExpr), 
Src: Origin [[O_NULLPTR:[0-9]+]] (Expr: CXXNullPtrLiteralExpr))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
{{[0-9]+}} (Expr: ImplicitCastExpr))
   switch (mode) {
     case 1:
       p = &s1;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], OriginID: [[O_ADDR_S1:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_S1]])
+// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], Origin [[O_ADDR_S1:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_S1]] (Expr: UnaryOperator))
       break;
     case 2:
       p = &s2;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], OriginID: [[O_ADDR_S2:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_S2]])
+// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], Origin [[O_ADDR_S2:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_S2]] (Expr: UnaryOperator))
       break;
     default:
       p = &s3;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S3:[0-9]+]], OriginID: [[O_ADDR_S3:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_S3]])
+// CHECK:   Issue (LoanID: [[L_S3:[0-9]+]], Origin [[O_ADDR_S3:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_S3]] (Expr: UnaryOperator))
       break;
   }
 // CHECK: Block B{{[0-9]+}}:
@@ -221,14 +223,14 @@ void assign_in_switch(int mode) {
 // CHECK-LABEL: Function: loan_in_loop
 void loan_in_loop(bool condition) {
   MyObj* p = nullptr;
-  // CHECK:   AssignOrigin (DestID: [[O_NULLPTR_CAST:[0-9]+]], SrcID: 
[[O_NULLPTR:[0-9]+]])
-  // CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_NULLPTR_CAST]])
+  // CHECK:   AssignOrigin (Dest: Origin {{[0-9]+}} (Expr: ImplicitCastExpr), 
Src: Origin [[O_NULLPTR:[0-9]+]] (Expr: CXXNullPtrLiteralExpr))
+  // CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
{{[0-9]+}} (Expr: ImplicitCastExpr))
   while (condition) {
     MyObj inner;
     p = &inner;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_INNER:[0-9]+]], OriginID: 
[[O_ADDR_INNER:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_INNER]])
+// CHECK:   Issue (LoanID: [[L_INNER:[0-9]+]], Origin [[O_ADDR_INNER:[0-9]+]] 
(Expr: UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_INNER]] (Expr: UnaryOperator))
 // CHECK:   Expire (LoanID: [[L_INNER]])
   }
 }
@@ -239,18 +241,18 @@ void loop_with_break(int count) {
   MyObj s2;
   MyObj* p = &s1;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], OriginID: [[O_ADDR_S1:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_S1]])
+// CHECK:   Issue (LoanID: [[L_S1:[0-9]+]], Origin [[O_ADDR_S1:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
[[O_ADDR_S1]] (Expr: UnaryOperator))
   for (int i = 0; i < count; ++i) {
     if (i == 5) {
       p = &s2;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], OriginID: [[O_ADDR_S2:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_S2]])
+// CHECK:   Issue (LoanID: [[L_S2:[0-9]+]], Origin [[O_ADDR_S2:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_S2]] (Expr: UnaryOperator))
       break;
     }
   }
-// CHECK: Block B{{[0-9]+}}:
+// CHECK: Block B{{[0-g]+}}:
 // CHECK:   Expire (LoanID: [[L_S2]])
 // CHECK:   Expire (LoanID: [[L_S1]])
 }
@@ -259,18 +261,18 @@ void loop_with_break(int count) {
 void nested_scopes() {
   MyObj* p = nullptr;
 // CHECK: Block B{{[0-9]+}}:
-// CHECK:   AssignOrigin (DestID: [[O_NULLPTR_CAST:[0-9]+]], SrcID: 
[[O_NULLPTR:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_NULLPTR_CAST]])
+// CHECK:   AssignOrigin (Dest: Origin {{[0-9]+}} (Expr: ImplicitCastExpr), 
Src: Origin [[O_NULLPTR:[0-9]+]] (Expr: CXXNullPtrLiteralExpr))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
{{[0-9]+}} (Expr: ImplicitCastExpr))
   {
     MyObj outer;
     p = &outer;
-// CHECK:   Issue (LoanID: [[L_OUTER:[0-9]+]], OriginID: 
[[O_ADDR_OUTER:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_OUTER]])
+// CHECK:   Issue (LoanID: [[L_OUTER:[0-9]+]], Origin [[O_ADDR_OUTER:[0-9]+]] 
(Expr: UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_OUTER]] (Expr: UnaryOperator))
     {
       MyObj inner;
       p = &inner;
-// CHECK:   Issue (LoanID: [[L_INNER:[0-9]+]], OriginID: 
[[O_ADDR_INNER:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P]], SrcID: [[O_ADDR_INNER]])
+// CHECK:   Issue (LoanID: [[L_INNER:[0-9]+]], Origin [[O_ADDR_INNER:[0-9]+]] 
(Expr: UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P]] (Decl: p), Src: Origin 
[[O_ADDR_INNER]] (Expr: UnaryOperator))
     }
 // CHECK:   Expire (LoanID: [[L_INNER]])
   }
@@ -282,13 +284,13 @@ void pointer_indirection() {
   int a;
   int *p = &a;
 // CHECK: Block B1:
-// CHECK:   Issue (LoanID: [[L_A:[0-9]+]], OriginID: [[O_ADDR_A:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_P:[0-9]+]], SrcID: [[O_ADDR_A]])
+// CHECK:   Issue (LoanID: [[L_A:[0-9]+]], Origin [[O_ADDR_A:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_P:[0-9]+]] (Decl: p), Src: Origin 
[[O_ADDR_A]] (Expr: UnaryOperator))
   int **pp = &p;
-// CHECK:   Issue (LoanID: [[L_P:[0-9]+]], OriginID: [[O_ADDR_P:[0-9]+]])
-// CHECK:   AssignOrigin (DestID: [[O_PP:[0-9]+]], SrcID: [[O_ADDR_P]])
+// CHECK:   Issue (LoanID: [[L_P:[0-9]+]], Origin [[O_ADDR_P:[0-9]+]] (Expr: 
UnaryOperator))
+// CHECK:   AssignOrigin (Dest: Origin [[O_PP:[0-9]+]] (Decl: pp), Src: Origin 
[[O_ADDR_P]] (Expr: UnaryOperator))
 
 // FIXME: The Origin for the RHS is broken
   int *q = *pp;
-// CHECK:   AssignOrigin (DestID: [[O_Q:[0-9]+]], SrcID: {{[0-9]+}})
+// CHECK:   AssignOrigin (Dest: Origin {{[0-9]+}} (Expr: ImplicitCastExpr), 
Src: Origin {{[0-9]+}} (Expr: UnaryOperator))
 }

_______________________________________________
llvm-branch-commits mailing list
llvm-branch-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-branch-commits

Reply via email to