diff options
| author | Gary Guo <gary@garyguo.net> | 2021-09-01 00:49:14 +0100 |
|---|---|---|
| committer | Gary Guo <gary@garyguo.net> | 2021-09-05 18:13:32 +0100 |
| commit | 871eb6233ed4b5c3a3c5fe96e88e4dacc046e45f (patch) | |
| tree | 18d01cfbcf7f65008b16e83fed3394b0d26d9d5f /src | |
| parent | 03c775c95596cbd92f2b1e8ca98e7addfa3eade2 (diff) | |
| download | rust-871eb6233ed4b5c3a3c5fe96e88e4dacc046e45f.tar.gz rust-871eb6233ed4b5c3a3c5fe96e88e4dacc046e45f.zip | |
Stop allocating vtable entries for non-object-safe methods
Diffstat (limited to 'src')
| -rw-r--r-- | src/test/ui/traits/vtable/vtable-non-object-safe.rs | 18 | ||||
| -rw-r--r-- | src/test/ui/traits/vtable/vtable-non-object-safe.stderr | 16 | ||||
| -rw-r--r-- | src/test/ui/traits/vtable/vtable-vacant.rs | 7 | ||||
| -rw-r--r-- | src/test/ui/traits/vtable/vtable-vacant.stderr | 4 |
4 files changed, 41 insertions, 4 deletions
diff --git a/src/test/ui/traits/vtable/vtable-non-object-safe.rs b/src/test/ui/traits/vtable/vtable-non-object-safe.rs new file mode 100644 index 00000000000..45b6a8a98a7 --- /dev/null +++ b/src/test/ui/traits/vtable/vtable-non-object-safe.rs @@ -0,0 +1,18 @@ +// build-fail +#![feature(rustc_attrs)] + +// Ensure that non-object-safe methods in Iterator does not generate +// vtable entries. + +#[rustc_dump_vtable] +trait A: Iterator {} +//~^ error Vtable + +impl<T> A for T where T: Iterator {} + +fn foo(_a: &mut dyn A<Item=u8>) { +} + +fn main() { + foo(&mut vec![0, 1, 2, 3].into_iter()); +} diff --git a/src/test/ui/traits/vtable/vtable-non-object-safe.stderr b/src/test/ui/traits/vtable/vtable-non-object-safe.stderr new file mode 100644 index 00000000000..f3175b805d1 --- /dev/null +++ b/src/test/ui/traits/vtable/vtable-non-object-safe.stderr @@ -0,0 +1,16 @@ +error: Vtable entries for `<std::vec::IntoIter<u8> as A>`: [ + MetadataDropInPlace, + MetadataSize, + MetadataAlign, + Method(<std::vec::IntoIter<u8> as Iterator>::next), + Method(<std::vec::IntoIter<u8> as Iterator>::size_hint), + Method(<std::vec::IntoIter<u8> as Iterator>::advance_by), + Method(<std::vec::IntoIter<u8> as Iterator>::nth), +] + --> $DIR/vtable-non-object-safe.rs:8:1 + | +LL | trait A: Iterator {} + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/traits/vtable/vtable-vacant.rs b/src/test/ui/traits/vtable/vtable-vacant.rs index ebea94171f2..429ce523799 100644 --- a/src/test/ui/traits/vtable/vtable-vacant.rs +++ b/src/test/ui/traits/vtable/vtable-vacant.rs @@ -1,22 +1,25 @@ // build-fail #![feature(rustc_attrs)] +#![feature(negative_impls)] +#![allow(where_clauses_object_safety)] // B --> A #[rustc_dump_vtable] trait A { fn foo_a1(&self) {} - fn foo_a2(&self) where Self: Sized {} + fn foo_a2(&self) where Self: Send {} } #[rustc_dump_vtable] trait B: A { //~^ error Vtable fn foo_b1(&self) {} - fn foo_b2() where Self: Sized {} + fn foo_b2(&self) where Self: Send {} } struct S; +impl !Send for S {} impl A for S {} impl B for S {} diff --git a/src/test/ui/traits/vtable/vtable-vacant.stderr b/src/test/ui/traits/vtable/vtable-vacant.stderr index 768cca52689..f5cd36264fc 100644 --- a/src/test/ui/traits/vtable/vtable-vacant.stderr +++ b/src/test/ui/traits/vtable/vtable-vacant.stderr @@ -7,12 +7,12 @@ error: Vtable entries for `<S as B>`: [ Method(<S as B>::foo_b1), Vacant, ] - --> $DIR/vtable-vacant.rs:13:1 + --> $DIR/vtable-vacant.rs:15:1 | LL | / trait B: A { LL | | LL | | fn foo_b1(&self) {} -LL | | fn foo_b2() where Self: Sized {} +LL | | fn foo_b2(&self) where Self: Send {} LL | | } | |_^ |
