@@ -2998,9 +2998,6 @@ fn trans_vec(@block_ctxt cx, vec[@ast.expr] args,
2998
2998
fn trans_rec( @block_ctxt cx, vec[ ast. field] fields,
2999
2999
option. t[ @ast. expr] base, & ast. ann ann) -> result {
3000
3000
3001
- // FIXME: handle presence of a nonempty base.
3002
- check ( base == none[ @ast. expr] ) ;
3003
-
3004
3001
auto bcx = cx;
3005
3002
auto t = node_ann_type( bcx. fcx. ccx, ann) ;
3006
3003
auto llty = type_of( bcx. fcx. ccx, t) ;
@@ -3011,13 +3008,44 @@ fn trans_rec(@block_ctxt cx, vec[ast.field] fields,
3011
3008
find_scope_cx( cx) . cleanups += clean( bind drop_ty( _, rec_val, t) ) ;
3012
3009
let int i = 0 ;
3013
3010
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;
3018
3029
auto dst_res = GEP_tup_like ( bcx, t, rec_val, vec( 0 , i) ) ;
3019
3030
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;
3021
3049
i += 1 ;
3022
3050
}
3023
3051
ret res( bcx, rec_val) ;
0 commit comments