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

"Broken MIR" ICE when using runtime crate #61731

Open
msizanoen opened this issue Jun 11, 2019 · 6 comments

Comments

Projects
None yet
6 participants
@msizanoen
Copy link

commented Jun 11, 2019

Fail-to-compile code:

#![feature(async_await)]

use futures::prelude::*;
use runtime::net::TcpListener;
use std::io;

#[runtime::main]
async fn main() -> io::Result<()> {
    let mut listener = TcpListener::bind("127.0.0.1:12345")?;
    let mut incoming = listener.incoming();
    while let Some(stream) = incoming.next().await {
        runtime::spawn(async move {
            let stream = stream?;
            let (mut rd, mut wr) = stream.split();
            rd.copy_into(&mut wr).await?;
            Ok::<_, std::io::Error>(())
        });
    }

    Ok(())
}

Error message:

   Compiling rtecho v0.1.0 (/home/sirius/rtecho)
error: internal compiler error: src/librustc_mir/transform/generator.rs:540: Broken MIR: generator contains type runtime::task::JoinHandle<std::result::Result<(), std::io::Error>> in MIR, but typeck only knows about for<'r, 's, 't0> {runtime::net::tcp::TcpListener, runtime::net::tcp::Incoming<'r>, futures_util::stream::next::Next<'s, runtime::net::tcp::Incoming<'t0>>, ()}
 --> src/main.rs:7:1
  |
7 | #[runtime::main]
  | ^^^^^^^^^^^^^^^^

thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:572:9
stack backtrace:
   0: 0xb571f638 - backtrace::backtrace::libunwind::trace::h2d31d29820972887
                       at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/libunwind.rs:88
   1: 0xb571f638 - backtrace::backtrace::trace_unsynchronized::h9ca3ecbe3c54ada5
                       at /cargo/registry/src/github.com-1ecc6299db9ec823/backtrace-0.3.29/src/backtrace/mod.rs:66
   2: 0xb571f638 - std::sys_common::backtrace::_print::hb41a9429afcb2ffa
                       at src/libstd/sys_common/backtrace.rs:47
   3: 0xb571f638 - std::sys_common::backtrace::print::hcaa481e2ae622640
                       at src/libstd/sys_common/backtrace.rs:36
   4: 0xb571f638 - std::panicking::default_hook::{{closure}}::h2af0ce3430227ffd
                       at src/libstd/panicking.rs:198
   5: 0xb571f244 - std::panicking::default_hook::hc047f542655530b6
                       at src/libstd/panicking.rs:212
   6: 0xb475d074 - rustc::util::common::panic_hook::h7347d59a0792e813
   7: 0xb571fddc - std::panicking::rust_panic_with_hook::h07d0f4dd4c8050d6
                       at src/libstd/panicking.rs:479
   8: 0xb519c6a0 - std::panicking::begin_panic::h2c922964066c85f9
   9: 0xb51ea02c - rustc_errors::Handler::span_bug::h2c1c0a8ab667fab8
  10: 0xb4f71378 - rustc::util::bug::opt_span_bug_fmt::{{closure}}::h1500601a36607631
  11: 0xb4f6fb40 - rustc::ty::context::tls::with_opt::{{closure}}::h8aac2f2ae7c9fd12
  12: 0xb4f6fad4 - rustc::ty::context::tls::with_context_opt::h0dcdd93b89d72608
  13: 0xb4f6fb00 - rustc::ty::context::tls::with_opt::hf19eba58424f6994
  14: 0xb4f71288 - rustc::util::bug::opt_span_bug_fmt::hd64cf9a90a48134b
  15: 0xb4f71254 - rustc::util::bug::span_bug_fmt::h96da24e0ca1951e6
  16: 0xb5196d90 - <rustc_mir::transform::generator::StateTransform as rustc_mir::transform::MirPass>::run_pass::hec8dbebf6b131272
  17: 0xb4ef2dbc - rustc_mir::transform::run_passes::{{closure}}::hc6795771803246b4
  18: 0xb4ef2a94 - rustc_mir::transform::run_passes::hb7f85c17f2ad6ed4
  19: 0xb4ef3768 - rustc_mir::transform::optimized_mir::hb4c1147cf3c6a714
  20: 0xb46f8a0c - rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::optimized_mir>::compute::ha478417c36b9a96b
  21: 0xb42fa008 - rustc::dep_graph::graph::DepGraph::with_task_impl::heb9fba9bb55b1ebc
  22: 0xb45e3720 - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::hc3c5b89b47d3aa20
  23: 0xb427df38 - rustc::ty::layout::LayoutCx<rustc::ty::context::TyCtxt>::layout_raw_uncached::h92929fb5f59c11d3
  24: 0xb427c610 - rustc::ty::layout::layout_raw::hc4f829bf7a84bee3
  25: 0xb4377e20 - rustc::ty::query::__query_compute::layout_raw::haaa4b7bfd54b916f
  26: 0xb46f93a0 - rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::layout_raw>::compute::h912efc661325f36b
  27: 0xb42c26fc - rustc::dep_graph::graph::DepGraph::with_task_impl::h08bc5ac169eb8885
  28: 0xb4583abc - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::h683eebb3c25a9f7d
  29: 0xb4285fac - <rustc::ty::layout::LayoutCx<rustc::ty::context::TyCtxt> as rustc_target::abi::LayoutOf>::layout_of::h6fe5b876700cc14c
  30: 0xb47a68b8 - <&mut I as core::iter::traits::iterator::Iterator>::next::he00b2dc4a819971c
  31: 0xb48829e8 - <alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter::hae6e8ef7c1bc1857
  32: 0xb4226604 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once::h586d2178388ba51d
  33: 0xb4883ad0 - <alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter::hb39bad92b705fc8f
  34: 0xb427ce9c - rustc::ty::layout::LayoutCx<rustc::ty::context::TyCtxt>::layout_raw_uncached::h92929fb5f59c11d3
  35: 0xb427c610 - rustc::ty::layout::layout_raw::hc4f829bf7a84bee3
  36: 0xb4377e20 - rustc::ty::query::__query_compute::layout_raw::haaa4b7bfd54b916f
  37: 0xb46f93a0 - rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::layout_raw>::compute::h912efc661325f36b
  38: 0xb42c26fc - rustc::dep_graph::graph::DepGraph::with_task_impl::h08bc5ac169eb8885
  39: 0xb4583abc - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::h683eebb3c25a9f7d
  40: 0xb4285fac - <rustc::ty::layout::LayoutCx<rustc::ty::context::TyCtxt> as rustc_target::abi::LayoutOf>::layout_of::h6fe5b876700cc14c
  41: 0xb47a5c74 - <&mut I as core::iter::traits::iterator::Iterator>::next::h80abf7a3121e3e5e
  42: 0xb4861bac - <alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter::h05d6962c084de4a0
  43: 0xb4227024 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &mut F>::call_once::ha22cc4109fa256b1
  44: 0xb47a4b2c - <&mut I as core::iter::traits::iterator::Iterator>::next::h2a270222e2a891ba
  45: 0xb4864c14 - <alloc::vec::Vec<T> as alloc::vec::SpecExtend<T,I>>::from_iter::h13ec37d27edc3501
  46: 0xb427dfb4 - rustc::ty::layout::LayoutCx<rustc::ty::context::TyCtxt>::layout_raw_uncached::h92929fb5f59c11d3
  47: 0xb427c610 - rustc::ty::layout::layout_raw::hc4f829bf7a84bee3
  48: 0xb4377e20 - rustc::ty::query::__query_compute::layout_raw::haaa4b7bfd54b916f
  49: 0xb46f93a0 - rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::layout_raw>::compute::h912efc661325f36b
  50: 0xb42c26fc - rustc::dep_graph::graph::DepGraph::with_task_impl::h08bc5ac169eb8885
  51: 0xb4583abc - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::h683eebb3c25a9f7d
  52: 0xb4285fac - <rustc::ty::layout::LayoutCx<rustc::ty::context::TyCtxt> as rustc_target::abi::LayoutOf>::layout_of::h6fe5b876700cc14c
  53: 0xb4f4bd7c - <rustc_mir::transform::const_prop::ConstPropagator as rustc::mir::visit::MutVisitor>::visit_statement::h4ba189d0f6dc4b28
  54: 0xb4f46238 - <rustc_mir::transform::const_prop::ConstProp as rustc_mir::transform::MirPass>::run_pass::h4538fb6fc0235ad9
  55: 0xb4ef2dbc - rustc_mir::transform::run_passes::{{closure}}::hc6795771803246b4
  56: 0xb4ef2a94 - rustc_mir::transform::run_passes::hb7f85c17f2ad6ed4
  57: 0xb4ef3768 - rustc_mir::transform::optimized_mir::hb4c1147cf3c6a714
  58: 0xb46f8a0c - rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::optimized_mir>::compute::ha478417c36b9a96b
  59: 0xb42fa008 - rustc::dep_graph::graph::DepGraph::with_task_impl::heb9fba9bb55b1ebc
  60: 0xb45e3720 - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::hc3c5b89b47d3aa20
  61: 0xb46f6ec0 - rustc::ty::<impl rustc::ty::context::TyCtxt>::instance_mir::h00c0987817843de4
  62: 0xb50d005c - rustc_mir::monomorphize::collector::collect_items_rec::h265dcd4773bf226d
  63: 0xb4f977b0 - rustc_mir::monomorphize::collector::collect_crate_mono_items::{{closure}}::h159ef937882f4ccc
  64: 0xb4f71578 - rustc::util::common::time::hd3e121facb2973e9
  65: 0xb50cf04c - rustc_mir::monomorphize::collector::collect_crate_mono_items::h6916cdd741d72378
  66: 0xb4f716d8 - rustc::util::common::time::he613f5bfbad8e9af
  67: 0xb5128674 - rustc_mir::monomorphize::partitioning::collect_and_partition_mono_items::hf8d93c82ad4f69fe
  68: 0xae8a8ba4 - rustc::ty::query::__query_compute::collect_and_partition_mono_items::h48322cdde7675cad
  69: 0xae8d1da0 - rustc::ty::query::<impl rustc::ty::query::config::QueryAccessors for rustc::ty::query::queries::collect_and_partition_mono_items>::compute::h47a73497b0993177
  70: 0xae877ad8 - rustc::dep_graph::graph::DepGraph::with_task_impl::h728173ffa2354de8
  71: 0xae8f3054 - rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt>::get_query::h3633be2d1d873f29
  72: 0xae974444 - <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_utils::codegen_backend::CodegenBackend>::codegen_crate::he7b69e00b681143d
  73: 0xb549609c - rustc::util::common::time::h3ffe0cff42c88246
  74: 0xb5446c38 - rustc_interface::passes::start_codegen::h4929930da55d1f72
  75: 0xb542f120 - rustc::ty::context::tls::enter_global::h1c6e1b52096b5554
  76: 0xb5447370 - rustc_interface::passes::BoxedGlobalCtxt::access::{{closure}}::h8902cc3e445118fe
  77: 0xb549eaf4 - rustc_interface::passes::create_global_ctxt::{{closure}}::hb8061a2e0a037d21
  78: 0xb5446058 - rustc_interface::passes::BoxedGlobalCtxt::enter::ha8a4bcdb5d2f590e
  79: 0xb5432358 - rustc_interface::queries::Query<T>::compute::h3faf0584888fd7ff
  80: 0xb5510a6c - rustc_interface::queries::<impl rustc_interface::interface::Compiler>::ongoing_codegen::h9a837d64e2a19dab
  81: 0xb57fc290 - rustc_interface::interface::run_compiler_in_existing_thread_pool::hd45106de8a079b95
  82: 0xb58641d4 - std::thread::local::LocalKey<T>::with::h4a4be7732992048e
  83: 0xb580e960 - scoped_tls::ScopedKey<T>::set::ha8f389698324989a
  84: 0xb5832fec - syntax::with_globals::h288536884bfffbbd
  85: 0xb5851410 - std::sys_common::backtrace::__rust_begin_short_backtrace::hb95161392c0e9f23
  86: 0xb572e2b8 - __rust_maybe_catch_panic
                       at src/libpanic_unwind/lib.rs:85
  87: 0xb57e59f8 - core::ops::function::FnOnce::call_once{{vtable.shim}}::h7095b5af77598ff4
  88: 0xb5703e34 - <alloc::boxed::Box<F> as core::ops::function::FnOnce<A>>::call_once::h951a9152f4cb3a2e
                       at /rustc/02564de47b40e953b5144dfd37450c16a84672f1/src/liballoc/boxed.rs:746
  89: 0xb572d05c - <alloc::boxed::Box<F> as core::ops::function::FnOnce<A>>::call_once::he7a53fc66a9b3bba
                       at /rustc/02564de47b40e953b5144dfd37450c16a84672f1/src/liballoc/boxed.rs:746
  90: 0xb572d05c - std::sys_common::thread::start_thread::hf1bbbc97dcb37476
                       at src/libstd/sys_common/thread.rs:13
  91: 0xb572d05c - std::sys::unix::thread::Thread::new::thread_start::hd4d8de3151a7cbb4
                       at src/libstd/sys/unix/thread.rs:79
