diff options
| author | bors <bors@rust-lang.org> | 2021-09-05 18:55:32 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2021-09-05 18:55:32 +0000 |
| commit | e30b68353fe22b00f40d021e7914eeb78473b3c1 (patch) | |
| tree | b0c5e0a269e05fe4ad021b7770f1a2de0a0648db /src | |
| parent | e2750baf53aaa60db95f10759f6cf9463dc5a6bd (diff) | |
| parent | 97214eecc5a6c35c6cd8d9798207175cc2e15812 (diff) | |
| download | rust-e30b68353fe22b00f40d021e7914eeb78473b3c1.tar.gz rust-e30b68353fe22b00f40d021e7914eeb78473b3c1.zip | |
Auto merge of #88552 - nbdd0121:vtable, r=nagisa
Stop allocating vtable entries for non-object-safe methods Current a vtable entry is allocated for all associated fns, even if the method is not object-safe: https://godbolt.org/z/h7vx6f35T As a result, each vtable for `Iterator`' currently consumes 74 `usize`s. This PR stops allocating vtable entries for those methods, reducing vtable size of each `Iterator` vtable to 7 `usize`s. Note that this PR introduces will cause more invocations of `is_vtable_safe_method`. So a perf run might be needed. If result isn't favorable then we might need to query-ify `is_vtable_safe_method`.
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 | | } | |_^ |
