[clang] [LifetimeSafety][NFC] Refactor OriginList to OriginNode tree (PR #194797)

Zhijie Wang via cfe-commits cfe-commits at lists.llvm.org
Wed Apr 29 10:58:29 PDT 2026


================
@@ -92,30 +92,42 @@ struct Origin {
 ///
 /// The list structure enables the analysis to track how loans flow through
 /// different levels of indirection when assignments and dereferences occur.
-class OriginList {
+///
+/// TODO: Currently list-shaped (each node has at most one pointee child).
+/// Will become tree-shaped once field children are added to support
+/// origin trees for records whose fields have origins.
+class OriginNode {
 public:
-  OriginList(OriginID OID) : OuterOID(OID) {}
+  OriginNode(OriginID OID) : OID(OID) {}
 
-  OriginList *peelOuterOrigin() const { return InnerList; }
-  OriginID getOuterOriginID() const { return OuterOID; }
+  OriginNode *getPointeeChild() const {
+    return NumChildren ? Children[0] : nullptr;
+  }
 
-  void setInnerOriginList(OriginList *Inner) { InnerList = Inner; }
+  OriginID getOriginID() const { return OID; }
 
-  // Used for assertion checks only (to ensure origin lists have matching
+  void setChildren(OriginNode **Arr, unsigned N) {
+    assert(Children == nullptr && "children must be set at most once");
+    Children = Arr;
+    NumChildren = N;
+  }
+
+  // Used for assertion checks only (to ensure pointee chains have matching
   // lengths).
   size_t getLength() const {
     size_t Length = 1;
-    const OriginList *T = this;
-    while (T->InnerList) {
-      T = T->InnerList;
+    const OriginNode *T = this;
+    while (auto *ON = T->getPointeeChild()) {
+      T = ON;
       Length++;
     }
     return Length;
   }
 
 private:
-  OriginID OuterOID;
-  OriginList *InnerList = nullptr;
+  OriginID OID;
+  OriginNode **Children = nullptr;
----------------
aeft wrote:

Done

https://github.com/llvm/llvm-project/pull/194797


More information about the cfe-commits mailing list