Fix unsized structs with destructors

The presence of the drop flag caused the offset calculation to be
incorrect, leading to the pointer being incorrect. This has been fixed
by calculating the offset based on the field index (and not assuming
that the field is always the last one).

However, I've also stopped the drop flag from being added to the end of
unsized structs to begin with. Since it's not actually accessed for
unsized structs, and isn't actually where we would say it is, this made
more sense.
This commit is contained in:
James Miller 2015-12-08 15:40:25 +13:00
parent a2557d472e
commit d6eb063fe8
2 changed files with 33 additions and 7 deletions

View file

@ -9,7 +9,7 @@
// except according to those terms.
struct Foo<T: ?Sized> {
a: u8,
a: u16,
b: T
}
@ -31,6 +31,11 @@ struct Packed<T: ?Sized> {
b: T
}
struct HasDrop<T: ?Sized> {
ptr: Box<usize>,
data: T
}
fn main() {
// Test that zero-offset works properly
let b : Baz<usize> = Baz { a: 7 };
@ -68,4 +73,15 @@ fn main() {
let f : &Foo<Bar> = &f;
let &Foo { a: _, b: ref bar } = f;
assert_eq!(bar.get(), 11);
// Make sure that drop flags don't screw things up
let d : HasDrop<Baz<[i32; 4]>> = HasDrop {
ptr: Box::new(0),
data: Baz { a: [1,2,3,4] }
};
assert_eq!([1,2,3,4], d.data.a);
let d : &HasDrop<Baz<[i32]>> = &d;
assert_eq!(&[1,2,3,4], &d.data.a);
}