Skip to content

Commit 021e571

Browse files
committed
---
yaml --- r: 11844 b: refs/heads/master c: 1e0e089 h: refs/heads/master v: v3
1 parent 2325ec8 commit 021e571

File tree

4 files changed

+9
-8
lines changed

4 files changed

+9
-8
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: b516913a5d46dc32d47b7846bb510fc029e660b3
2+
refs/heads/master: 1e0e089185226217a71f50684c11c2e129f12c2e
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
55
refs/heads/try: 2898dcc5d97da9427ac367542382b6239d9c0bbf

trunk/src/rustc/middle/region.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -254,12 +254,12 @@ fn resolve_expr(expr: @ast::expr, cx: ctxt, visitor: visit::vt<ctxt>) {
254254
}
255255
visit::visit_expr(expr, cx, visitor);
256256
}
257-
ast::expr_addr_of(_, _) | ast::expr_alt(_, _, _) {
257+
ast::expr_addr_of(_, subexpr) | ast::expr_alt(subexpr, _, _) {
258258
// Record the block that this expression appears in, in case the
259259
// operand is an rvalue.
260260
alt cx.parent {
261261
pa_block(blk_id) {
262-
cx.region_map.rvalue_to_block.insert(expr.id, blk_id);
262+
cx.region_map.rvalue_to_block.insert(subexpr.id, blk_id);
263263
}
264264
_ { cx.sess.span_bug(expr.span, "expr outside of block?!"); }
265265
}

trunk/src/rustc/middle/trans/base.rs

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1649,11 +1649,12 @@ fn trans_unary(bcx: block, op: ast::unop, e: @ast::expr,
16491649
}
16501650

16511651
fn trans_addr_of(cx: block, e: @ast::expr, dest: dest) -> block {
1652-
// FIXME: This is wrong.
16531652
let {bcx, val, kind} = trans_temp_lval(cx, e);
1654-
if kind != owned {
1655-
bcx.sess().span_bug(e.span,
1656-
"can't take the address of an rvalue");
1653+
let ety = expr_ty(cx, e);
1654+
let is_immediate = ty::type_is_immediate(ety);
1655+
if (kind == temporary && is_immediate) || kind == owned_imm {
1656+
let {bcx: bcx2, val: val2} = do_spill(cx, val, ety);
1657+
bcx = bcx2; val = val2;
16571658
}
16581659
ret store_in_dest(bcx, val, dest);
16591660
}

trunk/src/rustc/middle/typeck.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2492,7 +2492,7 @@ fn check_expr_with_unifier(fcx: @fn_ctxt, expr: @ast::expr, unify: unifier,
24922492
ast::expr_alt(discrim, arms, _) {
24932493
bot = check_expr(fcx, discrim);
24942494

2495-
let parent_block = tcx.region_map.rvalue_to_block.get(expr.id);
2495+
let parent_block = tcx.region_map.rvalue_to_block.get(discrim.id);
24962496

24972497
// Typecheck the patterns first, so that we get types for all the
24982498
// bindings.

0 commit comments

Comments
 (0)