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