diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 468923ef79b5..928ae327f9bf 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -2403,7 +2403,7 @@ fn drop_slot(cx: &@block_ctxt, slot: ValueRef, t: &ty::t) -> result { } fn drop_ty(cx: &@block_ctxt, v: ValueRef, t: ty::t) -> result { - if ty::type_has_pointers(bcx_tcx(cx), t) { + if ty::type_needs_drop(bcx_tcx(cx), t) { ret call_tydesc_glue(cx, v, t, abi::tydesc_field_drop_glue); } ret rslt(cx, C_nil()); diff --git a/src/comp/middle/ty.rs b/src/comp/middle/ty.rs index 4e75c730cfb5..a3b043820d6a 100644 --- a/src/comp/middle/ty.rs +++ b/src/comp/middle/ty.rs @@ -157,6 +157,7 @@ export type_err; export type_err_to_str; export type_has_dynamic_size; export type_has_pointers; +export type_needs_drop; export type_is_bool; export type_is_bot; export type_is_box; @@ -1022,6 +1023,13 @@ fn type_has_pointers(cx: &ctxt, ty: &t) -> bool { ret result; } +fn type_needs_drop(cx: &ctxt, ty: &t) -> bool { + ret alt struct(cx, ty) { + ty_res(_, _, _) { true } + _ { type_has_pointers(cx, ty) } + }; +} + fn type_kind(cx: &ctxt, ty: &t) -> ast::kind { alt cx.kind_cache.find(ty) { some(result) { ret result; }