blob: 89f233ef494850ecda3005a237b843629b9c7167 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
// expect: a drop1 b drop2 3 drop3 drop10 drop11 12 t:7 t:8 9 t:9 drop12
// destructors 6.8.5, 6.15.2: reassigning an owner that still holds a value frees the old value first, running its drop; the right side is computed before the free
include rt;
struct t { int v; void drop() { rt.put_s("t:"); rt.put_n(this.v); rt.put_s(" "); } }
int* mk(int v) { return drop(heap(v), fn() { rt.put_s("drop"); rt.put_n(*this); rt.put_s(" "); }); }
fn main() {
int* p = heap(1);
p.drop = fn() { rt.put_s("drop"); rt.put_n(*this); rt.put_s(" "); };
rt.put_s("a ");
p = heap(2);
p.drop = fn() { rt.put_s("drop"); rt.put_n(*this); rt.put_s(" "); };
rt.put_s("b ");
p = mk(*p + 1);
rt.put_n(*p); rt.put_s(" ");
int i = 10;
while (i < 13) { p = mk(i); i++; }
rt.put_n(*p); rt.put_s(" ");
t* s = rt.new(t); s.v = 7;
s = rt.new(t); s.v = 8;
t* u = rt.new(t); u.v = 9;
s = u;
rt.put_n(s.v); rt.put_s(" ");
return 0;
}
// zc0: skip
|