Skip to content

Commit d4bf67d

Browse files
committed
Translate record extension.
1 parent 370c1ad commit d4bf67d

File tree

2 files changed

+37
-8
lines changed

2 files changed

+37
-8
lines changed

src/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,7 @@ TEST_XFAILS_RUSTC := $(filter-out \
519519
readalias.rs \
520520
rec.rs \
521521
rec-auto.rs \
522+
rec-extend.rs \
522523
rec-tup.rs \
523524
return-nil.rs \
524525
simple-obj.rs \

src/comp/middle/trans.rs

+36-8
Original file line numberDiff line numberDiff line change
@@ -2998,9 +2998,6 @@ fn trans_vec(@block_ctxt cx, vec[@ast.expr] args,
29982998
fn trans_rec(@block_ctxt cx, vec[ast.field] fields,
29992999
option.t[@ast.expr] base, &ast.ann ann) -> result {
30003000

3001-
// FIXME: handle presence of a nonempty base.
3002-
check (base == none[@ast.expr]);
3003-
30043001
auto bcx = cx;
30053002
auto t = node_ann_type(bcx.fcx.ccx, ann);
30063003
auto llty = type_of(bcx.fcx.ccx, t);
@@ -3011,13 +3008,44 @@ fn trans_rec(@block_ctxt cx, vec[ast.field] fields,
30113008
find_scope_cx(cx).cleanups += clean(bind drop_ty(_, rec_val, t));
30123009
let int i = 0;
30133010

3014-
for (ast.field f in fields) {
3015-
auto e_ty = ty.expr_ty(f.expr);
3016-
auto src_res = trans_expr(bcx, f.expr);
3017-
bcx = src_res.bcx;
3011+
auto base_val = C_nil();
3012+
3013+
alt (base) {
3014+
case (none[@ast.expr]) { }
3015+
case (some[@ast.expr](?bexp)) {
3016+
auto base_res = trans_expr(bcx, bexp);
3017+
bcx = base_res.bcx;
3018+
base_val = base_res.val;
3019+
}
3020+
}
3021+
3022+
let vec[ty.field] ty_fields = vec();
3023+
alt (t.struct) {
3024+
case (ty.ty_rec(?flds)) { ty_fields = flds; }
3025+
}
3026+
3027+
for (ty.field tf in ty_fields) {
3028+
auto e_ty = tf.ty;
30183029
auto dst_res = GEP_tup_like(bcx, t, rec_val, vec(0, i));
30193030
bcx = dst_res.bcx;
3020-
bcx = copy_ty(src_res.bcx, INIT, dst_res.val, src_res.val, e_ty).bcx;
3031+
3032+
auto expr_provided = false;
3033+
auto src_res = res(bcx, C_nil());
3034+
3035+
for (ast.field f in fields) {
3036+
if (_str.eq(f.ident, tf.ident)) {
3037+
expr_provided = true;
3038+
src_res = trans_expr(bcx, f.expr);
3039+
}
3040+
}
3041+
if (!expr_provided) {
3042+
src_res = GEP_tup_like(bcx, t, base_val, vec(0, i));
3043+
src_res = res(src_res.bcx,
3044+
load_scalar_or_boxed(bcx, src_res.val, e_ty));
3045+
}
3046+
3047+
bcx = src_res.bcx;
3048+
bcx = copy_ty(bcx, INIT, dst_res.val, src_res.val, e_ty).bcx;
30213049
i += 1;
30223050
}
30233051
ret res(bcx, rec_val);

0 commit comments

Comments
 (0)