Skip to content

Commit 2ca1aef

Browse files
committed
---
yaml --- r: 45019 b: refs/heads/master c: 3a4714d h: refs/heads/master i: 45017: 3e6636f 45015: 92cfc01 v: v3
1 parent d827ce0 commit 2ca1aef

File tree

3 files changed

+18
-15
lines changed

3 files changed

+18
-15
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: 40313fb6b0104f703c06b2dd46198ad1f15d267b
2+
refs/heads/master: 3a4714d92e49564c1cfc86fae5573510de7c2e31
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: a6d9689399d091c3265f00434a69c551a61c28dc
55
refs/heads/try: ef355f6332f83371e4acf04fc4eb940ab41d78d3

trunk/src/librustc/middle/trans/datum.rs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -511,14 +511,13 @@ pub impl Datum {
511511
}
512512
}
513513

514-
fn GEPi(&self, bcx: block,
515-
ixs: &[uint],
516-
ty: ty::t,
517-
source: DatumCleanup)
518-
-> Datum {
514+
fn get_element(&self, bcx: block,
515+
ty: ty::t,
516+
source: DatumCleanup,
517+
gep: fn(ValueRef) -> ValueRef) -> Datum {
519518
let base_val = self.to_ref_llval(bcx);
520519
Datum {
521-
val: GEPi(bcx, base_val, ixs),
520+
val: gep(base_val),
522521
mode: ByRef,
523522
ty: ty,
524523
source: source

trunk/src/librustc/middle/trans/expr.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -884,13 +884,15 @@ fn trans_lvalue_unadjusted(bcx: block, expr: @ast::expr) -> DatumBlock {
884884
let _icx = bcx.insn_ctxt("trans_rec_field");
885885

886886
let base_datum = unpack_datum!(bcx, trans_to_datum(bcx, base));
887-
do with_field_tys(bcx.tcx(), base_datum.ty, None) |_disr, field_tys| {
887+
let repr = adt::represent_type(bcx.ccx(), base_datum.ty);
888+
do with_field_tys(bcx.tcx(), base_datum.ty, None) |discr, field_tys| {
888889
let ix = ty::field_idx_strict(bcx.tcx(), field, field_tys);
889890
DatumBlock {
890-
datum: base_datum.GEPi(bcx,
891-
[0u, 0u, ix],
892-
field_tys[ix].mt.ty,
893-
ZeroMem),
891+
datum: do base_datum.get_element(bcx,
892+
field_tys[ix].mt.ty,
893+
ZeroMem) |srcval| {
894+
adt::trans_GEP(bcx, &repr, srcval, discr, ix)
895+
},
894896
bcx: bcx
895897
}
896898
}
@@ -1227,11 +1229,13 @@ fn trans_adt(bcx: block, repr: &adt::Repr, discr: int,
12271229
temp_cleanups.push(dest);
12281230
}
12291231
for optbase.each |base| {
1232+
// XXX is it sound to use the destination's repr on the base?
1233+
// XXX would it ever be reasonable to be here with discr != 0?
12301234
let base_datum = unpack_datum!(bcx, trans_to_datum(bcx, base.expr));
12311235
for base.fields.each |&(i, t)| {
1232-
let datum =
1233-
// XXX convert this to adt
1234-
base_datum.GEPi(bcx, struct_field(i), t, ZeroMem);
1236+
let datum = do base_datum.get_element(bcx, t, ZeroMem) |srcval| {
1237+
adt::trans_GEP(bcx, repr, srcval, discr, i)
1238+
};
12351239
let dest = adt::trans_GEP(bcx, repr, addr, discr, i);
12361240
bcx = datum.store_to(bcx, base.expr.id, INIT, dest);
12371241
}

0 commit comments

Comments
 (0)