Never emit vptr
for empty/auto traits
This commit is contained in:
parent
88f311479d
commit
781bff0499
@ -154,18 +154,17 @@ fn prepare_vtable_segments_inner<'tcx, T>(
|
|||||||
|
|
||||||
// emit innermost item, move to next sibling and stop there if possible, otherwise jump to outer level.
|
// emit innermost item, move to next sibling and stop there if possible, otherwise jump to outer level.
|
||||||
while let Some((inner_most_trait_ref, emit_vptr, mut siblings)) = stack.pop() {
|
while let Some((inner_most_trait_ref, emit_vptr, mut siblings)) = stack.pop() {
|
||||||
|
let has_entries =
|
||||||
|
has_own_existential_vtable_entries(tcx, inner_most_trait_ref.def_id());
|
||||||
|
|
||||||
segment_visitor(VtblSegment::TraitOwnEntries {
|
segment_visitor(VtblSegment::TraitOwnEntries {
|
||||||
trait_ref: inner_most_trait_ref,
|
trait_ref: inner_most_trait_ref,
|
||||||
emit_vptr: emit_vptr && !tcx.sess.opts.unstable_opts.no_trait_vptr,
|
emit_vptr: emit_vptr && has_entries && !tcx.sess.opts.unstable_opts.no_trait_vptr,
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
// If we've emitted (fed to `segment_visitor`) a trait that has methods present in the vtable,
|
// If we've emitted (fed to `segment_visitor`) a trait that has methods present in the vtable,
|
||||||
// we'll need to emit vptrs from now on.
|
// we'll need to emit vptrs from now on.
|
||||||
if !emit_vptr_on_new_entry
|
emit_vptr_on_new_entry |= has_entries;
|
||||||
&& has_own_existential_vtable_entries(tcx, inner_most_trait_ref.def_id())
|
|
||||||
{
|
|
||||||
emit_vptr_on_new_entry = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if let Some(next_inner_most_trait_ref) =
|
if let Some(next_inner_most_trait_ref) =
|
||||||
siblings.find(|&sibling| visited.insert(sibling.upcast(tcx)))
|
siblings.find(|&sibling| visited.insert(sibling.upcast(tcx)))
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "E", "entries": "6", "entries_ignoring_upcasting": "4", "entries_for_upcasting": "2", "upcasting_cost_percent": "50" }
|
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "G", "entries": "14", "entries_ignoring_upcasting": "11", "entries_for_upcasting": "3", "upcasting_cost_percent": "27.27272727272727" }
|
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "A", "entries": "6", "entries_ignoring_upcasting": "5", "entries_for_upcasting": "1", "upcasting_cost_percent": "20" }
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "A", "entries": "6", "entries_ignoring_upcasting": "5", "entries_for_upcasting": "1", "upcasting_cost_percent": "20" }
|
||||||
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "G", "entries": "13", "entries_ignoring_upcasting": "11", "entries_for_upcasting": "2", "upcasting_cost_percent": "18.181818181818183" }
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "B", "entries": "4", "entries_ignoring_upcasting": "4", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "B", "entries": "4", "entries_ignoring_upcasting": "4", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "D", "entries": "4", "entries_ignoring_upcasting": "4", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "D", "entries": "4", "entries_ignoring_upcasting": "4", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
||||||
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "E", "entries": "4", "entries_ignoring_upcasting": "4", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "F", "entries": "6", "entries_ignoring_upcasting": "6", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "F", "entries": "6", "entries_ignoring_upcasting": "6", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "_::S", "entries": "3", "entries_ignoring_upcasting": "3", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "_::S", "entries": "3", "entries_ignoring_upcasting": "3", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
||||||
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "_::S", "entries": "3", "entries_ignoring_upcasting": "3", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
print-vtable-sizes { "crate_name": "print_vtable_sizes", "trait_name": "_::S", "entries": "3", "entries_ignoring_upcasting": "3", "entries_for_upcasting": "0", "upcasting_cost_percent": "0" }
|
||||||
|
29
tests/ui/traits/upcast_reorder.rs
Normal file
29
tests/ui/traits/upcast_reorder.rs
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
//@ run-pass
|
||||||
|
//
|
||||||
|
// issue: <https://github.com/rust-lang/rust/issues/131813>
|
||||||
|
|
||||||
|
#![feature(trait_upcasting)]
|
||||||
|
|
||||||
|
trait Pollable {
|
||||||
|
#[allow(unused)]
|
||||||
|
fn poll(&self) {}
|
||||||
|
}
|
||||||
|
trait FileIo: Pollable + Send + Sync {
|
||||||
|
fn read(&self) {}
|
||||||
|
}
|
||||||
|
trait Terminal: Send + Sync + FileIo {}
|
||||||
|
|
||||||
|
struct A;
|
||||||
|
|
||||||
|
impl Pollable for A {}
|
||||||
|
impl FileIo for A {}
|
||||||
|
impl Terminal for A {}
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let a = A;
|
||||||
|
|
||||||
|
let b = &a as &dyn Terminal;
|
||||||
|
let c = b as &dyn FileIo;
|
||||||
|
|
||||||
|
c.read();
|
||||||
|
}
|
@ -14,7 +14,6 @@ error: vtable entries for `<S as B>`: [
|
|||||||
MetadataSize,
|
MetadataSize,
|
||||||
MetadataAlign,
|
MetadataAlign,
|
||||||
Method(<S as T>::method),
|
Method(<S as T>::method),
|
||||||
TraitVPtr(<S as M2>),
|
|
||||||
]
|
]
|
||||||
--> $DIR/multiple-markers.rs:24:1
|
--> $DIR/multiple-markers.rs:24:1
|
||||||
|
|
|
|
||||||
@ -26,8 +25,6 @@ error: vtable entries for `<S as C>`: [
|
|||||||
MetadataSize,
|
MetadataSize,
|
||||||
MetadataAlign,
|
MetadataAlign,
|
||||||
Method(<S as T>::method),
|
Method(<S as T>::method),
|
||||||
TraitVPtr(<S as M1>),
|
|
||||||
TraitVPtr(<S as M2>),
|
|
||||||
]
|
]
|
||||||
--> $DIR/multiple-markers.rs:27:1
|
--> $DIR/multiple-markers.rs:27:1
|
||||||
|
|
|
|
||||||
@ -39,9 +36,6 @@ error: vtable entries for `<S as D>`: [
|
|||||||
MetadataSize,
|
MetadataSize,
|
||||||
MetadataAlign,
|
MetadataAlign,
|
||||||
Method(<S as T>::method),
|
Method(<S as T>::method),
|
||||||
TraitVPtr(<S as M0>),
|
|
||||||
TraitVPtr(<S as M1>),
|
|
||||||
TraitVPtr(<S as M2>),
|
|
||||||
]
|
]
|
||||||
--> $DIR/multiple-markers.rs:30:1
|
--> $DIR/multiple-markers.rs:30:1
|
||||||
|
|
|
|
||||||
|
Loading…
Reference in New Issue
Block a user