rust-lang / rust-lang/rust

[ICE]: unexpected rigid alias in layout_of after normalization

Open
#154,749 3 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug F-generic_const_args F-generic_const_items F-min_generic_const_args I-ICE T-compiler WG-trait-system-refactor
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

auto-reduced (treereduce-rust):

//@compile-flags: -Znext-solver=globally
#![feature(generic_const_args)]
#![feature(min_generic_const_args, generic_const_items)]

type const FREE1<T>: usize = const { std::mem::size_of::<*mut T>() };

fn main() {}

original:

#![expect(incomplete_features)]
#![feature(min_generic_const_args, generic_const_items)]


type const FREE1<T>: usize = const { std::mem::size_of::<*mut T>() };
//~^ ERROR generic parameters may not be used in const operations

type const FREE2<const I: usize>: usize = const { I + 1 };
//~^ ERROR generic parameters may not be used in const operations

fn main() {}

Version information

rustc 1.96.0-nightly (5bbdeaa9a 2026-04-03)
binary: rustc
commit-hash: 5bbdeaa9a8dc563185f40e99f96704cbcc7a6e6e
commit-date: 2026-04-03
host: x86_64-unknown-linux-gnu
release: 1.96.0-nightly
LLVM version: 22.1.2

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc -Znext-solver=globally -Zcrate-attr=feature(generic_const_args)

Program output

warning: the feature `min_generic_const_args` is incomplete and may not be safe to use and/or cause compiler crashes
 --> /tmp/icemaker_global_tempdir.VYf0f6yJxQ7o/rustc_testrunner_tmpdir_reporting.gtukBlXfVnFK/mvce.rs:1:12
  |
1 | #![feature(min_generic_const_args, generic_const_items)]
  |            ^^^^^^^^^^^^^^^^^^^^^^
  |
  = note: see issue #132980 <https://github.com/rust-lang/rust/issues/132980> for more information
  = note: `#[warn(incomplete_features)]` on by default

warning: the feature `generic_const_items` is incomplete and may not be safe to use and/or cause compiler crashes
 --> /tmp/icemaker_global_tempdir.VYf0f6yJxQ7o/rustc_testrunner_tmpdir_reporting.gtukBlXfVnFK/mvce.rs:1:36
  |
1 | #![feature(min_generic_const_args, generic_const_items)]
  |                                    ^^^^^^^^^^^^^^^^^^^
  |
  = note: see issue #113521 <https://github.com/rust-lang/rust/issues/113521> for more information

warning: constant `FREE1` is never used
 --> /tmp/icemaker_global_tempdir.VYf0f6yJxQ7o/rustc_testrunner_tmpdir_reporting.gtukBlXfVnFK/mvce.rs:3:12
  |
3 | type const FREE1<T>: usize = const { std::mem::size_of::<*mut T>() };
  |            ^^^^^
  |
  = note: `#[warn(dead_code)]` (part of `#[warn(unused)]`) on by default

warning: 3 warnings emitted

note: no errors encountered even though delayed bugs were created

note: those delayed bugs will now be shown as internal compiler errors

