Skip to content

error: internal compiler error: unexpected panic #43774

@IgnusG

Description

@IgnusG

So I was messing around with iterators and created this horrific creature while struggling with shuffling around lifetimes and borrows:

fn prepare_async_listen<'a> (listener: &TcpListener) -> Result<impl Fn(&TcpListener) -> Result<Box<impl Iterator<Item=&TcpStream> + 'a>>> {
    let poll = Poll::new()
        .chain_err(|| "couldn't create poll")?;

    poll.register(listener, Token(0), Ready::readable() | Ready::writable(), PollOpt::edge())
        .chain_err(|| "couldn't register listener on poll")?;

    Ok(move |listener: &TcpListener| {
        let mut events = Events::with_capacity(1024);

        poll.poll(&mut events, Some(Duration::from_millis(100)))
            .chain_err(|| "polling failed")?;
        Ok(Box::new(events.iter().map(|_| &listener.accept().unwrap().0)))
    })
}

let listener = TcpListener::bind(&socket)
    .chain_err(|| "listener couldn't bind socket")?;
let async_listen = prepare_async_listen(&listener)?;

while !should_die.get() {
    trace_labeled_error!( format!("{} listener encountered a problem", desc), {
        for stream in async_listen(&listener)? {
            tx.send(stream_type(stream))
                .chain_err(|| "sending stream to core channel failed")?;
        };
    });
};

The compiler seemed so confused that it let me proceed with it and everything broke. This is the backtrace:

