module 0x1::PackUnpack { struct S has drop { a1: address, t: T, i: u64 } struct T has drop { a2: address, b: bool } struct Glob has key { b: bool } fun read_unpacked_addr(s: S): address { let S { a1, t: T { a2, b }, i: _ } = s; if (b) { a1 } else { a2 } } // ret |-> { Formal(0)/a1, Formal(0)/t/a2 } fun pack_then_read(a2: address): address { let t = T { a2, b: false }; *&t.a2 } // ret |-> Formal(0) fun read_unpacked_borrow_glob(s: S): bool acquires Glob { let S { a1, t: _, i: _ } = s; *&borrow_global(a1).b } // ret |-> Formal(0)/a1/Glob/b fun read_packed_borrow_glob(a2: address): bool acquires Glob { let t = T { a2, b: false }; *&borrow_global(*&t.a2).b } // ret |-> Formal(0)/Glob/b fun reassign_packed_addr(a2: address): address { let t = T { a2: @0x7, b: false }; _ = t; t = T { a2, b: false }; *&t.a2 } // ret |-> Formal(0) fun use_results(_: u64, a: address): address { let a1 = pack_then_read(a); let s = S { a1, t: T { a2: @0x7, b: true }, i: 10 }; read_unpacked_addr(s) } // ret |-> { Formal(1), @0x7 } }