aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-12-02 19:12:09 -0800
committerGraydon Hoare <[email protected]>2010-12-02 19:12:09 -0800
commit1e9c8b923d78e6169d1d99bfccf675a10f904a76 (patch)
tree506db450e954dad3a600a68972c4c60cc261dfdd
parentChange order of basic blocks in copy_ty, makes nicer disassembly. (diff)
downloadrust-1e9c8b923d78e6169d1d99bfccf675a10f904a76.tar.xz
rust-1e9c8b923d78e6169d1d99bfccf675a10f904a76.zip
Implement translation for deref unop.
-rw-r--r--src/comp/middle/trans.rs12
1 files changed, 10 insertions, 2 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 58d700e5..647aa806 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -867,8 +867,16 @@ impure fn trans_unary(@block_ctxt cx, ast.unop op,
sub = copy_ty(sub.bcx, true, body, e_val, e_ty);
ret res(sub.bcx, box);
}
- case (_) {
- cx.fcx.ccx.sess.unimpl("expr variant in trans_unary");
+ case (ast.deref) {
+ sub.val = sub.bcx.build.GEP(sub.val,
+ vec(C_int(0),
+ C_int(abi.box_rc_field_body)));
+ auto e_ty = node_ann_type(sub.bcx.fcx.ccx, a);
+ if (typeck.type_is_scalar(e_ty) ||
+ typeck.type_is_nil(e_ty)) {
+ sub.val = sub.bcx.build.Load(sub.val);
+ }
+ ret sub;
}
}
fail;