thread 'rustc' panicked at 'assertion failed: match *region { ty::ReLateBound(..) => false, _ => true, }', /checkout/src/librustc/infer/higher_ranked/mod.rs:493:8
stack backtrace:
   0: std::sys::imp::backtrace::tracing::imp::unwind_backtrace
             at /checkout/src/libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::_print
             at /checkout/src/libstd/sys_common/backtrace.rs:71
   2: std::panicking::default_hook::{{closure}}
             at /checkout/src/libstd/sys_common/backtrace.rs:60
             at /checkout/src/libstd/panicking.rs:380
   3: std::panicking::default_hook
             at /checkout/src/libstd/panicking.rs:390
   4: std::panicking::rust_panic_with_hook
             at /checkout/src/libstd/panicking.rs:611
   5: std::panicking::begin_panic_new
   6: rustc::infer::higher_ranked::fold_regions_in::{{closure}}
   7: rustc::ty::fold::TypeFolder::fold_ty
   8: rustc::infer::InferCtxt::match_poly_projection_predicate
   9: rustc::traits::project::confirm_param_env_candidate
  10: rustc::traits::project::confirm_candidate
  11: rustc::traits::project::opt_normalize_projection_type
  12: rustc::traits::project::normalize_projection_type
  13: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  14: rustc::traits::project::opt_normalize_projection_type
  15: rustc::traits::project::normalize_projection_type
  16: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
  17: rustc::traits::project::opt_normalize_projection_type
  18: rustc::traits::project::poly_project_and_unify_type::{{closure}}
  19: rustc::traits::project::poly_project_and_unify_type
  20: <rustc::traits::fulfill::FulfillProcessor<'a, 'b, 'gcx, 'tcx> as rustc_data_structures::obligation_forest::ObligationProcessor>::process_obligation
  21: rustc::traits::fulfill::FulfillmentContext::select
  22: rustc::traits::fulfill::FulfillmentContext::select_where_possible
  23: rustc_typeck::check::FnCtxt::select_obligations_where_possible
  24: rustc_typeck::check::FnCtxt::check_argument_types
  25: rustc_typeck::check::callee::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::confirm_builtin_call
  26: rustc_typeck::check::FnCtxt::check_expr_kind
  27: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  28: rustc_typeck::check::FnCtxt::check_expr_meets_expectation_or_error
  29: rustc_typeck::check::FnCtxt::check_expr_kind
  30: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  31: rustc_typeck::check::FnCtxt::check_decl_local
  32: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  33: rustc_typeck::check::FnCtxt::check_block_with_expected
  34: rustc_typeck::check::FnCtxt::check_expr_kind
  35: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  36: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  37: rustc_typeck::check::FnCtxt::check_block_with_expected
  38: rustc_typeck::check::FnCtxt::check_expr_kind
  39: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  40: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  41: rustc_typeck::check::FnCtxt::check_block_with_expected
  42: rustc_typeck::check::FnCtxt::check_expr_kind
  43: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  44: rustc_typeck::check::FnCtxt::check_return_expr
  45: rustc_typeck::check::check_fn
  46: rustc_typeck::check::closure::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::check_closure
  47: rustc_typeck::check::FnCtxt::check_expr_kind
  48: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  49: rustc_typeck::check::FnCtxt::check_expr_kind
  50: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  51: rustc_typeck::check::FnCtxt::check_expr_kind
  52: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  53: rustc_typeck::check::FnCtxt::check_argument_types
  54: rustc_typeck::check::callee::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::confirm_builtin_call
  55: rustc_typeck::check::FnCtxt::check_expr_kind
  56: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  57: rustc_typeck::check::FnCtxt::check_expr_meets_expectation_or_error
  58: rustc_typeck::check::FnCtxt::check_expr_kind
  59: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  60: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  61: rustc_typeck::check::FnCtxt::check_block_with_expected
  62: rustc_typeck::check::FnCtxt::check_expr_kind
  63: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  64: rustc_typeck::check::FnCtxt::check_return_expr
  65: rustc_typeck::check::check_fn
  66: rustc_typeck::check::closure::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::check_closure
  67: rustc_typeck::check::FnCtxt::check_expr_kind
  68: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  69: rustc_typeck::check::FnCtxt::check_expr_kind
  70: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  71: rustc_typeck::check::FnCtxt::check_expr_kind
  72: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  73: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  74: rustc_typeck::check::FnCtxt::check_block_with_expected
  75: rustc_typeck::check::FnCtxt::check_expr_kind
  76: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  77: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  78: rustc_typeck::check::FnCtxt::check_block_with_expected
  79: rustc_typeck::check::FnCtxt::check_expr_kind
  80: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  81: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
  82: rustc_typeck::check::FnCtxt::check_block_with_expected
  83: rustc_typeck::check::FnCtxt::check_expr_kind
  84: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  85: rustc_typeck::check::FnCtxt::check_return_expr
  86: rustc_typeck::check::check_fn
  87: rustc_typeck::check::closure::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::check_closure
  88: rustc_typeck::check::FnCtxt::check_expr_kind
  89: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  90: rustc_typeck::check::FnCtxt::check_expr_kind
  91: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  92: rustc_typeck::check::FnCtxt::check_expr_kind
  93: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  94: rustc_typeck::check::FnCtxt::check_argument_types
  95: rustc_typeck::check::callee::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::confirm_builtin_call
  96: rustc_typeck::check::FnCtxt::check_expr_kind
  97: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_lvalue_pref
  98: rustc_typeck::check::FnCtxt::check_expr_meets_expectation_or_error
  99: rustc_typeck::check::FnCtxt::check_expr_kind

It told me to report this error so I did but honestly any help with getting that code above to compile would be appreciated because that backtrace is way over my skill level and I don't know what to do with it.

Some meta:

rustc 1.20.0-nightly (9b85e1cfa 2017-07-07)
binary: rustc
commit-hash: 9b85e1cfa5aa2aaa4b5df4359a023ad793983ffc
commit-date: 2017-07-07
host: x86_64-unknown-linux-gnu
release: 1.20.0-nightly
LLVM version: 4.0

Built using mio crate and #![feature(conservative_impl_trait)]

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-impl-traitArea: `impl Trait`. Universally / existentially quantified anonymous types with static dispatch.C-bugCategory: This is a bug.I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions