rustc: Fix type_need_unwind_cleanup. Closes #2272

This commit is contained in:
Brian Anderson 2012-04-24 14:16:50 -07:00
parent 5437a045fc
commit e7dbf42214
4 changed files with 18 additions and 11 deletions

View file

@ -1176,7 +1176,8 @@ fn type_needs_unwind_cleanup_(cx: ctxt, ty: t,
let mut encountered_box = encountered_box;
let mut needs_unwind_cleanup = false;
maybe_walk_ty(ty) {|ty|
alt get(ty).struct {
let old_encountered_box = encountered_box;
let result = alt get(ty).struct {
ty_box(_) | ty_opaque_box {
encountered_box = true;
true
@ -1216,7 +1217,10 @@ fn type_needs_unwind_cleanup_(cx: ctxt, ty: t,
needs_unwind_cleanup = true;
false
}
}
};
encountered_box = old_encountered_box;
result
}
ret needs_unwind_cleanup;

View file

@ -1,10 +1,3 @@
// xfail-test
/*
tjc: currently this results in a memory leak after a call to
span_fatal in typeck. I think it's the same issue as #2272, because
if I make type_needs_unwind_cleanup always return true, the test passes.
FIXME: Un-xfail this when #2272 is fixed.
*/
class cat implements int { //! ERROR can only implement interface types
let meows: uint;
new(in_x : uint) { self.meows = in_x; }

View file

@ -1,7 +1,5 @@
// error-pattern: overly deep expansion
// issue 2258
// This is currently exposing a memory leak, and xfailed for that reason
// xfail-test
iface to_opt {
fn to_option() -> option<self>;

View file

@ -0,0 +1,12 @@
// error-pattern:explicit failure
// Issue #2272 - unwind this without leaking the unique pointer
fn main() {
let _x = {
y: {
z: @0
},
a: ~0
};
fail;
}