Skip to content

ICE: where clause with const evaluation on fn crashes, but on impl gives normal error #82835

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

Closed
Kiiyya opened this issue Mar 6, 2021 · 1 comment
Labels
A-const-generics Area: const generics (parameters and arguments) C-bug Category: This is a bug. F-const_generics `#![feature(const_generics)]` F-generic_const_exprs `#![feature(generic_const_exprs)]` glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@Kiiyya
Copy link

Kiiyya commented Mar 6, 2021

One version crashes the compiler, the other version produces a normal error.
Note that commenting out the line in main() makes it compile just fine.

Code

#![feature(const_generics)]
#![feature(const_evaluatable_checked)]

use std::sync::Arc;

pub enum Predicate<const EXPRESSION: bool> {}
pub trait Satisfied {}
impl Satisfied for Predicate<true> {}

pub trait Depth { const DEPTH: usize; }

/// Make it impossible to have cyclic Arc references.
pub struct AcArc<T: Depth, const D: usize> {
    #[allow(dead_code)]
    inner: Arc<T>,
}

impl<T: Depth, const D: usize> AcArc<T, D> {
    pub fn new(item: T) -> Self
        where Predicate<{T::DEPTH <= D}>: Satisfied, // crashes with == too.
    {
        Self {
            inner: Arc::new(item),
        }
    }
}

// With the predicate on the impl instead of on the function, it gives a "normal" error.
// Though I still feel like main() should typecheck.
// impl<T: Depth, const D: usize> AcArc<T, D>
//     where Predicate<{T::DEPTH == D}>: Satisfied,
// {
//     pub fn new(item: T) -> Self
//     {
//         Self {
//             inner: Arc::new(item),
//         }
//     }
// }

// this is where the depth increment is enforced.
// But compiler crashes without this.
// impl<T, const D: usize> Depth for AcArc<T, D>
// where
//     T: Depth,
// {
//     const DEPTH: usize = D + 1;
// }

impl Depth for u8 { const DEPTH: usize = 0; }

fn main() {
    let arc : AcArc<u8, 0> = AcArc::new(42_u8); // comment this out and it compiles just fine.

    println!("Hello, world!");
}

Meta

rustc --version --verbose:

rustc 1.52.0-nightly (caca2121f 2021-03-05)
binary: rustc
commit-hash: caca2121ffe4cb47d8ea2d9469c493995f57e0b5
commit-date: 2021-03-05
host: x86_64-pc-windows-msvc
release: 1.52.0-nightly
LLVM version: 12.0.0

Error output

PS E:\hax\rust-crashie> cargo b
   Compiling rust-crashie v0.1.0 (E:\hax\rust-crashie)

(((some irrelevant warning ommitted)))

warning: Error finalizing incremental compilation session directory `\\?\E:\hax\rust-crashie\target\debug\incremental\rust_crashie-2f5q55yas46ec\s-fwhefzjcfw-15fjgh-working`: The system cannot find the file specified. (os error 2)

warning: 4 warnings emitted

error: internal compiler error: Encountered error `Unimplemented` selecting `Binder(<^0 as Depth>)` during codegen
  |
  = note: delayed at compiler\rustc_trait_selection\src\traits\codegen.rs:68:32

error: internal compiler error: ty::ConstKind::Error constructed but no error reported.
  |
  = note: delayed at /rustc/caca2121ffe4cb47d8ea2d9469c493995f57e0b5\compiler\rustc_middle\src\ty\consts.rs:182:43

error: internal compiler error: `ErrorReported` without an error
  --> src\main.rs:53:30
   |
53 |     let arc : AcArc<u8, 0> = AcArc::new(42_u8);
   |                              ^^^^^^^^^^
   |
   = note: delayed at compiler\rustc_trait_selection\src\traits\error_reporting\mod.rs:747:31

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', compiler\rustc_errors\src\lib.rs:1012:13
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace

error: internal compiler error: unexpected panic

note: 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: rustc 1.52.0-nightly (caca2121f 2021-03-05) running on x86_64-pc-windows-msvc

note: compiler flags: -C embed-bitcode=no -C debuginfo=2 -C incremental --crate-type bin

note: some of the compiler flags provided by cargo are hidden

query stack during panic:
end of query stack
error: could not compile `rust-crashie`

To learn more, run the command again with --verbose.

Error with where on impl instead

Though I still feel like this should typecheck, at least in the future some day?

error[E0599]: the function or associated item `new` exists for struct `AcArc<_, {_: usize}>`, but its trait bounds were not satisfied
  --> src\main.rs:53:37
   |
6  | pub enum Predicate<const EXPRESSION: bool> {}
   | ------------------------------------------ doesn't satisfy `Predicate<{T::DEPTH == D}>: Satisfied`
...
13 | pub struct AcArc<T: Depth, const D: usize> {
   | ------------------------------------------ function or associated item `new` not found for this
...
53 |     let arc : AcArc<u8, 0> = AcArc::new(42_u8);
   |                                     ^^^ function or associated item cannot be called on `AcArc<_, {_: usize}>` due to unsatisfied trait bounds
   |
   = note: the following trait bounds were not satisfied:
           `Predicate<{T::DEPTH == D}>: Satisfied`
Backtrace (`FULL`)

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', compiler\rustc_errors\src\lib.rs:1012:13
stack backtrace:
   0:     0x7ffadc18879e - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h804aacc93092d135
   1:     0x7ffadc1b404c - core::fmt::write::h2daf2a210ae0d5f0
   2:     0x7ffadc17c158 - <std::io::IoSlice as core::fmt::Debug>::fmt::hfa239d9348f09840
   3:     0x7ffadc18c93d - std::panicking::take_hook::h930d1e1d0a893a3f
   4:     0x7ffadc18c409 - std::panicking::take_hook::h930d1e1d0a893a3f
   5:     0x7ffadc6b23d5 - rustc_driver::report_ice::h5f2d10e8face884a
   6:     0x7ffadc18d1a5 - std::panicking::rust_panic_with_hook::h291b58940b8c1567
   7:     0x7ffadc18cd01 - rust_begin_unwind
   8:     0x7ffadc1890ef - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h804aacc93092d135
   9:     0x7ffadc18cc59 - rust_begin_unwind
  10:     0x7ffadc1e583c - std::panicking::begin_panic_fmt::h21676d8d2c928240
  11:     0x7ffae0914c24 - rustc_errors::HandlerInner::delay_as_bug::h84ea15161c493c2b
  12:     0x7ffae09101d7 - <rustc_errors::HandlerInner as core::ops::drop::Drop>::drop::h2aadc8469749ba5c
  13:     0x7ffadc6bda87 - rustc_errors::snippet::MultilineAnnotation::increase_depth::h0d6a408d57c96b60
  14:     0x7ffadc6c46ba - rustc_errors::snippet::MultilineAnnotation::increase_depth::h0d6a408d57c96b60
  15:     0x7ffadc6bf46c - rustc_errors::snippet::MultilineAnnotation::increase_depth::h0d6a408d57c96b60
  16:     0x7ffadc6b481d - <rustc_driver::Compilation as core::fmt::Debug>::fmt::h34129260871bdb31
  17:     0x7ffadc6cccc6 - <rustc_middle::ty::SymbolName as core::fmt::Debug>::fmt::h7de05d943e0a531e
  18:     0x7ffadc6c7d24 - rustc_errors::snippet::MultilineAnnotation::increase_depth::h0d6a408d57c96b60
  19:     0x7ffadc6cddbd - <rustc_middle::ty::SymbolName as core::fmt::Debug>::fmt::h7de05d943e0a531e
  20:     0x7ffadc6f101d - <tracing_subscriber::util::TryInitError as core::fmt::Display>::fmt::hc634bfbe27699956
  21:     0x7ffadc19c83a - std::sys::windows::thread::Thread::new::h13c38e7cd538470c
  22:     0x7ffb374c7034 - BaseThreadInitThunk
  23:     0x7ffb375fd241 - RtlUserThreadStart

@Kiiyya Kiiyya 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 Mar 6, 2021
@jonas-schievink jonas-schievink added A-const-generics Area: const generics (parameters and arguments) F-generic_const_exprs `#![feature(generic_const_exprs)]` F-const_generics `#![feature(const_generics)]` requires-nightly This issue requires a nightly compiler in some way. labels Mar 6, 2021
fanninpm added a commit to fanninpm/glacier that referenced this issue Mar 12, 2021
@rust-lang-glacier-bot rust-lang-glacier-bot added the glacier ICE tracked in rust-lang/glacier. label Mar 12, 2021
@lcnr
Copy link
Contributor

lcnr commented Mar 20, 2021

same underlying issue as #83249, closing in favor of that one

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-const-generics Area: const generics (parameters and arguments) C-bug Category: This is a bug. F-const_generics `#![feature(const_generics)]` F-generic_const_exprs `#![feature(generic_const_exprs)]` glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ requires-nightly This issue requires a nightly compiler in some way. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

No branches or pull requests

4 participants