@@ -94,10 +94,7 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
94
94
ty:: TyAdt ( adt_def, substs) => {
95
95
// FIXME: some structs are represented as ByValPair
96
96
let mut lval = self . force_allocation ( lval) ?;
97
- let adt_ptr = match lval {
98
- Lvalue :: Ptr { ptr, .. } => ptr,
99
- _ => bug ! ( "force allocation can only yield Lvalue::Ptr" ) ,
100
- } ;
97
+ let ( adt_ptr, extra) = lval. to_ptr_and_extra ( ) ;
101
98
102
99
// run drop impl before the fields' drop impls
103
100
if let Some ( drop_def_id) = adt_def. destructor ( ) {
@@ -109,7 +106,13 @@ impl<'a, 'tcx> EvalContext<'a, 'tcx> {
109
106
traits:: VtableImpl ( data) => data,
110
107
_ => bug ! ( "dtor for {:?} is not an impl???" , ty)
111
108
} ;
112
- drop. push ( ( drop_def_id, Value :: ByVal ( PrimVal :: Ptr ( adt_ptr) ) , vtable. substs ) ) ;
109
+ let val = match extra {
110
+ LvalueExtra :: None => Value :: ByVal ( PrimVal :: Ptr ( adt_ptr) ) ,
111
+ LvalueExtra :: DowncastVariant ( _) => bug ! ( "downcast variant in drop" ) ,
112
+ LvalueExtra :: Length ( n) => Value :: ByValPair ( PrimVal :: Ptr ( adt_ptr) , PrimVal :: from_u128 ( n as u128 ) ) ,
113
+ LvalueExtra :: Vtable ( vtable) => Value :: ByValPair ( PrimVal :: Ptr ( adt_ptr) , PrimVal :: Ptr ( vtable) ) ,
114
+ } ;
115
+ drop. push ( ( drop_def_id, val, vtable. substs ) ) ;
113
116
}
114
117
115
118
let layout = self . type_layout ( ty) ?;
0 commit comments