diff options
| -rw-r--r-- | src/rustc/middle/trans/native.rs | 20 | ||||
| -rw-r--r-- | src/rustc/middle/trans/type_use.rs | 4 | ||||
| -rw-r--r-- | src/rustc/middle/typeck/check.rs | 6 | ||||
| -rw-r--r-- | src/test/run-pass/intrinsic-move-val.rs | 12 |
4 files changed, 41 insertions, 1 deletions
diff --git a/src/rustc/middle/trans/native.rs b/src/rustc/middle/trans/native.rs index ed15741e57b..28536282fad 100644 --- a/src/rustc/middle/trans/native.rs +++ b/src/rustc/middle/trans/native.rs @@ -812,6 +812,26 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::native_item, Store(bcx, C_uint(ccx, shape::llsize_of_real(ccx, lltp_ty)), fcx.llretptr); } + "move_val" { + let tp_ty = substs.tys[0]; + let src = {bcx: bcx, + val: get_param(decl, first_real_arg + 1u), + kind: owned }; + bcx = move_val(bcx, DROP_EXISTING, + get_param(decl, first_real_arg), + src, + tp_ty); + } + "move_val_init" { + let tp_ty = substs.tys[0]; + let src = {bcx: bcx, + val: get_param(decl, first_real_arg + 1u), + kind: owned }; + bcx = move_val(bcx, INIT, + get_param(decl, first_real_arg), + src, + tp_ty); + } "min_align_of" { let tp_ty = substs.tys[0]; let lltp_ty = type_of::type_of(ccx, tp_ty); diff --git a/src/rustc/middle/trans/type_use.rs b/src/rustc/middle/trans/type_use.rs index 315e3be2afd..03cd889e480 100644 --- a/src/rustc/middle/trans/type_use.rs +++ b/src/rustc/middle/trans/type_use.rs @@ -79,7 +79,9 @@ fn type_uses_for(ccx: @crate_ctxt, fn_id: def_id, n_tps: uint) let flags = alt check *i.ident { "visit_ty" { 3u } "size_of" | "pref_align_of" | "min_align_of" | - "init" | "reinterpret_cast" { use_repr } + "init" | "reinterpret_cast" | "move_val" | "move_val_init" { + use_repr + } "get_tydesc" | "needs_drop" { use_tydesc } "forget" | "addr_of" { 0u } }; diff --git a/src/rustc/middle/typeck/check.rs b/src/rustc/middle/typeck/check.rs index cc2fa54ea10..1957318095b 100644 --- a/src/rustc/middle/typeck/check.rs +++ b/src/rustc/middle/typeck/check.rs @@ -456,6 +456,7 @@ impl methods for @fn_ctxt { none { result::err("no block is in scope here") } } } + #[inline(always)] fn write_ty(node_id: ast::node_id, ty: ty::t) { #debug["write_ty(%d, %s) in fcx %s", node_id, ty_to_str(self.tcx(), ty), self.tag()]; @@ -2310,6 +2311,11 @@ 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))) } + "move_val" | "move_val_init" { + (1u, [arg(ast::by_mutbl_ref, param(ccx, 0u)), + arg(ast::by_move, param(ccx, 0u))], + ty::mk_nil(tcx)) + } "needs_drop" { (1u, [], ty::mk_bool(tcx)) } "visit_ty" { diff --git a/src/test/run-pass/intrinsic-move-val.rs b/src/test/run-pass/intrinsic-move-val.rs new file mode 100644 index 00000000000..e47aa36a777 --- /dev/null +++ b/src/test/run-pass/intrinsic-move-val.rs @@ -0,0 +1,12 @@ +#[abi = "rust-intrinsic"] +native mod rusti { + fn move_val_init<T>(&dst: T, -src: T); + fn move_val<T>(&dst: T, -src: T); +} + +fn main() { + let mut x = @1; + let mut y = @2; + rusti::move_val(y, x); + assert *y == 1; +} \ No newline at end of file |
