aboutsummaryrefslogtreecommitdiff
path: root/tests/conformance/6-ownership/drop_reassign.zc
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