aboutsummaryrefslogtreecommitdiff
path: root/tests/conformance/6-ownership/drop_reused_address.zc
blob: 97ef21dde0e4ba11a4dc8efffe29b1353e13f7d0 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// expect: drop 1 same 1 1 0/
// destructors 9: a freed block's drop and its bits are cleared, so a block reused at the same address runs no old drop
include rt;
int n, first;
int addr(int* p) { return p as int; }
int clean(int* p) { unbounded { return (p[-4] & (rt.F_HASDROP | rt.F_DROPPED)) == 0; } }
// the drop is set in a helper, so main has no closure and its locals take no cells from the heap
int* .u armed() { int* p = rt.new(int); p.drop = fn() { n++; rt.put_s("drop "); }; return p; }
fn main() {
	{ int* p = armed(); *p = 1; first = addr(p); }
	rt.put_n(n); rt.put_c(32);
	{
		int* q = rt.new(int); *q = 2;
		if (addr(q) == first) rt.put_s("same "); else rt.put_s("moved ");
		rt.put_n(clean(q)); rt.put_c(32);
	}
	rt.put_n(n); rt.put_c(32);
	rt.put_n(rt.dcount);
	rt.put_c(10);
	return 0;
}
// zc0: skip