rust-lang / rust-lang/rust

ICE: `collection encountered polymorphic constant: Ty(..)`

Open
#126,696 4 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

C-bug E-needs-mcve F-generic_const_exprs I-ICE P-low S-bug-has-test T-compiler
Dominant language
Rust
Stars
119k
Forks
16.1k
PR merge metrics
PR metrics pending

Description

auto-reduced (treereduce-rust):

#![feature(generic_const_exprs)]

use std::array;

trait PrimRec<const N: usize, const O: usize> {
    fn eval(&self, x: [usize; N]) -> [usize; O];
}

struct Zero;

impl<const N: usize> PrimRec<N, 1> for Zero {
    fn eval(&self, _: [usize; N]) -> [usize; 1] {
        [0]
    }
}

struct S;

impl PrimRec<1, 1> for S {
    fn eval(&self, x: [usize; 1]) -> [usize; 1] {
        [x[0] + 1]
    }
}

struct Proj<const I: usize>;

impl<const N: usize, const I: usize> PrimRec<N, 1> for Proj<I> {
    fn eval(&self, x: [usize; N]) -> [usize; 1] {
        [x[I]]
    }
}

fn concat<const M: usize, const N: usize>(a: [usize; M], b: [usize; N]) -> [usize; M + N] {
    array::from_fn(|i| if i < M { a[i] } else { b[i - M] })
}

struct Compose<const N: usize, const I: usize, const O: usize, A, B>(A, B);

impl<const N: usize, const I: usize, const O: usize, A: PrimRec<N, I>, B: PrimRec<I, O>>
    PrimRec<N, O> for Compose<N, I, O, A, B>
{
    fn eval(&self, x: [usize; N]) -> [usize; O] {
        self.1.eval(self.0.eval(x))
    }
}

struct Rec<const N: usize, const O: usize, Base, F>(Base, F);

fn tail<const N: usize>(x: [usize; N + 1]) -> [usize; N] {
    array::from_fn(|i| x[i + 1])
}

fn cons<const N: usize>(x: usize, xs: [usize; N]) -> [usize; N + 1] {
    array::from_fn(|i| if i == 0 { x } else { xs[i - 1] })
}

impl<const N: usize, const O: usize, Base, F: PrimRec<{ O + (N + 1) }, O>> PrimRec<{ N + 1 }, O>
    for Rec<N, O, Base, F>
{
    fn eval(&self, x: [usize; N + 1]) -> [usize; O] {
        match (x[0], tail(x)) {
            (y, x) => {
                let xy = cons(y - 1, x);
                let input = concat(self.eval(xy), xy);
                self.1.eval(input)
            }
        }
    }
}

fn main() {
    let one = Compose(Zero, S);
    dbg!(one.eval([]));
    let add: Rec<1, 1, Proj<0>, Compose<3, 1, 1, Proj<0>, S>> =
        Rec(Proj::<0>, Compose(Proj::<0>, S));
    dbg!(add.eval([3, 2]));
}


original code

original:

#![feature(generic_const_exprs)]

use std::array;

trait PrimRec<const N: usize, const O: usize> {
    fn eval(&self, x: [usize; N]) -> [usize; O];
}

struct Zero;

impl<const N: usize> PrimRec<N, 1> for Zero {
    fn eval(&self, _: [usize; N]) -> [usize; 1] {
        [0]
    }
}

struct Const(usize);

impl<const N: usize> PrimRec<N, 1> for Const {
    fn eval(&self, _: [usize; N]) -> [usize; 1] {
        [self.0]
    }
}

struct S;

impl PrimRec<1, 1> for S {
    fn eval(&self, x: [usize; 1]) -> [usize; 1] {
        [x[0] + 1]
    }
}

struct Proj<const I: usize>;

impl<const N: usize, const I: usize> PrimRec<N, 1> for Proj<I> {
    fn eval(&self, x: [usize; N]) -> [usize; 1] {
        [x[I]]
    }
}

struct Merge<const N: usize, const O1: usize, const O2: usize, A: PrimRec<N, O1>, B: PrimRec<N, O2>>(
    A,
    B,
);

fn concat<const M: usize, const N: usize>(a: [usize; M], b: [usize; N]) -> [usize; M + N] {
    array::from_fn(|i| if i < M { a[i] } else { b[i - M] })
}

impl<const N: usize, const O1: usize, const O2: usize, A: PrimRec<N, O1>, B: PrimRec<N, O2>>
    PrimRec<N, { O1 + O2 }> for Merge<N, O1, O2, A, B>
{
    fn eval(&self, x: [usize; N]) -> [usize; O1 + O2] {
        concat(self.0.eval(x), self.1.eval(x))
    }
}

struct Compose<const N: usize, const I: usize, const O: usize, A: PrimRec<N, I>, B: PrimRec<I, O>>(
    A,
    B,
);

impl<const N: usize, const I: usize, const O: usize, A: PrimRec<N, I>, B: PrimRec<I, O>>
    PrimRec<N, O> for Compose<N, I, O, A, B>
{
    fn eval(&self, x: [usize; N]) -> [usize; O] {
        self.1.eval(self.0.eval(x))
    }
}

struct Rec<const N: usize, const O: usize, Base: PrimRec<N, O>, F: PrimRec<{ O + (N + 1) }, O>>(
    Base,
    F,
);

fn tail<const N: usize>(x: [usize; N + 1]) -> [usize; N] {
    array::from_fn(|i| x[i + 1])
}

fn cons<const N: usize>(x: usize, xs: [usize; N]) -> [usize; N + 1] {
    array::from_fn(|i| if i == 0 { x } else { xs[i - 1] })
}

impl<const N: usize, const O: usize, Base: PrimRec<N, O>, F: PrimRec<{ O + (N + 1) }, O>>
    PrimRec<{ N + 1 }, O> for Rec<N, O, Base, F>
{
    fn eval(&self, x: [usize; N + 1]) -> [usize; O] {
        match (x[0], tail(x)) {
            (y, x) => {
                let xy = cons(y - 1, x);
                let input = concat(self.eval(xy), xy);
                self.1.eval(input)
            }
            (y, x) => {
                let xy = cons(y - 1, x);
                let input = concat(self.eval(xy), xy);
                self.1.eval(input)
            }
        }
    }
}

fn main() {
    let one = Compose(Zero, S);
    dbg!(one.eval([]));
    let add: Rec<1, 1, Proj<0>, Compose<3, 1, 1, Proj<0>, S>> =
        Rec(Proj::<0>, Compose(Proj::<0>, S));
    dbg!(add.eval([3, 2]));
}

Version information

rustc 1.81.0-nightly (3186d17d5 2024-06-19)
binary: rustc
commit-hash: 3186d17d56f9803b739a2c0aabd23aafd8791485
commit-date: 2024-06-19
host: x86_64-unknown-linux-gnu
release: 1.81.0-nightly
LLVM version: 18.1.7

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

Program output

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

warning: function cannot return without recursing
  --> /tmp/icemaker_global_tempdir.BYeIIN3IDTg1/rustc_testrunner_tmpdir_reporting.pn272iv1coHt/mvce.rs:60:5
   |
60 |     fn eval(&self, x: [usize; N + 1]) -> [usize; O] {
   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot return without recursing
...
64 |                 let input = concat(self.eval(xy), xy);
   |                                    ------------- recursive call site
   |
   = help: a `loop` may express intention better if this is on purpose
   = note: `#[warn(unconditional_recursion)]` on by default

error: internal compiler error: compiler/rustc_monomorphize/src/collector.rs:703:50: collection encountered polymorphic constant: Ty(usize, (Add: (1_usize: usize), (1_usize: usize)))
  --> /tmp/icemaker_global_tempdir.BYeIIN3IDTg1/rustc_testrunner_tmpdir_reporting.pn272iv1coHt/mvce.rs:34:49
   |
34 |     array::from_fn(|i| if i < M { a[i] } else { b[i - M] })
   |                                                 ^^^^^^^^

thread 'rustc' panicked at compiler/rustc_monomorphize/src/collector.rs:703:50:
Box<dyn Any>
stack backtrace:
   0:     0x7e169cf9a915 - std::backtrace_rs::backtrace::libunwind::trace::h7bb2e2c0ba47a528
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/../../backtrace/src/backtrace/libunwind.rs:116:5
   1:     0x7e169cf9a915 - std::backtrace_rs::backtrace::trace_unsynchronized::h4d0192941edee661
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5
   2:     0x7e169cf9a915 - std::sys::backtrace::_print_fmt::hd97d629aac4a983f
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/sys/backtrace.rs:68:5
   3:     0x7e169cf9a915 - <std::sys::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hfbfff27250bacb87
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/sys/backtrace.rs:44:22
   4:     0x7e169cfeb4bb - core::fmt::rt::Argument::fmt::he10ba4f740dba534
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/core/src/fmt/rt.rs:165:63
   5:     0x7e169cfeb4bb - core::fmt::write::h2407ad66766d3825
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/core/src/fmt/mod.rs:1168:21
   6:     0x7e169cf8f4ff - std::io::Write::write_fmt::ha9f6e1a0fc7453ce
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/io/mod.rs:1835:15
   7:     0x7e169cf9a6ee - std::sys::backtrace::_print::h7e0f8c040736e5d1
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/sys/backtrace.rs:47:5
   8:     0x7e169cf9a6ee - std::sys::backtrace::print::h5b5a8173569d0f1f
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/sys/backtrace.rs:34:9
   9:     0x7e169cf9d129 - std::panicking::default_hook::{{closure}}::h598070fde84813fd
  10:     0x7e169cf9cecc - std::panicking::default_hook::h475a3da7dddfd122
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/panicking.rs:292:9
  11:     0x7e169953d430 - std[2bd9c63c0a80de36]::panicking::update_hook::<alloc[84d3ef64e8f78ef7]::boxed::Box<rustc_driver_impl[9baf949efeffb90b]::install_ice_hook::{closure#0}>>::{closure#0}
  12:     0x7e169cf9da4f - <alloc::boxed::Box<F,A> as core::ops::function::Fn<Args>>::call::h7852cb703cb16a8a
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/alloc/src/boxed.rs:2076:9
  13:     0x7e169cf9da4f - std::panicking::rust_panic_with_hook::h09dcd92a3eced375
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/panicking.rs:804:13
  14:     0x7e169956e111 - std[2bd9c63c0a80de36]::panicking::begin_panic::<rustc_errors[a1210feefd110a67]::ExplicitBug>::{closure#0}
  15:     0x7e169956aa46 - std[2bd9c63c0a80de36]::sys::backtrace::__rust_end_short_backtrace::<std[2bd9c63c0a80de36]::panicking::begin_panic<rustc_errors[a1210feefd110a67]::ExplicitBug>::{closure#0}, !>
  16:     0x7e1699565cd6 - std[2bd9c63c0a80de36]::panicking::begin_panic::<rustc_errors[a1210feefd110a67]::ExplicitBug>
  17:     0x7e16995773b1 - <rustc_errors[a1210feefd110a67]::diagnostic::BugAbort as rustc_errors[a1210feefd110a67]::diagnostic::EmissionGuarantee>::emit_producing_guarantee
  18:     0x7e1699cea6e8 - <rustc_errors[a1210feefd110a67]::DiagCtxtHandle>::span_bug::<rustc_span[825a5f7bcd5860db]::span_encoding::Span, alloc[84d3ef64e8f78ef7]::string::String>
  19:     0x7e1699cf5f3d - rustc_middle[1e151660401c97c9]::util::bug::opt_span_bug_fmt::<rustc_span[825a5f7bcd5860db]::span_encoding::Span>::{closure#0}
  20:     0x7e1699cf620a - rustc_middle[1e151660401c97c9]::ty::context::tls::with_opt::<rustc_middle[1e151660401c97c9]::util::bug::opt_span_bug_fmt<rustc_span[825a5f7bcd5860db]::span_encoding::Span>::{closure#0}, !>::{closure#0}
  21:     0x7e1699cf1c5b - rustc_middle[1e151660401c97c9]::ty::context::tls::with_context_opt::<rustc_middle[1e151660401c97c9]::ty::context::tls::with_opt<rustc_middle[1e151660401c97c9]::util::bug::opt_span_bug_fmt<rustc_span[825a5f7bcd5860db]::span_encoding::Span>::{closure#0}, !>::{closure#0}, !>
  22:     0x7e1699cef657 - rustc_middle[1e151660401c97c9]::util::bug::span_bug_fmt::<rustc_span[825a5f7bcd5860db]::span_encoding::Span>
  23:     0x7e169b895886 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec::{closure#0}
  24:     0x7e169aa8a20a - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  25:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  26:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  27:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  28:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  29:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  30:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  31:     0x7e169aa8a991 - rustc_monomorphize[ce7da5b91994c407]::collector::collect_items_rec
  32:     0x7e169afb40b9 - rustc_monomorphize[ce7da5b91994c407]::partitioning::collect_and_partition_mono_items
  33:     0x7e169baa5d64 - rustc_query_impl[90e082e217628c6f]::plumbing::__rust_begin_short_backtrace::<rustc_query_impl[90e082e217628c6f]::query_impl::collect_and_partition_mono_items::dynamic_query::{closure#2}::{closure#0}, rustc_middle[1e151660401c97c9]::query::erase::Erased<[u8; 24usize]>>
  34:     0x7e169baa5d49 - <rustc_query_impl[90e082e217628c6f]::query_impl::collect_and_partition_mono_items::dynamic_query::{closure#2} as core[86ed06ce5521d24]::ops::function::FnOnce<(rustc_middle[1e151660401c97c9]::ty::context::TyCtxt, ())>>::call_once
  35:     0x7e169baa5908 - rustc_query_system[79f2d7548a1d7730]::query::plumbing::try_execute_query::<rustc_query_impl[90e082e217628c6f]::DynamicConfig<rustc_query_system[79f2d7548a1d7730]::query::caches::SingleCache<rustc_middle[1e151660401c97c9]::query::erase::Erased<[u8; 24usize]>>, false, false, false>, rustc_query_impl[90e082e217628c6f]::plumbing::QueryCtxt, false>
  36:     0x7e169baa5621 - rustc_query_impl[90e082e217628c6f]::query_impl::collect_and_partition_mono_items::get_query_non_incr::__rust_end_short_backtrace
  37:     0x7e169b9039d4 - rustc_codegen_ssa[9f248794c5001305]::base::codegen_crate::<rustc_codegen_llvm[9bd2c74879613e19]::LlvmCodegenBackend>
  38:     0x7e169b8f8202 - <rustc_codegen_llvm[9bd2c74879613e19]::LlvmCodegenBackend as rustc_codegen_ssa[9f248794c5001305]::traits::backend::CodegenBackend>::codegen_crate
  39:     0x7e169b8f7b85 - rustc_interface[f14b298c5bc54b9d]::passes::start_codegen
  40:     0x7e169b8f7224 - <rustc_interface[f14b298c5bc54b9d]::queries::Queries>::codegen_and_build_linker
  41:     0x7e169b6e79f2 - rustc_interface[f14b298c5bc54b9d]::interface::run_compiler::<core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>, rustc_driver_impl[9baf949efeffb90b]::run_compiler::{closure#0}>::{closure#1}
  42:     0x7e169b6d5ce7 - std[2bd9c63c0a80de36]::sys::backtrace::__rust_begin_short_backtrace::<rustc_interface[f14b298c5bc54b9d]::util::run_in_thread_with_globals<rustc_interface[f14b298c5bc54b9d]::util::run_in_thread_pool_with_globals<rustc_interface[f14b298c5bc54b9d]::interface::run_compiler<core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>, rustc_driver_impl[9baf949efeffb90b]::run_compiler::{closure#0}>::{closure#1}, core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>>::{closure#0}, core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>>
  43:     0x7e169b6d5aaa - <<std[2bd9c63c0a80de36]::thread::Builder>::spawn_unchecked_<rustc_interface[f14b298c5bc54b9d]::util::run_in_thread_with_globals<rustc_interface[f14b298c5bc54b9d]::util::run_in_thread_pool_with_globals<rustc_interface[f14b298c5bc54b9d]::interface::run_compiler<core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>, rustc_driver_impl[9baf949efeffb90b]::run_compiler::{closure#0}>::{closure#1}, core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>>::{closure#0}, core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>>::{closure#0}::{closure#0}, core[86ed06ce5521d24]::result::Result<(), rustc_span[825a5f7bcd5860db]::ErrorGuaranteed>>::{closure#2} as core[86ed06ce5521d24]::ops::function::FnOnce<()>>::call_once::{shim:vtable#0}
  44:     0x7e169cfa78cb - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::h080d8c35a4cd7df7
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/alloc/src/boxed.rs:2062:9
  45:     0x7e169cfa78cb - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce<Args>>::call_once::hbe3e90ec6c687c94
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/alloc/src/boxed.rs:2062:9
  46:     0x7e169cfa78cb - std::sys::pal::unix::thread::Thread::new::thread_start::h9be4fe738a3fe2ed
                               at /rustc/3186d17d56f9803b739a2c0aabd23aafd8791485/library/std/src/sys/pal/unix/thread.rs:108:17
  47:     0x7e169cd40ded - <unknown>
  48:     0x7e169cdc40dc - <unknown>
  49:                0x0 - <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.81.0-nightly (3186d17d5 2024-06-19) running on x86_64-unknown-linux-gnu

query stack during panic:
#0 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack
error: aborting due to 1 previous error; 2 warnings emitted


@rustbot label +F-generic_const_exprs

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 running the reduced reproducer in ice.rs with the reported nightly rustc, then inspect compiler/rustc_monomorphize/src/collector.rs around line 703 where polymorphic constants are collected. Use the reported ICE and backtrace to trace the failure; done means the reproducer no longer causes an internal compiler error and the regression is covered by appropriate compiler testing.

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
Mostly clear
Newbie friendliness
32/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.