error: internal compiler error: unexpected rigid alias in layout_of after normalization: Alias(Projection, AliasTy { args: [!0], def_id: DefId(2:2715 ~ core[6b09]::ptr::metadata::Pointee::Metadata), .. })
  |
  = note: delayed at /rustc-dev/5bbdeaa9a8dc563185f40e99f96704cbcc7a6e6e/compiler/rustc_ty_utils/src/layout.rs:780:61
             0: <rustc_errors::DiagCtxtInner>::emit_diagnostic
             1: <rustc_errors::DiagCtxtHandle>::emit_diagnostic
             2: <rustc_span::ErrorGuaranteed as rustc_errors::diagnostic::EmissionGuarantee>::emit_producing_guarantee
             3: <rustc_errors::DiagCtxtHandle>::delayed_bug::<alloc::string::String>
             4: rustc_ty_utils::layout::layout_of_uncached
             5: rustc_ty_utils::layout::layout_of
             6: rustc_query_impl::query_impl::layout_of::invoke_provider_fn::__rust_begin_short_backtrace
             7: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::ErasedData<[u8; 16]>>, false>
             8: rustc_query_impl::query_impl::layout_of::execute_query_non_incr::__rust_end_short_backtrace
             9: <rustc_middle::ty::layout::LayoutCx as rustc_middle::ty::layout::LayoutOf>::spanned_layout_of
            10: rustc_ty_utils::layout::layout_of_uncached
            11: rustc_ty_utils::layout::layout_of
            12: rustc_query_impl::query_impl::layout_of::invoke_provider_fn::__rust_begin_short_backtrace
            13: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::ty::Ty>, rustc_middle::query::erase::ErasedData<[u8; 16]>>, false>
            14: rustc_query_impl::query_impl::layout_of::execute_query_non_incr::__rust_end_short_backtrace
            15: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::eval_intrinsic
            16: <rustc_const_eval::const_eval::machine::CompileTimeMachine as rustc_const_eval::interpret::machine::Machine>::call_intrinsic
            17: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::init_fn_call
            18: rustc_const_eval::const_eval::eval_queries::eval_to_allocation_raw_provider
            19: rustc_query_impl::query_impl::eval_to_allocation_raw::invoke_provider_fn::__rust_begin_short_backtrace
            20: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::mir::interpret::GlobalId>, rustc_middle::query::erase::ErasedData<[u8; 24]>>, false>
            21: rustc_query_impl::query_impl::eval_to_allocation_raw::execute_query_non_incr::__rust_end_short_backtrace
            22: rustc_const_eval::const_eval::eval_queries::eval_to_const_value_raw_provider
            23: rustc_query_impl::query_impl::eval_to_const_value_raw::invoke_provider_fn::__rust_begin_short_backtrace
            24: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::mir::interpret::GlobalId>, rustc_middle::query::erase::ErasedData<[u8; 24]>>, false>
            25: rustc_query_impl::query_impl::eval_to_const_value_raw::execute_query_non_incr::__rust_end_short_backtrace
            26: <rustc_middle::ty::context::TyCtxt>::const_eval_resolve
            27: <rustc_middle::mir::consts::Const>::eval
            28: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::init_stack_frame
            29: <rustc_const_eval::interpret::eval_context::InterpCx<rustc_const_eval::const_eval::machine::CompileTimeMachine>>::init_fn_call
            30: rustc_const_eval::const_eval::eval_queries::eval_to_allocation_raw_provider
            31: rustc_query_impl::query_impl::eval_to_allocation_raw::invoke_provider_fn::__rust_begin_short_backtrace
            32: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::mir::interpret::GlobalId>, rustc_middle::query::erase::ErasedData<[u8; 24]>>, false>
            33: rustc_query_impl::query_impl::eval_to_allocation_raw::execute_query_non_incr::__rust_end_short_backtrace
            34: rustc_const_eval::const_eval::valtrees::eval_to_valtree
            35: <rustc_const_eval::provide::{closure#0} as core::ops::function::FnOnce<(rustc_middle::ty::context::TyCtxt, rustc_middle::ty::PseudoCanonicalInput<rustc_middle::mir::interpret::GlobalId>)>>::call_once
            36: rustc_query_impl::query_impl::eval_to_valtree::invoke_provider_fn::__rust_begin_short_backtrace
            37: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::DefaultCache<rustc_middle::ty::PseudoCanonicalInput<rustc_middle::mir::interpret::GlobalId>, rustc_middle::query::erase::ErasedData<[u8; 16]>>, false>
            38: rustc_query_impl::query_impl::eval_to_valtree::execute_query_non_incr::__rust_end_short_backtrace
            39: <rustc_middle::ty::context::TyCtxt>::const_eval_resolve_for_typeck
            40: rustc_trait_selection::traits::try_evaluate_const
            41: <rustc_trait_selection::solve::delegate::SolverDelegate as rustc_next_trait_solver::delegate::SolverDelegate>::evaluate_const
            42: <rustc_next_trait_solver::solve::search_graph::SearchGraphDelegate<rustc_trait_selection::solve::delegate::SolverDelegate> as rustc_type_ir::search_graph::Delegate>::compute_goal::{closure#0}
            43: <rustc_type_ir::search_graph::SearchGraph<rustc_next_trait_solver::solve::search_graph::SearchGraphDelegate<rustc_trait_selection::solve::delegate::SolverDelegate>, rustc_middle::ty::context::TyCtxt>>::evaluate_goal::{closure#0}::{closure#2}
            44: <rustc_next_trait_solver::solve::eval_ctxt::EvalCtxt<rustc_trait_selection::solve::delegate::SolverDelegate, rustc_middle::ty::context::TyCtxt>>::evaluate_goal_raw
            45: <rustc_next_trait_solver::solve::eval_ctxt::EvalCtxt<rustc_trait_selection::solve::delegate::SolverDelegate, rustc_middle::ty::context::TyCtxt>>::try_evaluate_added_goals
            46: <rustc_next_trait_solver::solve::search_graph::SearchGraphDelegate<rustc_trait_selection::solve::delegate::SolverDelegate> as rustc_type_ir::search_graph::Delegate>::compute_goal::{closure#0}
            47: <rustc_type_ir::search_graph::SearchGraph<rustc_next_trait_solver::solve::search_graph::SearchGraphDelegate<rustc_trait_selection::solve::delegate::SolverDelegate>, rustc_middle::ty::context::TyCtxt>>::evaluate_goal::{closure#0}::{closure#2}
            48: <rustc_next_trait_solver::solve::eval_ctxt::EvalCtxt<rustc_trait_selection::solve::delegate::SolverDelegate, rustc_middle::ty::context::TyCtxt>>::evaluate_goal_raw
            49: <rustc_trait_selection::solve::delegate::SolverDelegate as rustc_next_trait_solver::solve::eval_ctxt::SolverDelegateEvalExt>::evaluate_root_goal
            50: <rustc_trait_selection::solve::fulfill::FulfillmentCtxt<rustc_trait_selection::traits::FulfillmentError> as rustc_infer::traits::engine::TraitEngine<rustc_trait_selection::traits::FulfillmentError>>::try_evaluate_obligations
            51: <rustc_trait_selection::solve::normalize::NormalizationFolder<rustc_trait_selection::traits::FulfillmentError>>::normalize_alias_term
            52: <rustc_trait_selection::solve::normalize::NormalizationFolder<rustc_trait_selection::traits::FulfillmentError> as rustc_type_ir::fold::FallibleTypeFolder<rustc_middle::ty::context::TyCtxt>>::try_fold_const::{closure#0}
            53: rustc_hir_analysis::check::wfcheck::check_type_const
            54: rustc_hir_analysis::check::check::check_item_type
            55: rustc_hir_analysis::check::wfcheck::check_well_formed
            56: rustc_query_impl::query_impl::check_well_formed::invoke_provider_fn::__rust_begin_short_backtrace
            57: rustc_query_impl::execution::try_execute_query::<rustc_data_structures::vec_cache::VecCache<rustc_span::def_id::LocalDefId, rustc_middle::query::erase::ErasedData<[u8; 1]>, rustc_middle::dep_graph::graph::DepNodeIndex>, false>
            58: rustc_query_impl::query_impl::check_well_formed::execute_query_non_incr::__rust_end_short_backtrace
            59: rustc_hir_analysis::check::wfcheck::check_type_wf
            60: rustc_query_impl::query_impl::check_type_wf::invoke_provider_fn::__rust_begin_short_backtrace
            61: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::SingleCache<rustc_middle::query::erase::ErasedData<[u8; 1]>>, false>
            62: rustc_query_impl::query_impl::check_type_wf::execute_query_non_incr::__rust_end_short_backtrace
            63: rustc_hir_analysis::check_crate
            64: rustc_interface::passes::analysis
            65: rustc_query_impl::execution::try_execute_query::<rustc_middle::query::caches::SingleCache<rustc_middle::query::erase::ErasedData<[u8; 0]>>, false>
            66: rustc_query_impl::query_impl::analysis::execute_query_non_incr::__rust_end_short_backtrace
            67: rustc_interface::interface::run_compiler::<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}
            68: std::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
            69: <std::thread::lifecycle::spawn_unchecked<rustc_interface::util::run_in_thread_with_globals<rustc_interface::util::run_in_thread_pool_with_globals<rustc_interface::interface::run_compiler<(), rustc_driver_impl::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
            70: <std::sys::thread::unix::Thread>::new::thread_start
            71: <unknown>
            72: <unknown>
          

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.96.0-nightly (5bbdeaa9a 2026-04-03) running on x86_64-unknown-linux-gnu

note: compiler flags: -Z next-solver=globally -Z crate-attr=feature(generic_const_args) -Z dump-mir-dir=dir

query stack during panic:
end of query stack

@rustbot label +F-min_generic_const_args +F-generic_const_items +F-generic_const_args +WG-trait-system-refactor

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 with the reduced a.rs example and reproduce it using rustc with -Znext-solver=globally. Then inspect compiler/rustc_ty_utils/src/layout.rs around line 780 and follow the layout_of call path shown in the trace. Done means this input no longer produces an internal compiler error.

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
Quiet
Clarity
Mostly clear
Newbie friendliness
42/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.