Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ICE: there are no vtables for unsized types #130521

Closed
matthiaskrgr opened this issue Sep 18, 2024 · 3 comments · Fixed by #135042
Closed

ICE: there are no vtables for unsized types #130521

matthiaskrgr opened this issue Sep 18, 2024 · 3 comments · Fixed by #135042
Labels
C-bug Category: This is a bug. F-dyn_compatible_for_dispatch `#![feature(dyn_compatible_for_dispatch)]`; formerly `object_safe_for_dispatch` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@matthiaskrgr
Copy link
Member

auto-reduced (treereduce-rust):

#![feature(object_safe_for_dispatch)]
struct Vtable(dyn Cap);

trait Cap<'a> {}

union Transmute {
    t: u64,
    u: &'static Vtable,
}

const G: &Copy = unsafe { Transmute { t: 1 }.u };

original:

struct Vtable(dyn Cap);

trait Cap<'a> {}

union Transmute {
    t: u64,  
    u: &'static Vtable,
}

const G: &Copy = unsafe { Transmute { t: 1 }.u };

Version information

rustc 1.83.0-nightly (f7b4c72c8 2024-09-17)
binary: rustc
commit-hash: f7b4c72c8ffb320616bda27f70bb8e0a341673fb
commit-date: 2024-09-17
host: x86_64-unknown-linux-gnu
release: 1.83.0-nightly
LLVM version: 19.1.0

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc -Zcrate-attr=feature(object_safe_for_dispatch)

Program output

error[E0106]: missing lifetime specifier
 --> /tmp/icemaker_global_tempdir.pvcMdeDPSWCA/rustc_testrunner_tmpdir_reporting.xxjpTONUWZGm/mvce.rs:1:19
  |
1 | struct Vtable(dyn Cap);
  |                   ^^^ expected named lifetime parameter
  |
  = note: for more information on higher-ranked polymorphism, visit https://doc.rust-lang.org/nomicon/hrtb.html
help: consider making the bound lifetime-generic with a new `'a` lifetime
  |
1 | struct Vtable(dyn for<'a> Cap<'a>);
  |                   +++++++    ++++
help: consider introducing a named lifetime parameter
  |
1 | struct Vtable<'a>(dyn Cap<'a>);
  |              ++++        ++++

error[E0601]: `main` function not found in crate `mvce`
  --> /tmp/icemaker_global_tempdir.pvcMdeDPSWCA/rustc_testrunner_tmpdir_reporting.xxjpTONUWZGm/mvce.rs:10:50
   |
10 | const G: &Copy = unsafe { Transmute { t: 1 }.u };
   |                                                  ^ consider adding a `main` function to `/tmp/icemaker_global_tempdir.pvcMdeDPSWCA/rustc_testrunner_tmpdir_reporting.xxjpTONUWZGm/mvce.rs`

warning: trait objects without an explicit `dyn` are deprecated
  --> /tmp/icemaker_global_tempdir.pvcMdeDPSWCA/rustc_testrunner_tmpdir_reporting.xxjpTONUWZGm/mvce.rs:10:11
   |
10 | const G: &Copy = unsafe { Transmute { t: 1 }.u };
   |           ^^^^
   |
   = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
   = note: for more information, see <https://doc.rust-lang.org/nightly/edition-guide/rust-2021/warnings-promoted-to-error.html>
   = note: `#[warn(bare_trait_objects)]` on by default
help: if this is an object-safe trait, use `dyn`
   |
10 | const G: &dyn Copy = unsafe { Transmute { t: 1 }.u };
   |           +++

error[E0038]: the trait `Copy` cannot be made into an object
  --> /tmp/icemaker_global_tempdir.pvcMdeDPSWCA/rustc_testrunner_tmpdir_reporting.xxjpTONUWZGm/mvce.rs:10:27
   |