query stack during panic:
#0 [optimized_mir] processing `main::main::{{closure}}#0`
#1 [layout_raw] computing layout of `[static generator@src/main.rs:7:1: 7:17 for<'r, 's, 't0> {runtime::net::tcp::TcpListener, runtime::net::tcp::Incoming<'r>, futures_util::stream::next::Next<'s, runtime::net::tcp::Incoming<'t0>>, ()}]`
#2 [layout_raw] computing layout of `std::future::GenFuture<[static generator@src/main.rs:7:1: 7:17 for<'r, 's, 't0> {runtime::net::tcp::TcpListener, runtime::net::tcp::Incoming<'r>, futures_util::stream::next::Next<'s, runtime::net::tcp::Incoming<'t0>>, ()}]>`
#3 [layout_raw] computing layout of `[static generator@src/main.rs:7:1: 7:17 {std::future::GenFuture<[static generator@src/main.rs:7:1: 7:17 for<'r, 's, 't0> {runtime::net::tcp::TcpListener, runtime::net::tcp::Incoming<'r>, futures_util::stream::next::Next<'s, runtime::net::tcp::Incoming<'t0>>, ()}]>, ()}]`
#4 [optimized_mir] processing `main`
#5 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack
error: aborting due to previous error


note: the compiler unexpectedly panicked. this is a bug.

note: we would appreciate a bug report: https://github.com/rust-lang/rust/blob/master/CONTRIBUTING.md#bug-reports

note: rustc 1.37.0-nightly (02564de47 2019-06-10) running on armv7-unknown-linux-gnueabihf

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

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

error: Could not compile `rtecho`.

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

Output of cargo-expand, if useful:

#![feature(prelude_import)]
#![no_std]
#![feature(async_await)]
#[prelude_import]
use ::std::prelude::v1::*;
#[macro_use]
extern crate std as std;
use futures::prelude::*;
use runtime::net::TcpListener;
use std::io;
fn main() -> io::Result<()> {
    async fn main() -> io::Result<()> {
        {
            let mut listener = TcpListener::bind("127.0.0.1:12345")?;
            let mut incoming = listener.incoming();
            while let Some(stream) = incoming.next().await {
                runtime::spawn(async move {
                    let stream = stream?;
                    let (mut rd, mut wr) = stream.split();
                    rd.copy_into(&mut wr).await?;
                    Ok::<_, std::io::Error>(())
                });
            }
            Ok(())
        }
    }
    runtime::raw::enter(runtime::native::Native, async { main().await })
}
@eddyb

This comment has been minimized.

Copy link
Member

commented Jun 11, 2019

@msizanoen

This comment has been minimized.

Copy link
Author

commented Jun 11, 2019

There's a workaround:

let _ = runtime::spawn(...);
@msizanoen

This comment has been minimized.

Copy link
Author

commented Jun 11, 2019

This looks similar to #61579

@kpp

This comment has been minimized.

Copy link
Contributor

commented Jun 11, 2019

I got the same issue with https://github.com/kpp/futures-async-combinators/ using rustc 1.37.0-nightly (02564de 2019-06-10)

@msizanoen

This comment has been minimized.

Copy link
Author

commented Jun 13, 2019

Additionally, this works:

drop(runtime::spawn(...));

Also see #61579 (comment)

@tmandry

This comment has been minimized.

Copy link
Contributor

commented Jun 14, 2019

I bisected this issue, and it appeared in the 2019-06-06 nightly.

I believe it is due to:

  • MIR StorageLive/StorageDead not being generated at all for the JoinHandle returned by runtime::spawn, requiring the MIR generator pass to assume it is always storage-live
  • #61079, which marks drop as borrowing, along with the fact that the generator transform pass conservatively assumes vars are always live after they've been borrowed

Together, we have both conditions required for the MIR generator pass to think it needs to save our JoinHandle in the generator: it is both storage-live and live across a suspend point. This is the same problem as @Zoxc mentioned in #61579 (comment) and also seems to be the cause of that issue.

@matthewjasper matthewjasper referenced a pull request that will close this issue Jun 15, 2019

Open

Clean up MIR drop generation #61872

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.