Skip to content

ICE (OutputTypeParameterMismatch) with type_alias_impl_trait #72793

Description

@SNCPlay42

Code

Here's MCVE: #72793 (comment) (Edited by JohnTitor)

#![feature(type_alias_impl_trait)]

type FilteredIter<'a> = impl Iterator<Item = &'a i32> + 'a;

fn filter_positive<'a>(vals: &'a [i32]) -> FilteredIter<'a> {
    vals.iter().filter(|x| **x >= 0)
}

fn with_positive<F>(vals: &[i32], fun: F)
where
    F: Fn(FilteredIter<'_>),
{
    fun(filter_positive(vals));
}

fn main() {
    let x = vec![-1, 1, -2, 2, -3, 3];

    with_positive(&x, |iter| {
        iter.for_each(|x| println!("{}", x));
    });
}

Playground

Error output

error: internal compiler error: src/librustc_trait_selection/traits/codegen/mod.rs:62: Encountered error `OutputTypeParameterMismatch(Binder(<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(FilteredIter::<'_>,)>>), Binder(<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>,)>>), Sorts(ExpectedFound { expected: std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>, found: FilteredIter::<'_> }))` selecting `Binder(<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>,)>>)` during codegen

Prettied a bit:

error: internal compiler error: 
src/librustc_trait_selection/traits/codegen/mod.rs:62: 
Encountered error
`OutputTypeParameterMismatch(
	Binder(<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(FilteredIter::<'_>,)>>),
	Binder(<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>,)>>),
	Sorts(ExpectedFound {
		expected: std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>,
		found: FilteredIter::<'_>
	})
)`
selecting `Binder(<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>,)>>)`
during codegen
Backtrace

thread 'rustc' panicked at 'Box<Any>', src/librustc_errors/lib.rs:907:9
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:1076
   5: std::io::Write::write_fmt
             at src/libstd/io/mod.rs:1537
   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:490
  12: std::panicking::begin_panic
  13: rustc_errors::HandlerInner::bug
  14: rustc_errors::Handler::bug
  15: rustc_middle::util::bug::opt_span_bug_fmt::{{closure}}
  16: rustc_middle::ty::context::tls::with_opt::{{closure}}
  17: rustc_middle::ty::context::tls::with_opt
  18: rustc_middle::util::bug::opt_span_bug_fmt
  19: rustc_middle::util::bug::bug_fmt
  20: rustc_middle::ty::context::tls::with_context::{{closure}}
  21: rustc_trait_selection::traits::codegen::codegen_fulfill_obligation
  22: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::codegen_fulfill_obligation>::compute
  23: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  24: rustc_data_structures::stack::ensure_sufficient_stack
  25: rustc_query_system::query::plumbing::get_query_impl
  26: rustc_ty::instance::resolve_instance
  27: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::resolve_instance>::compute
  28: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  29: rustc_data_structures::stack::ensure_sufficient_stack
  30: rustc_query_system::query::plumbing::get_query_impl
  31: rustc_middle::ty::instance::Instance::resolve
  32: <rustc_mir::monomorphize::collector::MirNeighborCollector as rustc_middle::mir::visit::Visitor>::visit_terminator_kind
  33: rustc_mir::monomorphize::collector::collect_neighbours
  34: rustc_data_structures::stack::ensure_sufficient_stack
  35: rustc_mir::monomorphize::collector::collect_items_rec
  36: rustc_mir::monomorphize::collector::collect_items_rec
  37: rustc_mir::monomorphize::collector::collect_crate_mono_items
  38: rustc_mir::monomorphize::partitioning::collect_and_partition_mono_items
  39: rustc_middle::ty::query::<impl rustc_query_system::query::config::QueryAccessors<rustc_middle::ty::context::TyCtxt> for rustc_middle::ty::query::queries::collect_and_partition_mono_items>::compute
  40: rustc_query_system::dep_graph::graph::DepGraph<K>::with_task_impl
  41: rustc_data_structures::stack::ensure_sufficient_stack
  42: rustc_query_system::query::plumbing::get_query_impl
  43: rustc_codegen_ssa::base::codegen_crate
  44: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_ssa::traits::backend::CodegenBackend>::codegen_crate
  45: rustc_interface::passes::start_codegen
  46: rustc_middle::ty::context::tls::enter_global
  47: rustc_interface::queries::Queries::ongoing_codegen
  48: rustc_interface::interface::run_compiler_in_existing_thread_pool
  49: rustc_ast::attr::with_globals
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.

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.45.0-nightly (4bd32c980 2020-05-29) running on x86_64-unknown-linux-gnu

note: compiler flags: -C embed-bitcode=no -C codegen-units=1 -C debuginfo=2 --crate-type bin

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

query stack during panic:
#0 [codegen_fulfill_obligation] checking if `std::ops::Fn` fulfills its obligations
#1 [resolve_instance] resolving instance `<[closure@src/main.rs:19:23: 21:6] as std::ops::Fn<(std::iter::Filter<std::slice::Iter<i32>, [closure@src/main.rs:6:24: 6:36]>,)>>::call`
#2 [collect_and_partition_mono_items] collect_and_partition_mono_items
end of query stack

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    C-bugCategory: This is a bug.E-needs-testCall for participation: An issue has been fixed and does not reproduce, but no test has been added.F-type_alias_impl_trait`#[feature(type_alias_impl_trait)]`I-ICEIssue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.glacierICE tracked in rust-lang/glacier.requires-nightlyThis issue requires a nightly compiler in some way. When possible, use a F-* label instead.

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions