From bf92940f72bf4eb0e2881b275dc76772c93b8f47 Mon Sep 17 00:00:00 2001 From: Tim Chevalier Date: Sun, 24 Jun 2012 15:11:25 -0700 Subject: [PATCH] More test cases for classes with dtors Tests that classes with dtors and multiple fields work correctly. Closes #2708 --- src/test/run-pass/issue-2708.rs | 17 ++++++++++ src/test/run-pass/resource-cycle3.rs | 50 ++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) create mode 100644 src/test/run-pass/issue-2708.rs create mode 100644 src/test/run-pass/resource-cycle3.rs diff --git a/src/test/run-pass/issue-2708.rs b/src/test/run-pass/issue-2708.rs new file mode 100644 index 000000000000..8fcc613b09b7 --- /dev/null +++ b/src/test/run-pass/issue-2708.rs @@ -0,0 +1,17 @@ +class Font { + let fontbuf: uint; + let cairo_font: uint; + let font_dtor: uint; + + new() { + self.fontbuf = 0; + self.cairo_font = 0; + self.font_dtor = 0; + } + + drop { } +} + +fn main() { + let _f = @Font(); +} diff --git a/src/test/run-pass/resource-cycle3.rs b/src/test/run-pass/resource-cycle3.rs new file mode 100644 index 000000000000..f67e0b18ec29 --- /dev/null +++ b/src/test/run-pass/resource-cycle3.rs @@ -0,0 +1,50 @@ +// same as resource-cycle2, but be sure to give r multiple fields... + +// Don't leak the unique pointers + +type u = { + a: int, + b: int, + c: *int +}; + +class r { + let v: u; + let w: int; + let x: *int; + new(v: u, w: int, _x: *int) unsafe { self.v = v; self.w = w; + self.x = unsafe::reinterpret_cast(0); + /* self.x = x; */ } + drop unsafe { + let _v2: ~int = unsafe::reinterpret_cast(self.v.c); + // let _v3: ~int = unsafe::reinterpret_cast(self.x); + } +} + +enum t = { + mut next: option<@t>, + r: r +}; + +fn main() unsafe { + let i1 = ~0xA; + let i1p = unsafe::reinterpret_cast(i1); + unsafe::forget(i1); + let i2 = ~0xA; + let i2p = unsafe::reinterpret_cast(i2); + unsafe::forget(i2); + + let u1 = {a: 0xB, b: 0xC, c: i1p}; + let u2 = {a: 0xB, b: 0xC, c: i2p}; + + let x1 = @t({ + mut next: none, + r: r(u1, 42, i1p) + }); + let x2 = @t({ + mut next: none, + r: r(u2, 42, i2p) + }); + x1.next = some(x2); + x2.next = some(x1); +}