@@ -39,7 +39,7 @@ use back::abi;
3939use llvm:: { mod, ValueRef } ;
4040use middle:: def;
4141use middle:: mem_categorization:: Typer ;
42- use middle:: subst:: { mod, Subst } ;
42+ use middle:: subst:: { mod, Subst , Substs } ;
4343use trans:: { _match, adt, asm, base, callee, closure, consts, controlflow} ;
4444use trans:: base:: * ;
4545use trans:: build:: * ;
@@ -66,6 +66,7 @@ use trans::type_::Type;
6666use syntax:: { ast, ast_util, codemap} ;
6767use syntax:: print:: pprust:: { expr_to_string} ;
6868use syntax:: ptr:: P ;
69+ use syntax:: parse:: token;
6970use std:: rc:: Rc ;
7071
7172// Destinations
@@ -1048,8 +1049,49 @@ fn trans_rvalue_dps_unadjusted<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
10481049 base. as_ref ( ) . map ( |e| & * * e) ,
10491050 expr. span ,
10501051 expr. id ,
1052+ node_id_type ( bcx, expr. id ) ,
10511053 dest)
10521054 }
1055+ ast:: ExprRange ( ref start, ref end) => {
1056+ // FIXME it is just not right that we are synthesising ast nodes in
1057+ // trans. Shudder.
1058+ fn make_field ( field_name : & str , expr : P < ast:: Expr > ) -> ast:: Field {
1059+ ast:: Field {
1060+ ident : codemap:: dummy_spanned ( token:: str_to_ident ( field_name) ) ,
1061+ expr : expr,
1062+ span : codemap:: DUMMY_SP ,
1063+ }
1064+ }
1065+
1066+ // A range just desugars into a struct.
1067+ let ( did, fields) = match end {
1068+ & Some ( ref end) => {
1069+ // Desugar to Range
1070+ let fields = vec ! ( make_field( "start" , start. clone( ) ) ,
1071+ make_field( "end" , end. clone( ) ) ) ;
1072+ ( tcx. lang_items . range_struct ( ) , fields)
1073+ }
1074+ & None => {
1075+ // Desugar to RangeFrom
1076+ let fields = vec ! ( make_field( "start" , start. clone( ) ) ) ;
1077+ ( tcx. lang_items . range_from_struct ( ) , fields)
1078+ }
1079+ } ;
1080+
1081+ if let Some ( did) = did {
1082+ let substs = Substs :: new_type ( vec ! [ node_id_type( bcx, start. id) ] , vec ! [ ] ) ;
1083+ trans_struct ( bcx,
1084+ fields. as_slice ( ) ,
1085+ None ,
1086+ expr. span ,
1087+ expr. id ,
1088+ ty:: mk_struct ( tcx, did, substs) ,
1089+ dest)
1090+ } else {
1091+ tcx. sess . span_bug ( expr. span ,
1092+ "No lang item for ranges (how did we get this far?)" )
1093+ }
1094+ }
10531095 ast:: ExprTup ( ref args) => {
10541096 let numbered_fields: Vec < ( uint , & ast:: Expr ) > =
10551097 args. iter ( ) . enumerate ( ) . map ( |( i, arg) | ( i, & * * arg) ) . collect ( ) ;
@@ -1347,10 +1389,10 @@ fn trans_struct<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
13471389 base : Option < & ast:: Expr > ,
13481390 expr_span : codemap:: Span ,
13491391 expr_id : ast:: NodeId ,
1392+ ty : Ty < ' tcx > ,
13501393 dest : Dest ) -> Block < ' blk , ' tcx > {
13511394 let _icx = push_ctxt ( "trans_rec" ) ;
13521395
1353- let ty = node_id_type ( bcx, expr_id) ;
13541396 let tcx = bcx. tcx ( ) ;
13551397 with_field_tys ( tcx, ty, Some ( expr_id) , |discr, field_tys| {
13561398 let mut need_base = Vec :: from_elem ( field_tys. len ( ) , true ) ;
0 commit comments