From a0fa0994695475bd50bae75291f9e7b222bae72a Mon Sep 17 00:00:00 2001 From: Marijn Haverbeke Date: Wed, 18 Apr 2012 13:15:02 +0200 Subject: [PATCH] Add a needs_drop intrinsic Closes #2055 --- src/rustc/middle/trans/native.rs | 4 ++++ src/rustc/middle/trans/type_use.rs | 2 +- src/rustc/middle/typeck.rs | 1 + 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/rustc/middle/trans/native.rs b/src/rustc/middle/trans/native.rs index 5f98915b3c7..d0995befe76 100644 --- a/src/rustc/middle/trans/native.rs +++ b/src/rustc/middle/trans/native.rs @@ -801,6 +801,10 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::native_item, "addr_of" { Store(bcx, get_param(decl, first_real_arg), fcx.llretptr); } + "needs_drop" { + Store(bcx, C_bool(ty::type_needs_drop(ccx.tcx, tp_ty)), + fcx.llretptr); + } } build_return(bcx); finish_fn(fcx, lltop); diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs index 4b993f8224c..232a8cda48f 100644 --- a/src/rustc/middle/trans/type_use.rs +++ b/src/rustc/middle/trans/type_use.rs @@ -78,7 +78,7 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint) let flags = alt check i.ident { "size_of" | "align_of" | "init" | "reinterpret_cast" { use_repr } - "get_tydesc" { use_tydesc } + "get_tydesc" | "needs_drop" { use_tydesc } "forget" | "addr_of" { 0u } }; uint::range(0u, n_tps) {|n| cx.uses[n] |= flags;} diff --git a/src/rustc/middle/typeck.rs b/src/rustc/middle/typeck.rs index 03410694283..bb01c879e0a 100644 --- a/src/rustc/middle/typeck.rs +++ b/src/rustc/middle/typeck.rs @@ -1899,6 +1899,7 @@ fn check_intrinsic_type(ccx: @crate_ctxt, it: @ast::native_item) { param(ccx, 1u)) } "addr_of" { (1u, [arg(ast::by_ref, param(ccx, 0u))], ty::mk_imm_ptr(tcx, param(ccx, 0u))) } + "needs_drop" { (1u, [], ty::mk_bool(tcx)) } other { tcx.sess.span_err(it.span, "unrecognized intrinsic function: `" + other + "`");