Skip to content

ICE: broken MIR with nested opaque types. #70971

New issue

Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? # to your account

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.heygears.com-1ecc6299db9ec823/backtrace-0.3.46/src/backtrace/libunwind.rs:86
   1: backtrace::backtrace::trace_unsynchronized
             at /cargo/registry/src/github.heygears.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 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
# for free to join this conversation on GitHub. Already have an account? # 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