@@ -126,6 +126,7 @@ use lib;
126
126
use lib:: llvm:: { ValueRef , TypeRef , llvm, True } ;
127
127
use middle:: borrowck:: root_map_key;
128
128
use middle:: trans:: _match;
129
+ use middle:: trans:: adt;
129
130
use middle:: trans:: base;
130
131
use middle:: trans:: base:: * ;
131
132
use middle:: trans:: build:: * ;
@@ -602,7 +603,8 @@ fn trans_rvalue_dps_unadjusted(bcx: block, expr: @ast::expr,
602
603
return trans_rec_or_struct ( bcx, ( * fields) , base, expr. id , dest) ;
603
604
}
604
605
ast:: expr_tup( ref args) => {
605
- return trans_tup ( bcx, * args, dest) ;
606
+ let repr = adt:: represent_type ( bcx. ccx ( ) , expr_ty ( bcx, expr) ) ;
607
+ return trans_adt ( bcx, & repr, 0 , * args, dest) ;
606
608
}
607
609
ast:: expr_lit( @codemap:: spanned { node : ast:: lit_str( s) , _} ) => {
608
610
return tvec:: trans_lit_str ( bcx, expr, s, dest) ;
@@ -1249,7 +1251,8 @@ fn trans_rec_or_struct(bcx: block,
1249
1251
}
1250
1252
}
1251
1253
1252
- fn trans_tup ( bcx : block , elts : & [ @ast:: expr ] , dest : Dest ) -> block {
1254
+ fn trans_adt ( bcx : block , repr : & adt:: Repr , discr : int , elts : & [ @ast:: expr ] ,
1255
+ dest : Dest ) -> block {
1253
1256
let _icx = bcx. insn_ctxt ( "trans_tup" ) ;
1254
1257
let mut bcx = bcx;
1255
1258
let addr = match dest {
@@ -1262,8 +1265,9 @@ fn trans_tup(bcx: block, elts: &[@ast::expr], dest: Dest) -> block {
1262
1265
SaveIn ( pos) => pos,
1263
1266
} ;
1264
1267
let mut temp_cleanups = ~[ ] ;
1268
+ adt:: trans_set_discr ( bcx, repr, addr, discr) ;
1265
1269
for vec:: eachi( elts) |i, e| {
1266
- let dest = GEPi ( bcx, addr, [ 0 u , i] ) ;
1270
+ let dest = adt :: trans_GEP ( bcx, repr , addr, discr , i) ;
1267
1271
let e_ty = expr_ty ( bcx, * e) ;
1268
1272
bcx = trans_into ( bcx, * e, SaveIn ( dest) ) ;
1269
1273
add_clean_temp_mem ( bcx, dest, e_ty) ;
0 commit comments