rust-lang / rust-lang/rust

[ICE]: incremental compilation evaluate_obligation, with repro, stable + nightly

Open
#151,888 2 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

A-incr-comp C-bug fixed-by-next-solver I-ICE S-has-mcve T-compiler
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

I haven't minimized this, but it is reliably reproducible.

Code

I hit this while working on crates.io and stashing and committing stuff. I've pushed up what reproduces the issue every time to my fork in the rust-ice-repro branch.

First, check out the last commit https://github.com/carols10cents/crates.io/commit/6ee705b171f860d16b980077a55232307553f7d8

and run cargo +nightly test --workspace

Then check out the penultimate commit https://github.com/carols10cents/crates.io/commit/19385d5f62a25dc0b81b1e24c112e0f40f9be4ba

and run cargo +nightly test --workspace again and I get an ICE every time.

Meta

I am able to reproduce the ICE using the above steps BOTH with stable AND with nightly a293cc4af 2026-01-30.

stable rustc --version --verbose:

rustc 1.93.0 (254b59607 2026-01-19)
binary: rustc
commit-hash: 254b59607d4417e9dffbc307138ae5c86280fe4c
commit-date: 2026-01-19
host: aarch64-apple-darwin
release: 1.93.0
LLVM version: 21.1.8

nightly rustc --version --verbose:

rustc 1.95.0-nightly (a293cc4af 2026-01-30)
binary: rustc
commit-hash: a293cc4af8b26701c42738381c0c6f9d2ba881e0
commit-date: 2026-01-30
host: aarch64-apple-darwin
release: 1.95.0-nightly
LLVM version: 22.1.0
Error output
error: internal compiler error: encountered incremental compilation error with evaluate_obligation(7e778a6f67b65486-cf4246bea99b5d80)

I've also attached the 2 files created by rustc.

Backtrace

thread 'rustc' (10303835) panicked at /rustc-dev/a293cc4af8b26701c42738381c0c6f9d2ba881e0/compiler/rustc_query_system/src/query/plumbing.rs:745:9:
Found unstable fingerprints for evaluate_obligation(7e778a6f67b65486-cf4246bea99b5d80): Ok(EvaluatedToOk)
stack backtrace:
   0: __rustc::rust_begin_unwind
   1: core::panicking::panic_fmt
   2: rustc_query_system::query::plumbing::incremental_verify_ich_failed::<rustc_middle::ty::context::TyCtxt>
   3: rustc_query_system::query::plumbing::incremental_verify_ich::<rustc_middle::ty::context::TyCtxt, rustc_middle::query::erase::ErasedData<[u8; 2]>>
   4: rustc_query_system::query::plumbing::try_execute_query::<rustc_query_impl::SemiDynamicQueryDispatcher<rustc_query_system::query::caches::DefaultCache<rustc_type_ir::canonical::CanonicalQueryInput<rustc_middle::ty::context::TyCtxt, rustc_middle::ty::ParamEnvAnd<rustc_middle::ty::predicate::Predicate>>, rustc_middle::query::erase::ErasedData<[u8; 2]>>, false, false, false>, true>
   5: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation
   6: <rustc_infer::infer::InferCtxt as rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt>::evaluate_obligation_no_overflow
   7: <rustc_trait_selection::traits::fulfill::FulfillProcessor>::process_trait_obligation
   8: <rustc_trait_selection::traits::fulfill::FulfillProcessor as rustc_data_structures::obligation_forest::ObligationProcessor>::process_obligation
   9: <rustc_data_structures::obligation_forest::ObligationForest<rustc_trait_selection::traits::fulfill::PendingPredicateObligation>>::process_obligations::<rustc_trait_selection::traits::fulfill::FulfillProcessor>
  10: <rustc_trait_selection::traits::fulfill::FulfillmentContext<rustc_infer::traits::engine::ScrubbedTraitError> as rustc_infer::traits::engine::TraitEngine<rustc_infer::traits::engine::ScrubbedTraitError>>::try_evaluate_obligations
  11: <rustc_trait_selection::traits::fulfill::FulfillmentContext<rustc_infer::traits::engine::ScrubbedTraitError> as rustc_infer::traits::engine::TraitEngine<rustc_infer::traits::engine::ScrubbedTraitError>>::evaluate_obligations_error_on_ambiguity
  12: <rustc_trait_selection::traits::engine::ObligationCtxt>::make_canonicalized_query_response::<()>
  13: rustc_traits::type_op::type_op_ascribe_user_type
      [... omitted 2 frames ...]
  14: <rustc_middle::traits::query::type_op::AscribeUserType as rustc_trait_selection::traits::query::type_op::QueryTypeOp>::perform_query
  15: <rustc_borrowck::type_check::TypeChecker>::ascribe_user_type
  16: rustc_borrowck::type_check::type_check
  17: <rustc_borrowck::root_cx::BorrowCheckRootCtxt>::do_mir_borrowck
  18: rustc_borrowck::mir_borrowck
      [... omitted 1 frame ...]
  19: rustc_hir_analysis::collect::type_of::opaque::find_opaque_ty_constraints_for_rpit
  20: rustc_hir_analysis::collect::type_of::type_of_opaque
      [... omitted 1 frame ...]
  21: <rustc_trait_selection::traits::select::SelectionContext>::confirm_auto_impl_candidate::{closure#0}
  22: <rustc_trait_selection::traits::select::SelectionContext>::confirm_candidate
  23: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}
  24: <rustc_infer::infer::InferCtxt>::probe::<core::result::Result<rustc_middle::traits::select::EvaluationResult, rustc_middle::traits::select::OverflowError>, <rustc_trait_selection::traits::select::SelectionContext>::evaluation_probe<<rustc_trait_selection::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}>::{closure#0}>
  25: <rustc_trait_selection::traits::select::SelectionContext>::in_task::<<rustc_trait_selection::traits::select::SelectionContext>::evaluate_trait_predicate_recursively::{closure#0}::{closure#1}, core::result::Result<rustc_middle::traits::select::EvaluationResult, rustc_middle::traits::select::OverflowError>>::{closure#0}
  26: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_trait_predicate_recursively
  27: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_predicate_recursively::{closure#0}::{closure#0}
  28: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_predicate_recursively
  29: <rustc_trait_selection::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}
  30: <rustc_infer::infer::InferCtxt>::probe::<core::result::Result<rustc_middle::traits::select::EvaluationResult, rustc_middle::traits::select::OverflowError>, <rustc_trait_selection::traits::select::SelectionContext>::evaluation_probe<<rustc_trait_selection::traits::select::SelectionContext>::evaluate_candidate::{closure#0}::{closure#0}>::{closure#0}>
  31: <rustc_trait_selection::traits::select::SelectionContext>::candidate_from_obligation::{closure#0}::{closure#0}
  32: <rustc_trait_selection::traits::select::SelectionContext>::candidate_from_obligation::{closure#0}
  33: <rustc_trait_selection::traits::select::SelectionContext>::poly_select::{closure#0}
  34: <rustc_trait_selection::traits::fulfill::FulfillProcessor>::process_trait_obligation
  35: <rustc_trait_selection::traits::fulfill::FulfillProcessor as rustc_data_structures::obligation_forest::ObligationProcessor>::process_obligation
  36: <rustc_data_structures::obligation_forest::ObligationForest<rustc_trait_selection::traits::fulfill::PendingPredicateObligation>>::process_obligations::<rustc_trait_selection::traits::fulfill::FulfillProcessor>
  37: <rustc_trait_selection::traits::fulfill::FulfillmentContext<rustc_trait_selection::traits::FulfillmentError> as rustc_infer::traits::engine::TraitEngine<rustc_trait_selection::traits::FulfillmentError>>::try_evaluate_obligations
  38: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
  39: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  40: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  41: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_block
  42: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  43: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_return_or_body_tail
  44: rustc_hir_typeck::check::check_fn
  45: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  46: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  47: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
  48: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  49: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  50: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_decl
  51: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_block
  52: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  53: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_argument_types
  54: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  55: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  56: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  57: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  58: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  59: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  60: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  61: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  62: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  63: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  64: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  65: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  66: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  67: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  68: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  69: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  70: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  71: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  72: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  73: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  74: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  75: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  76: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  77: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  78: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
  79: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_with_expectation_and_args
  80: <rustc_hir_typeck::fn_ctxt::FnCtxt>::check_expr_kind
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

rustc-ice-2026-01-31T02_42_36-89980.txt
rustc-ice-2026-01-31T02_42_36-89981.txt

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

First reproduce the ICE by running cargo +nightly test --workspace on the two specified crates.io commits, then read the panic at compiler/rustc_query_system/src/query/plumbing.rs:745 and the evaluate_obligation path shown in the backtrace. Trace the incremental fingerprint failure through rustc_trait_selection and rustc_borrowck; done means the reported reproduction no longer triggers the internal compiler error on stable and nightly.

Written by the indexing model from the issue text.

Assessment

Tech stack
rust
Domain
compilers
Issue type
Bug
Difficulty
5/5
Estimated time
Over a week
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.