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 A-mir C-bug F-impl_trait_in_bindings glacier I-ICE P-low requires-nightly T-compiler

Comments

@CDirkx
Copy link
Contributor

@CDirkx 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.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.com-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 A-mir C-bug T-compiler P-low requires-nightly F-impl_trait_in_bindings A-impl-trait labels Apr 10, 2020
@DustinByfuglien
Copy link

@DustinByfuglien 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 label Apr 11, 2020
@turtleslow
Copy link

@turtleslow turtleslow commented Jul 10, 2020

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 A-mir C-bug F-impl_trait_in_bindings glacier I-ICE P-low requires-nightly T-compiler
Projects
None yet
Development

Successfully merging a pull request may close this issue.

5 participants