@@ -251,13 +251,13 @@ fn type_of_tag(cx: @crate_ctxt, sp: span, did: ast::def_id, t: ty::t)
251
251
let degen = std:: vec:: len ( ty:: tag_variants ( cx. tcx , did) ) == 1 u;
252
252
if check type_has_static_size ( cx, t) {
253
253
let size = static_size_of_tag ( cx, sp, t) ;
254
- if !degen { ret T_tag ( cx. tn , size) ; }
255
- // LLVM does not like 0-size arrays, apparently
256
- if size == 0 u { size = 1 u; }
257
- ret T_array ( T_i8 ( ) , size) ;
254
+ if !degen { T_tag ( cx. tn , size) }
255
+ else if size == 0 u { T_struct ( [ T_int ( ) ] ) }
256
+ else { T_array ( T_i8 ( ) , size) }
258
257
}
259
258
else {
260
- if degen { ret T_i8 ( ) ; } else { ret T_opaque_tag ( cx. tn ) ; }
259
+ if degen { T_struct ( [ T_int ( ) ] ) }
260
+ else { T_opaque_tag ( cx. tn ) }
261
261
}
262
262
}
263
263
@@ -3115,12 +3115,13 @@ fn trans_var(cx: @block_ctxt, sp: span, def: ast::def, id: ast::node_id)
3115
3115
let lltagty = type_of_tag ( ccx, sp, tid, tag_ty) ;
3116
3116
let bcx = alloc_result. bcx ;
3117
3117
let lltagptr = PointerCast ( bcx, lltagblob, T_ptr ( lltagty) ) ;
3118
- if std:: vec:: len ( ty:: tag_variants ( ccx. tcx , tid) ) != 1 u {
3118
+ let lldiscrimptr = GEP ( bcx, lltagptr, [ C_int ( 0 ) , C_int ( 0 ) ] ) ;
3119
+ let d = if std:: vec:: len ( ty:: tag_variants ( ccx. tcx , tid) ) != 1 u {
3119
3120
let lldiscrim_gv = lookup_discriminant ( bcx. fcx . lcx , vid) ;
3120
3121
let lldiscrim = Load ( bcx, lldiscrim_gv) ;
3121
- let lldiscrimptr = GEP ( bcx , lltagptr , [ C_int ( 0 ) , C_int ( 0 ) ] ) ;
3122
- Store ( bcx , lldiscrim , lldiscrimptr ) ;
3123
- }
3122
+ lldiscrim
3123
+ } else { C_int ( 0 ) } ;
3124
+ Store ( bcx , d , lldiscrimptr ) ;
3124
3125
ret lval_no_env ( bcx, lltagptr, temporary) ;
3125
3126
}
3126
3127
}
0 commit comments