@@ -19,6 +19,7 @@ use back::link::*;
19
19
use driver:: session;
20
20
use lib;
21
21
use lib:: llvm:: { llvm, ValueRef , TypeRef , True } ;
22
+ use middle:: trans:: adt;
22
23
use middle:: trans:: base:: * ;
23
24
use middle:: trans:: callee;
24
25
use middle:: trans:: closure;
@@ -447,10 +448,10 @@ pub fn make_free_glue(bcx: block, v: ValueRef, t: ty::t) {
447
448
match ty:: ty_dtor ( bcx. tcx ( ) , did) {
448
449
ty:: NoDtor => bcx,
449
450
ty:: LegacyDtor ( ref dt_id) => {
450
- trans_struct_drop ( bcx, v, * dt_id, did, substs, false )
451
+ trans_struct_drop ( bcx, t , v, * dt_id, did, substs, false )
451
452
}
452
453
ty:: TraitDtor ( ref dt_id) => {
453
- trans_struct_drop ( bcx, v, * dt_id, did, substs, true )
454
+ trans_struct_drop ( bcx, t , v, * dt_id, did, substs, true )
454
455
}
455
456
}
456
457
}
@@ -460,6 +461,7 @@ pub fn make_free_glue(bcx: block, v: ValueRef, t: ty::t) {
460
461
}
461
462
462
463
pub fn trans_struct_drop ( bcx : block ,
464
+ t : ty:: t ,
463
465
v0 : ValueRef ,
464
466
dtor_did : ast:: def_id ,
465
467
class_did : ast:: def_id ,
@@ -500,11 +502,12 @@ pub fn trans_struct_drop(bcx: block,
500
502
Call ( bcx, dtor_addr, args) ;
501
503
502
504
// Drop the fields
505
+ let repr = adt:: represent_type ( bcx. ccx ( ) , t) ;
503
506
let field_tys =
504
507
ty:: struct_mutable_fields ( bcx. tcx ( ) , class_did,
505
508
substs) ;
506
509
for vec:: eachi( field_tys) |i, fld| {
507
- let llfld_a = GEPi ( bcx, v0, struct_field ( i ) ) ;
510
+ let llfld_a = adt :: trans_GEP ( bcx, & repr , v0, 0 , i ) ;
508
511
bcx = drop_ty ( bcx, llfld_a, fld. mt . ty ) ;
509
512
}
510
513
@@ -534,10 +537,10 @@ pub fn make_drop_glue(bcx: block, v0: ValueRef, t: ty::t) {
534
537
let tcx = bcx. tcx ( ) ;
535
538
match ty:: ty_dtor ( tcx, did) {
536
539
ty:: TraitDtor ( dtor) => {
537
- trans_struct_drop ( bcx, v0, dtor, did, substs, true )
540
+ trans_struct_drop ( bcx, t , v0, dtor, did, substs, true )
538
541
}
539
542
ty:: LegacyDtor ( dtor) => {
540
- trans_struct_drop ( bcx, v0, dtor, did, substs, false )
543
+ trans_struct_drop ( bcx, t , v0, dtor, did, substs, false )
541
544
}
542
545
ty:: NoDtor => {
543
546
// No dtor? Just the default case
0 commit comments