rust-lang / rust-lang/rust

ICE: `SizeSkeleton::compute` panics on complex recursive type alias involving Pointee::Metadata

Open
#151,069 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-associated-items A-trait-system C-bug fixed-by-next-solver I-ICE S-bug-has-test S-has-mcve T-compiler
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

I tried this code:

trait Trait {
    type Assoc2;
}
struct Bar;
impl Trait for Bar
where
    <Bar as Trait>::Assoc2: Trait,
{
    type Assoc2 = ();
}
struct Foo {
    field: <Bar as Trait>::Assoc2,
}
static FOO2: &Foo = 0;
fn main() {}

The compiler behavior differs depending on the release channel and trait solver used:

Release channel Result
current Stable ICE
current Nightly (default solver) ICE
Nightly + -Znext-solver=globally error
Meta

rustc --version --verbose:

rustc 1.94.0-nightly (f57eac1bf 2026-01-10)
binary: rustc
commit-hash: f57eac1bf98cb5d578e3364b64365ec398c137df
commit-date: 2026-01-10
host: x86_64-unknown-linux-gnu
release: 1.94.0-nightly
LLVM version: 21.1.8
Backtrace

thread 'rustc' panicked at /rustc-dev/f57eac1bf98cb5d578e3364b64365ec398c137df/compiler/rustc_middle/src/ty/sty.rs:1762:86:
Box<dyn Any>
stack backtrace:
   0:     0x7f92b7a20c4b - <std[14974c2a6d31bd09]::backtrace::Backtrace>::create
   1:     0x7f92b7a20b95 - <std[14974c2a6d31bd09]::backtrace::Backtrace>::force_capture
   2:     0x7f92b6a165c7 - std[14974c2a6d31bd09]::panicking::update_hook::<alloc[97bcaa3c9f42b50c]::boxed::Box<rustc_driver_impl[8626402415690959]::install_ice_hook::{closure#1}>>::{closure#0}
   3:     0x7f92b7a34062 - std[14974c2a6d31bd09]::panicking::panic_with_hook
   4:     0x7f92b6a53251 - std[14974c2a6d31bd09]::panicking::begin_panic::<rustc_errors[cacf81fbc0306139]::ExplicitBug>::{closure#0}
   5:     0x7f92b6a43506 - std[14974c2a6d31bd09]::sys::backtrace::__rust_end_short_backtrace::<std[14974c2a6d31bd09]::panicking::begin_panic<rustc_errors[cacf81fbc0306139]::ExplicitBug>::{closure#0}, !>
   6:     0x7f92b6a40b49 - std[14974c2a6d31bd09]::panicking::begin_panic::<rustc_errors[cacf81fbc0306139]::ExplicitBug>
   7:     0x7f92b6a70f91 - <rustc_errors[cacf81fbc0306139]::diagnostic::BugAbort as rustc_errors[cacf81fbc0306139]::diagnostic::EmissionGuarantee>::emit_producing_guarantee
   8:     0x7f92b7022289 - rustc_middle[42069f076602ef26]::util::bug::opt_span_bug_fmt::<rustc_span[ea6610cf11a1023c]::span_encoding::Span>::{closure#0}
   9:     0x7f92b7022412 - rustc_middle[42069f076602ef26]::ty::context::tls::with_opt::<rustc_middle[42069f076602ef26]::util::bug::opt_span_bug_fmt<rustc_span[ea6610cf11a1023c]::span_encoding::Span>::{closure#0}, !>::{closure#0}
  10:     0x7f92b701352b - rustc_middle[42069f076602ef26]::ty::context::tls::with_context_opt::<rustc_middle[42069f076602ef26]::ty::context::tls::with_opt<rustc_middle[42069f076602ef26]::util::bug::opt_span_bug_fmt<rustc_span[ea6610cf11a1023c]::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
  11:     0x7f92b4a60014 - rustc_middle[42069f076602ef26]::util::bug::bug_fmt
  12:     0x7f92b8226f01 - rustc_trait_selection[15cd687e6e3a4627]::traits::project::confirm_candidate
  13:     0x7f92b8201c4b - rustc_trait_selection[15cd687e6e3a4627]::traits::project::normalize_projection_term
  14:     0x7f92b8995500 - rustc_traits[d900ce35b51d4320]::normalize_projection_ty::normalize_canonicalized_projection
  15:     0x7f92b8994f02 - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::normalize_canonicalized_projection::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 8usize]>>
  16:     0x7f92b8994025 - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_query_system[4067c90f9d31d9ad]::query::caches::DefaultCache<rustc_type_ir[2e637ce3bc4e2c58]::canonical::CanonicalQueryInput<rustc_middle[42069f076602ef26]::ty::context::TyCtxt, rustc_middle[42069f076602ef26]::ty::ParamEnvAnd<rustc_type_ir[2e637ce3bc4e2c58]::predicate::AliasTerm<rustc_middle[42069f076602ef26]::ty::context::TyCtxt>>>, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 8usize]>>, false, false, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  17:     0x7f92b8993c6a - rustc_query_impl[7762d22649c04fd8]::query_impl::normalize_canonicalized_projection::get_query_non_incr::__rust_end_short_backtrace
  18:     0x7f92b81f0ab3 - <rustc_trait_selection[15cd687e6e3a4627]::traits::query::normalize::QueryNormalizer>::try_fold_free_or_assoc
  19:     0x7f92b81efb7e - <rustc_trait_selection[15cd687e6e3a4627]::traits::query::normalize::QueryNormalizer as rustc_type_ir[2e637ce3bc4e2c58]::fold::FallibleTypeFolder<rustc_middle[42069f076602ef26]::ty::context::TyCtxt>>::try_fold_ty
  20:     0x7f92b81e9cf6 - <rustc_traits[d900ce35b51d4320]::normalize_erasing_regions::provide::{closure#0} as core[75fca27d79ab979d]::ops::function::FnOnce<(rustc_middle[42069f076602ef26]::ty::context::TyCtxt, rustc_middle[42069f076602ef26]::ty::PseudoCanonicalInput<rustc_middle[42069f076602ef26]::ty::generic_args::GenericArg>)>>::call_once
  21:     0x7f92b81e9860 - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::try_normalize_generic_arg_after_erasing_regions::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 8usize]>>
  22:     0x7f92b81e8a8d - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_query_system[4067c90f9d31d9ad]::query::caches::DefaultCache<rustc_middle[42069f076602ef26]::ty::PseudoCanonicalInput<rustc_middle[42069f076602ef26]::ty::generic_args::GenericArg>, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 8usize]>>, false, false, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  23:     0x7f92b81e8758 - rustc_query_impl[7762d22649c04fd8]::query_impl::try_normalize_generic_arg_after_erasing_regions::get_query_non_incr::__rust_end_short_backtrace
  24:     0x7f92b81e7f5a - <rustc_middle[42069f076602ef26]::ty::normalize_erasing_regions::TryNormalizeAfterErasingRegionsFolder as rustc_type_ir[2e637ce3bc4e2c58]::fold::FallibleTypeFolder<rustc_middle[42069f076602ef26]::ty::context::TyCtxt>>::try_fold_ty
  25:     0x7f92b883bd61 - rustc_ty_utils[b80a22a8b24a11b7]::layout::layout_of_uncached
  26:     0x7f92b8834dd7 - rustc_ty_utils[b80a22a8b24a11b7]::layout::layout_of
  27:     0x7f92b8834d40 - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 16usize]>>
  28:     0x7f92b8833c1d - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_query_system[4067c90f9d31d9ad]::query::caches::DefaultCache<rustc_middle[42069f076602ef26]::ty::PseudoCanonicalInput<rustc_middle[42069f076602ef26]::ty::Ty>, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 16usize]>>, false, true, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  29:     0x7f92b8833834 - rustc_query_impl[7762d22649c04fd8]::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
  30:     0x7f92b8834f3e - rustc_ty_utils[b80a22a8b24a11b7]::layout::layout_of
  31:     0x7f92b8834d40 - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::layout_of::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 16usize]>>
  32:     0x7f92b8833c1d - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_query_system[4067c90f9d31d9ad]::query::caches::DefaultCache<rustc_middle[42069f076602ef26]::ty::PseudoCanonicalInput<rustc_middle[42069f076602ef26]::ty::Ty>, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 16usize]>>, false, true, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  33:     0x7f92b8833834 - rustc_query_impl[7762d22649c04fd8]::query_impl::layout_of::get_query_non_incr::__rust_end_short_backtrace
  34:     0x7f92b85ec9cf - rustc_hir_analysis[439a21a4da756827]::check::check::check_item_type
  35:     0x7f92b85e4af6 - rustc_hir_analysis[439a21a4da756827]::check::wfcheck::check_well_formed
  36:     0x7f92b85e4ad7 - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::check_well_formed::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 1usize]>>
  37:     0x7f92b85e434d - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_data_structures[5b2e5bcce01f3ea3]::vec_cache::VecCache<rustc_span[ea6610cf11a1023c]::def_id::LocalDefId, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 1usize]>, rustc_query_system[4067c90f9d31d9ad]::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  38:     0x7f92b85e3e56 - rustc_query_impl[7762d22649c04fd8]::query_impl::check_well_formed::get_query_non_incr::__rust_end_short_backtrace
  39:     0x7f92b85e15f0 - rustc_hir_analysis[439a21a4da756827]::check::wfcheck::check_type_wf
  40:     0x7f92b85e14dd - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::check_type_wf::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 1usize]>>
  41:     0x7f92b915b408 - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_query_system[4067c90f9d31d9ad]::query::caches::SingleCache<rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 1usize]>>, false, false, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  42:     0x7f92b915b1ce - rustc_query_impl[7762d22649c04fd8]::query_impl::check_type_wf::get_query_non_incr::__rust_end_short_backtrace
  43:     0x7f92b8a53096 - rustc_hir_analysis[439a21a4da756827]::check_crate
  44:     0x7f92b8237f5b - rustc_interface[90afb413dadbe4f1]::passes::analysis
  45:     0x7f92b8237ba7 - rustc_query_impl[7762d22649c04fd8]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[7762d22649c04fd8]::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 0usize]>>
  46:     0x7f92b915cbe6 - rustc_query_system[4067c90f9d31d9ad]::query::plumbing::try_execute_query::<rustc_query_impl[7762d22649c04fd8]::DynamicConfig<rustc_query_system[4067c90f9d31d9ad]::query::caches::SingleCache<rustc_middle[42069f076602ef26]::query::erase::Erased<[u8; 0usize]>>, false, false, false>, rustc_query_impl[7762d22649c04fd8]::plumbing::QueryCtxt, false>
  47:     0x7f92b915c948 - rustc_query_impl[7762d22649c04fd8]::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
  48:     0x7f92b9324754 - <rustc_interface[90afb413dadbe4f1]::passes::create_and_enter_global_ctxt<core[75fca27d79ab979d]::option::Option<rustc_interface[90afb413dadbe4f1]::queries::Linker>, rustc_driver_impl[8626402415690959]::run_compiler::{closure#0}::{closure#2}>::{closure#2} as core[75fca27d79ab979d]::ops::function::FnOnce<(&rustc_session[7c34b462142e1273]::session::Session, rustc_middle[42069f076602ef26]::ty::context::CurrentGcx, alloc[97bcaa3c9f42b50c]::sync::Arc<rustc_data_structures[5b2e5bcce01f3ea3]::jobserver::Proxy>, &std[14974c2a6d31bd09]::sync::once_lock::OnceLock<rustc_middle[42069f076602ef26]::ty::context::GlobalCtxt>, &rustc_data_structures[5b2e5bcce01f3ea3]::sync::worker_local::WorkerLocal<rustc_middle[42069f076602ef26]::arena::Arena>, &rustc_data_structures[5b2e5bcce01f3ea3]::sync::worker_local::WorkerLocal<rustc_hir[a6c28dd0effa383c]::Arena>, rustc_driver_impl[8626402415690959]::run_compiler::{closure#0}::{closure#2})>>::call_once::{shim:vtable#0}
  49:     0x7f92b921cf98 - rustc_interface[90afb413dadbe4f1]::interface::run_compiler::<(), rustc_driver_impl[8626402415690959]::run_compiler::{closure#0}>::{closure#1}
  50:     0x7f92b9065f4e - std[14974c2a6d31bd09]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[90afb413dadbe4f1]::util::run_in_thread_with_globals<rustc_interface[90afb413dadbe4f1]::util::run_in_thread_pool_with_globals<rustc_interface[90afb413dadbe4f1]::interface::run_compiler<(), rustc_driver_impl[8626402415690959]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  51:     0x7f92b9065d20 - <std[14974c2a6d31bd09]::thread::lifecycle::spawn_unchecked<rustc_interface[90afb413dadbe4f1]::util::run_in_thread_with_globals<rustc_interface[90afb413dadbe4f1]::util::run_in_thread_pool_with_globals<rustc_interface[90afb413dadbe4f1]::interface::run_compiler<(), rustc_driver_impl[8626402415690959]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[75fca27d79ab979d]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  52:     0x7f92b9068438 - <std[14974c2a6d31bd09]::sys::thread::unix::Thread>::new::thread_start
  53:     0x7f92b2a94ac3 - start_thread
                               at ./nptl/pthread_create.c:442:8
  54:     0x7f92b2b268c0 - __GI___clone3
                               at ./misc/../sysdeps/unix/sysv/linux/x86_64/clone3.S:81:0
  55:                0x0 - <unknown>


rustc version: 1.94.0-nightly (f57eac1bf 2026-01-10)
platform: x86_64-unknown-linux-gnu

query stack during panic:
#0 [normalize_canonicalized_projection] normalizing `<Foo as core::ptr::metadata::Pointee>::Metadata`
#1 [try_normalize_generic_arg_after_erasing_regions] normalizing `<Foo as core::ptr::metadata::Pointee>::Metadata`
#2 [layout_of] computing layout of `&Foo`
#3 [layout_of] computing layout of `&'static Foo`
#4 [check_well_formed] checking that `FOO2` is well-formed
#5 [check_type_wf] checking that types are well-formed
#6 [analysis] running analysis passes on crate `after`
end of query stack

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by compiling the reported reproducer with the default and globally enabled trait solvers, then inspect the stack's paths through compiler/rustc_middle/src/ty/sty.rs, rustc_trait_selection, and rustc_ty_utils. Done means the recursive alias case no longer triggers an ICE and instead produces a compiler diagnostic, matching the non-panicking solver behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Needs clarification
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.