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
|