10 | const G: &Copy = unsafe { Transmute { t: 1 }.u };
   |                           ^^^^^^^^^^^^^^^^^^^^ `Copy` cannot be made into an object
   |
   = note: the trait cannot be made into an object because it requires `Self: Sized`
   = note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit <https://doc.rust-lang.org/reference/items/traits.html#object-safety>
   = note: required for the cast from `&'static Vtable` to `&'static (dyn Copy + 'static)`

thread 'rustc' panicked at compiler/rustc_const_eval/src/interpret/traits.rs:45:9:
there are no vtables for unsized types
stack backtrace:
   0:     0x79812a267e2a - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h51109d568367e76a
   1:     0x79812aa03717 - core::fmt::write::h7e8f0b1f95e6be45
   2:     0x79812b8f3ab3 - std::io::Write::write_fmt::h229d78786f5fe690
   3:     0x79812a267c82 - std::sys::backtrace::BacktraceLock::print::hf70613765fd0f061
   4:     0x79812a26a401 - std::panicking::default_hook::{{closure}}::hf82216f80d30e016
   5:     0x79812a26a234 - std::panicking::default_hook::hf7a9ea4a129f2d92
   6:     0x79812936fdbf - std[3a9e0bc7de817fee]::panicking::update_hook::<alloc[4df4a9cb500e0c3c]::boxed::Box<rustc_driver_impl[df1321a44fb92b9b]::install_ice_hook::{closure#0}>>::{closure#0}
   7:     0x79812a26ab28 - std::panicking::rust_panic_with_hook::h24ea4287235e7f5a
   8:     0x79812a26a8c3 - std::panicking::begin_panic_handler::{{closure}}::h1c06db2f98bda4d1
   9:     0x79812a2682d9 - std::sys::backtrace::__rust_end_short_backtrace::h1affcde0392f0bed
  10:     0x79812a26a5c4 - rust_begin_unwind
  11:     0x798127094c03 - core::panicking::panic_fmt::hc8bfb6421cce059b
  12:     0x79812c55d0ae - <rustc_const_eval[316a1db182d8521a]::interpret::eval_context::InterpCx<rustc_const_eval[316a1db182d8521a]::const_eval::machine::CompileTimeMachine>>::get_vtable_size_and_align.llvm.18396178888626651702.cold
  13:     0x79812bcc0e7e - <rustc_const_eval[316a1db182d8521a]::interpret::eval_context::InterpCx<rustc_const_eval[316a1db182d8521a]::const_eval::machine::CompileTimeMachine>>::size_and_align_of.llvm.18396178888626651702.warm
  14:     0x79812b0e4751 - <rustc_const_eval[316a1db182d8521a]::interpret::validity::ValidityVisitor<rustc_const_eval[316a1db182d8521a]::const_eval::machine::CompileTimeMachine>>::check_safe_pointer
  15:     0x79812b0eae4e - <rustc_const_eval[316a1db182d8521a]::interpret::validity::ValidityVisitor<rustc_const_eval[316a1db182d8521a]::const_eval::machine::CompileTimeMachine> as rustc_const_eval[316a1db182d8521a]::interpret::visitor::ValueVisitor<rustc_const_eval[316a1db182d8521a]::const_eval::machine::CompileTimeMachine>>::visit_value
  16:     0x7981283d4170 - rustc_const_eval[316a1db182d8521a]::const_eval::eval_queries::eval_to_allocation_raw_provider
  17:     0x79812b0d63f6 - rustc_query_impl[652b508c0e1a12a1]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[652b508c0e1a12a1]::query_impl::eval_to_allocation_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle[1950792dfd3a6e88]::query::erase::Erased<[u8; 24usize]>>
  18:     0x79812b0d5c12 - rustc_query_system[8d4b4cf30ddeb20c]::query::plumbing::try_execute_query::<rustc_query_impl[652b508c0e1a12a1]::DynamicConfig<rustc_query_system[8d4b4cf30ddeb20c]::query::caches::DefaultCache<rustc_middle[1950792dfd3a6e88]::ty::ParamEnvAnd<rustc_middle[1950792dfd3a6e88]::mir::interpret::GlobalId>, rustc_middle[1950792dfd3a6e88]::query::erase::Erased<[u8; 24usize]>>, false, false, false>, rustc_query_impl[652b508c0e1a12a1]::plumbing::QueryCtxt, false>
  19:     0x79812b0d57ef - rustc_query_impl[652b508c0e1a12a1]::query_impl::eval_to_allocation_raw::get_query_non_incr::__rust_end_short_backtrace
  20:     0x79812b0d7661 - rustc_const_eval[316a1db182d8521a]::const_eval::eval_queries::eval_to_const_value_raw_provider
  21:     0x79812b0d7476 - rustc_query_impl[652b508c0e1a12a1]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[652b508c0e1a12a1]::query_impl::eval_to_const_value_raw::dynamic_query::{closure#2}::{closure#0}, rustc_middle[1950792dfd3a6e88]::query::erase::Erased<[u8; 24usize]>>
  22:     0x79812b0d5bd5 - rustc_query_system[8d4b4cf30ddeb20c]::query::plumbing::try_execute_query::<rustc_query_impl[652b508c0e1a12a1]::DynamicConfig<rustc_query_system[8d4b4cf30ddeb20c]::query::caches::DefaultCache<rustc_middle[1950792dfd3a6e88]::ty::ParamEnvAnd<rustc_middle[1950792dfd3a6e88]::mir::interpret::GlobalId>, rustc_middle[1950792dfd3a6e88]::query::erase::Erased<[u8; 24usize]>>, false, false, false>, rustc_query_impl[652b508c0e1a12a1]::plumbing::QueryCtxt, false>
  23:     0x79812b0d56f3 - rustc_query_impl[652b508c0e1a12a1]::query_impl::eval_to_const_value_raw::get_query_non_incr::__rust_end_short_backtrace
  24:     0x79812abc8c7d - <rustc_middle[1950792dfd3a6e88]::hir::map::Map>::par_body_owners::<rustc_hir_analysis[6094934d5bdd113d]::check_crate::{closure#3}>::{closure#0}
  25:     0x79812abc6506 - rustc_hir_analysis[6094934d5bdd113d]::check_crate
  26:     0x79812abc2e45 - rustc_interface[a2113eed4df3235f]::passes::run_required_analyses
  27:     0x79812b73d79e - rustc_interface[a2113eed4df3235f]::passes::analysis
  28:     0x79812b73d771 - rustc_query_impl[652b508c0e1a12a1]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[652b508c0e1a12a1]::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle[1950792dfd3a6e88]::query::erase::Erased<[u8; 1usize]>>
  29:     0x79812b8d7f6e - rustc_query_system[8d4b4cf30ddeb20c]::query::plumbing::try_execute_query::<rustc_query_impl[652b508c0e1a12a1]::DynamicConfig<rustc_query_system[8d4b4cf30ddeb20c]::query::caches::SingleCache<rustc_middle[1950792dfd3a6e88]::query::erase::Erased<[u8; 1usize]>>, false, false, false>, rustc_query_impl[652b508c0e1a12a1]::plumbing::QueryCtxt, false>
  30:     0x79812b8d7ccf - rustc_query_impl[652b508c0e1a12a1]::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
  31:     0x79812b72721e - rustc_interface[a2113eed4df3235f]::interface::run_compiler::<core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>, rustc_driver_impl[df1321a44fb92b9b]::run_compiler::{closure#0}>::{closure#1}
  32:     0x79812b7ec010 - std[3a9e0bc7de817fee]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[a2113eed4df3235f]::util::run_in_thread_with_globals<rustc_interface[a2113eed4df3235f]::util::run_in_thread_pool_with_globals<rustc_interface[a2113eed4df3235f]::interface::run_compiler<core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>, rustc_driver_impl[df1321a44fb92b9b]::run_compiler::{closure#0}>::{closure#1}, core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>>::{closure#0}, core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>>
  33:     0x79812b7ec67a - <<std[3a9e0bc7de817fee]::thread::Builder>::spawn_unchecked_<rustc_interface[a2113eed4df3235f]::util::run_in_thread_with_globals<rustc_interface[a2113eed4df3235f]::util::run_in_thread_pool_with_globals<rustc_interface[a2113eed4df3235f]::interface::run_compiler<core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>, rustc_driver_impl[df1321a44fb92b9b]::run_compiler::{closure#0}>::{closure#1}, core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>>::{closure#0}, core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[5cb66491b2f8db54]::result::Result<(), rustc_span[e2d2343c41afc08b]::ErrorGuaranteed>>::{closure#1} as core[5cb66491b2f8db54]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  34:     0x79812b7eca6b - std::sys::pal::unix::thread::Thread::new::thread_start::hc93f82c3bb4603d0
  35:     0x79812ce7539d - <unknown>
  36:     0x79812cefa49c - <unknown>
  37:                0x0 - <unknown>

error: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/issues/new?labels=C-bug%2C+I-ICE%2C+T-compiler&template=ice.md

note: please make sure that you have updated to the latest nightly

note: rustc 1.83.0-nightly (f7b4c72c8 2024-09-17) running on x86_64-unknown-linux-gnu

note: compiler flags: -Z crate-attr=feature(object_safe_for_dispatch) -Z dump-mir-dir=dir

query stack during panic:
#0 [eval_to_allocation_raw] const-evaluating + checking `G`
#1 [eval_to_const_value_raw] simplifying constant for the type system `G`
end of query stack
error: aborting due to 3 previous errors; 1 warning emitted

Some errors have detailed explanations: E0038, E0106, E0601.
For more information about an error, try `rustc --explain E0038`.

@rustbot label +F-object_safe_for_dispatch

@matthiaskrgr matthiaskrgr added C-bug Category: This is a bug. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels Sep 18, 2024
@rustbot rustbot added needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. F-dyn_compatible_for_dispatch `#![feature(dyn_compatible_for_dispatch)]`; formerly `object_safe_for_dispatch` labels Sep 18, 2024
@matthiaskrgr
Copy link
Member Author

#126996

@theemathas
Copy link
Contributor

Isn't this the same as #127742 (comment) ?

@matthiaskrgr
Copy link
Member Author

nope

@saethlin saethlin removed the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Sep 24, 2024
@matthiaskrgr matthiaskrgr added S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. and removed I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. C-bug Category: This is a bug. labels Sep 29, 2024
@matthiaskrgr matthiaskrgr added I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. C-bug Category: This is a bug. labels Oct 9, 2024
@bors bors closed this as completed in e0f4dc9 Jan 3, 2025
rust-timer added a commit to rust-lang-ci/rust that referenced this issue Jan 3, 2025
Rollup merge of rust-lang#135042 - lukas-code:taint-dyn-incompat, r=compiler-errors

taint fcx on selection errors during unsizing

With `feature(dyn_compatible_for_dispatch)` we only check for dyn-compatibility by checking the `T: Unsize<dyn Trait>` predicate during the unsizing coercions checks. If the predicate doesn't hold, we emit an error, but pretend the coercion succeeded to prevent further errors. To prevent const eval from attempting to actually perform this coercion, we need to taint the fcx after reporting the trait errors in the coercion check.

fixes rust-lang#135021
fixes rust-lang#130521
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. F-dyn_compatible_for_dispatch `#![feature(dyn_compatible_for_dispatch)]`; formerly `object_safe_for_dispatch` I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ S-bug-has-test Status: This bug is tracked inside the repo by a `known-bug` test. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging a pull request may close this issue.

4 participants