about summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-07-29 12:53:58 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-07-29 12:53:58 +0200
commitae46c154f09deb57018579bb00fa3fcac9a93770 (patch)
treed61ab2db40befe48094fd279e39921e852c79fcd /src/comp
parent0ba34d873dec9853a22f07bf49a136c1695772b0 (diff)
downloadrust-ae46c154f09deb57018579bb00fa3fcac9a93770.tar.gz
rust-ae46c154f09deb57018579bb00fa3fcac9a93770.zip
Make sure resources always have their drop glue called
Even when their content does not contain pointers
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs2
-rw-r--r--src/comp/middle/ty.rs8
2 files changed, 9 insertions, 1 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 468923ef79b..928ae327f9b 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 4e75c730cfb..a3b043820d6 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; }