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 has escaping bound vars, so it cannot be wrapped in a dummy binder. #134764

Open
matthiaskrgr opened this issue Dec 25, 2024 · 2 comments · May be fixed by #134776
Open

ICE has escaping bound vars, so it cannot be wrapped in a dummy binder. #134764

matthiaskrgr opened this issue Dec 25, 2024 · 2 comments · May be fixed by #134776
Assignees
Labels
A-diagnostics Area: Messages for errors, warnings, and lints 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.

Comments

@matthiaskrgr
Copy link
Member

auto-reduced (treereduce-rust):

#[derive(PartialEq, Eq)]
enum O<T> {
    Some(*const T),
    None,
}

struct B;

const C: &[O<Box<dyn for<'a> Fn(Box<dyn Fn() -> &'a isize>)>>] = &[O::None];

fn main() {
    let x = O::None;
    match &[x][..] {
        C => (),
        _ => (),
    }
}

original:

#[derive(PartialEq, Eq)]
enum O<T> {
    Some(*const T), // Can also use PhantomData<T>
    None,
}

struct B;

const C: &[O<Box<dyn for<'a> Fn(Box<dyn Fn(&'a isize) -> &'a isize>)>>] = &[O::None];

fn main() {
    let x = O::None;
    match &[x][..] {
        C => (), //~ ERROR constant of non-structural type `&[O<B>]` in a pattern
        _ => (),
    }
}

Version information

rustc 1.85.0-nightly (f432d5dcb 2024-12-25)
binary: rustc
commit-hash: f432d5dcb52db23aec88a1a22cc76f00addaf914
commit-date: 2024-12-25
host: x86_64-unknown-linux-gnu
release: 1.85.0-nightly
LLVM version: 19.1.6

Possibly related line of code:

tcx.mk_predicate(from.map_bound(|clause| PredicateKind::Clause(clause))).expect_clause()
}
}
impl<'tcx> UpcastFrom<TyCtxt<'tcx>, TraitRef<'tcx>> for Predicate<'tcx> {
fn upcast_from(from: TraitRef<'tcx>, tcx: TyCtxt<'tcx>) -> Self {
ty::Binder::dummy(from).upcast(tcx)
}
}
impl<'tcx> UpcastFrom<TyCtxt<'tcx>, TraitRef<'tcx>> for Clause<'tcx> {
fn upcast_from(from: TraitRef<'tcx>, tcx: TyCtxt<'tcx>) -> Self {
let p: Predicate<'tcx> = from.upcast(tcx);

Command:
/home/matthias/.rustup/toolchains/master/bin/rustc

Program output

thread 'rustc' panicked at compiler/rustc_middle/src/ty/predicate.rs:533:9:
`<std::boxed::Box<dyn std::ops::Fn() -> &'a isize> as std::cmp::PartialEq>` has escaping bound vars, so it cannot be wrapped in a dummy binder.
stack backtrace:
   0:     0x7c9cdfebb63a - <std::sys::backtrace::BacktraceLock::print::DisplayBacktrace as core::fmt::Display>::fmt::h77fbdc8aac60414e
   1:     0x7c9ce06138a6 - core::fmt::write::hda4d658b5ee55b01
   2:     0x7c9ce153fd51 - std::io::Write::write_fmt::h8f90a5c3ff9cbbf5
   3:     0x7c9cdfebb492 - std::sys::backtrace::BacktraceLock::print::h3ad93e09de443a12
   4:     0x7c9cdfebd98a - std::panicking::default_hook::{{closure}}::h6fc4ea29ea465f34
   5:     0x7c9cdfebd7d3 - std::panicking::default_hook::h464057d7719def3c
   6:     0x7c9cdf0297b8 - std[fa56bee34f8ed8e9]::panicking::update_hook::<alloc[f57ddff3f4a06127]::boxed::Box<rustc_driver_impl[d4ab4eea49657f86]::install_ice_hook::{closure#0}>>::{closure#0}
   7:     0x7c9cdfebe148 - std::panicking::rust_panic_with_hook::h2040cc9aadf33ebd
   8:     0x7c9cdfebde3a - std::panicking::begin_panic_handler::{{closure}}::hd0d95548d1502188
   9:     0x7c9cdfebbad9 - std::sys::backtrace::__rust_end_short_backtrace::h62d4821eb41cd40b
  10:     0x7c9cdfebdafd - rust_begin_unwind
  11:     0x7c9cdcb9aae0 - core::panicking::panic_fmt::hf6e7a6562922f7a8
  12:     0x7c9ce1368ad9 - rustc_mir_build[99939e59f9e176fb]::thir::pattern::const_to_pat::type_has_partial_eq_impl
  13:     0x7c9cdf6be7be - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::const_to_pat::extend_type_not_partial_eq::UsedParamsNeedInstantiationVisitor as rustc_type_ir[5e65a3934537d3cf]::visit::TypeVisitor<rustc_middle[c9a7fc339c28ab7c]::ty::context::TyCtxt>>::visit_ty
  14:     0x7c9cdf6be9b0 - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::const_to_pat::extend_type_not_partial_eq::UsedParamsNeedInstantiationVisitor as rustc_type_ir[5e65a3934537d3cf]::visit::TypeVisitor<rustc_middle[c9a7fc339c28ab7c]::ty::context::TyCtxt>>::visit_ty
  15:     0x7c9cdf6bea40 - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::const_to_pat::extend_type_not_partial_eq::UsedParamsNeedInstantiationVisitor as rustc_type_ir[5e65a3934537d3cf]::visit::TypeVisitor<rustc_middle[c9a7fc339c28ab7c]::ty::context::TyCtxt>>::visit_ty
  16:     0x7c9cdf6be7ec - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::const_to_pat::extend_type_not_partial_eq::UsedParamsNeedInstantiationVisitor as rustc_type_ir[5e65a3934537d3cf]::visit::TypeVisitor<rustc_middle[c9a7fc339c28ab7c]::ty::context::TyCtxt>>::visit_ty
  17:     0x7c9cdf6be7ec - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::const_to_pat::extend_type_not_partial_eq::UsedParamsNeedInstantiationVisitor as rustc_type_ir[5e65a3934537d3cf]::visit::TypeVisitor<rustc_middle[c9a7fc339c28ab7c]::ty::context::TyCtxt>>::visit_ty
  18:     0x7c9ce1366943 - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::PatCtxt>::const_to_pat
  19:     0x7c9ce100d185 - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::PatCtxt>::lower_path
  20:     0x7c9ce100a2ed - <rustc_mir_build[99939e59f9e176fb]::thir::pattern::PatCtxt>::lower_pattern
  21:     0x7c9ce1009246 - <rustc_mir_build[99939e59f9e176fb]::thir::cx::Cx>::pattern_from_hir
  22:     0x7c9ce0ff99c0 - <rustc_mir_build[99939e59f9e176fb]::thir::cx::Cx>::mirror_expr
  23:     0x7c9ce0ff953c - <rustc_mir_build[99939e59f9e176fb]::thir::cx::Cx>::mirror_expr
  24:     0x7c9ce1007826 - rustc_mir_build[99939e59f9e176fb]::thir::cx::thir_body
  25:     0x7c9ce10072ac - rustc_query_impl[4bd01d47c4af37a7]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[4bd01d47c4af37a7]::query_impl::thir_body::dynamic_query::{closure#2}::{closure#0}, rustc_middle[c9a7fc339c28ab7c]::query::erase::Erased<[u8; 16usize]>>
  26:     0x7c9ce0a5ff0a - rustc_query_system[62fa8c3d1f26fee8]::query::plumbing::try_execute_query::<rustc_query_impl[4bd01d47c4af37a7]::DynamicConfig<rustc_data_structures[610240d0a6b991ea]::vec_cache::VecCache<rustc_span[634eed359c297ed]::def_id::LocalDefId, rustc_middle[c9a7fc339c28ab7c]::query::erase::Erased<[u8; 16usize]>, rustc_query_system[62fa8c3d1f26fee8]::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl[4bd01d47c4af37a7]::plumbing::QueryCtxt, false>
  27:     0x7c9ce0a5fa6c - rustc_query_impl[4bd01d47c4af37a7]::query_impl::thir_body::get_query_non_incr::__rust_end_short_backtrace
  28:     0x7c9cdd7723a7 - rustc_mir_build[99939e59f9e176fb]::check_unsafety::check_unsafety
  29:     0x7c9ce0e812bd - rustc_query_impl[4bd01d47c4af37a7]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[4bd01d47c4af37a7]::query_impl::check_unsafety::dynamic_query::{closure#2}::{closure#0}, rustc_middle[c9a7fc339c28ab7c]::query::erase::Erased<[u8; 0usize]>>
  30:     0x7c9ce0e81569 - rustc_query_system[62fa8c3d1f26fee8]::query::plumbing::try_execute_query::<rustc_query_impl[4bd01d47c4af37a7]::DynamicConfig<rustc_data_structures[610240d0a6b991ea]::vec_cache::VecCache<rustc_span[634eed359c297ed]::def_id::LocalDefId, rustc_middle[c9a7fc339c28ab7c]::query::erase::Erased<[u8; 0usize]>, rustc_query_system[62fa8c3d1f26fee8]::dep_graph::graph::DepNodeIndex>, false, false, false>, rustc_query_impl[4bd01d47c4af37a7]::plumbing::QueryCtxt, false>
  31:     0x7c9ce0e81201 - rustc_query_impl[4bd01d47c4af37a7]::query_impl::check_unsafety::get_query_non_incr::__rust_end_short_backtrace
  32:     0x7c9ce0b37200 - rustc_interface[a43870bf5b30678c]::passes::run_required_analyses
  33:     0x7c9ce1543bde - rustc_interface[a43870bf5b30678c]::passes::analysis
  34:     0x7c9ce1543baf - rustc_query_impl[4bd01d47c4af37a7]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[4bd01d47c4af37a7]::query_impl::analysis::dynamic_query::{closure#2}::{closure#0}, rustc_middle[c9a7fc339c28ab7c]::query::erase::Erased<[u8; 0usize]>>
  35:     0x7c9ce1586c15 - rustc_query_system[62fa8c3d1f26fee8]::query::plumbing::try_execute_query::<rustc_query_impl[4bd01d47c4af37a7]::DynamicConfig<rustc_query_system[62fa8c3d1f26fee8]::query::caches::SingleCache<rustc_middle[c9a7fc339c28ab7c]::query::erase::Erased<[u8; 0usize]>>, false, false, false>, rustc_query_impl[4bd01d47c4af37a7]::plumbing::QueryCtxt, false>
  36:     0x7c9ce158694e - rustc_query_impl[4bd01d47c4af37a7]::query_impl::analysis::get_query_non_incr::__rust_end_short_backtrace
  37:     0x7c9ce1644f1e - rustc_interface[a43870bf5b30678c]::passes::create_and_enter_global_ctxt::<core[f39fba3432b64bbd]::option::Option<rustc_interface[a43870bf5b30678c]::queries::Linker>, rustc_driver_impl[d4ab4eea49657f86]::run_compiler::{closure#0}::{closure#2}>::{closure#2}::{closure#0}
  38:     0x7c9ce15b0c64 - rustc_interface[a43870bf5b30678c]::interface::run_compiler::<(), rustc_driver_impl[d4ab4eea49657f86]::run_compiler::{closure#0}>::{closure#1}
  39:     0x7c9ce14b9487 - std[fa56bee34f8ed8e9]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[a43870bf5b30678c]::util::run_in_thread_with_globals<rustc_interface[a43870bf5b30678c]::util::run_in_thread_pool_with_globals<rustc_interface[a43870bf5b30678c]::interface::run_compiler<(), rustc_driver_impl[d4ab4eea49657f86]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>
  40:     0x7c9ce14b991c - <<std[fa56bee34f8ed8e9]::thread::Builder>::spawn_unchecked_<rustc_interface[a43870bf5b30678c]::util::run_in_thread_with_globals<rustc_interface[a43870bf5b30678c]::util::run_in_thread_pool_with_globals<rustc_interface[a43870bf5b30678c]::interface::run_compiler<(), rustc_driver_impl[d4ab4eea49657f86]::run_compiler::{closure#0}>::{closure#1}, ()>::{closure#0}, ()>::{closure#0}::{closure#0}, ()>::{closure#1} as core[f39fba3432b64bbd]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  41:     0x7c9ce14baeef - std::sys::pal::unix::thread::Thread::new::thread_start::hd34f2ad132c4e652
  42:     0x7c9cdb8a339d - <unknown>
  43:     0x7c9cdb92849c - <unknown>
  44:                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.85.0-nightly (f432d5dcb 2024-12-25) running on x86_64-unknown-linux-gnu

query stack during panic:
#0 [thir_body] building THIR for `main`
#1 [check_unsafety] unsafety-checking `main`
end of query stack

@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 Dec 25, 2024
@rustbot rustbot added the needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. label Dec 25, 2024
@matthiaskrgr
Copy link
Member Author

Regression in nightly-2024-12-06
#133233

@matthiaskrgr matthiaskrgr added A-diagnostics Area: Messages for errors, warnings, and lints and removed needs-triage This issue may need triage. Remove it if it has been sufficiently triaged. labels Dec 25, 2024
@cyrgani
Copy link
Contributor

cyrgani commented Dec 25, 2024

reduced a bit and expanded the macro:

#![feature(structural_match)]
impl<T: ?Sized> std::marker::StructuralPartialEq for O<T> { }

enum O<T: ?Sized> {
    Some(*const T),
    None,
}

const C: O<dyn for<'a> Fn(Box<dyn Fn(&'a u8)>)> = O::None;

fn main() {
    match O::None {
        C => (),
    }
}

@estebank estebank self-assigned this Dec 26, 2024
estebank added a commit to estebank/rust that referenced this issue Dec 26, 2024
…constant as pattern

When we encounter a constant in a pattern, we check if it is non-structural. If so, we check if the type implements `PartialEq`, but for types with escaping bound vars the check would be incorrect as is, so we break early. This is ok because these types would be filtered anyways.

Fix rust-lang#134764.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-diagnostics Area: Messages for errors, warnings, and lints 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.
Projects
None yet
4 participants