Closed
Description
passing a generator as tmp into a macro caused an ICE:
#![feature(generators, generator_trait)]
use std::ops::{GeneratorState, Generator};
macro_rules! yield_from {
($generator:expr) => {
unsafe {
loop {
match $generator.resume() {
GeneratorState::Yielded(y) => yield y,
GeneratorState::Complete(ret) => break ret,
}
}
}
};
}
fn main() {
|| {
yield_from!(|| {
yield;
});
return;
};
}
Backtrace:
error: internal compiler error: librustc_mir\transform\generator.rs:495: Broken MIR: generator contains type [generator@src\lib.rs:108:25: 110:14 {()}] in MIR, but typeck only knows about for<'r> {&'r mut [generator@src\lib.rs:108:25: 110:14 {()}], std::ops::GeneratorState<(), ()>, ()}
--> src\lib.rs:107:9
|
107 | / || {
108 | | yield_from!(|| {
109 | | yield;
110 | | });
111 | | return;
112 | | };
| |_________^
thread 'main' panicked at 'Box<Any>', librustc_errors\lib.rs:499:9
stack backtrace:
0: <std::collections::hash::map::DefaultHasher as core::fmt::Debug>::fmt
1: <std::sys::windows::dynamic_lib::DynamicLibrary as core::ops::drop::Drop>::drop
2: std::panicking::take_hook
3: std::panicking::take_hook
4: <rustc::ty::SymbolName as core::fmt::Debug>::fmt
5: std::panicking::rust_panic_with_hook
6: <rustc_mir::dataflow::graphviz::Edge as core::fmt::Debug>::fmt
7: <rustc_mir::transform::uniform_array_move_out::LocalUse as core::fmt::Debug>::fmt
8: <rustc_mir::transform::qualify_consts::Qualif as core::fmt::UpperHex>::fmt
9: <rustc_mir::transform::qualify_consts::Qualif as core::fmt::UpperHex>::fmt
10: <rustc_mir::transform::qualify_consts::Qualif as core::fmt::UpperHex>::fmt
11: <rustc_mir::transform::qualify_consts::Qualif as core::fmt::UpperHex>::fmt
12: <rustc_mir::dataflow::impls::borrows::Borrows<'a, 'gcx, 'tcx> as rustc_mir::dataflow::BitDenotation>::start_block_effect
13: <rustc_mir::dataflow::impls::borrows::Borrows<'a, 'gcx, 'tcx> as rustc_mir::dataflow::BitDenotation>::start_block_effect
14: <rustc_mir::transform::generator::StateTransform as rustc_mir::transform::MirPass>::run_pass
15: <rustc_mir::transform::MirSource as core::fmt::Debug>::fmt
16: rustc_mir::transform::optimized_mir
17: rustc::ty::query::on_disk_cache::__ty_decoder_impl::<impl serialize::serialize::Decoder for rustc::ty::query::on_disk_cache::CacheDecoder<'a, 'tcx, 'x>>::read_str
18: rustc::ty::context::tls::track_diagnostic
19: rustc::ty::context::tls::track_diagnostic
20: rustc::dep_graph::graph::DepGraph::assert_ignored
21: rustc::ty::context::tls::track_diagnostic
22: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
23: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
24: rustc::ty::query::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::optimized_mir
25: rustc_mir::shim::provide
26: rustc::ty::query::on_disk_cache::__ty_decoder_impl::<impl serialize::serialize::Decoder for rustc::ty::query::on_disk_cache::CacheDecoder<'a, 'tcx, 'x>>::read_str
27: rustc::ty::context::tls::track_diagnostic
28: rustc::ty::context::tls::track_diagnostic
29: rustc::dep_graph::graph::DepGraph::assert_ignored
30: rustc::ty::context::tls::track_diagnostic
31: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
32: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
33: rustc::ty::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::instance_mir
34: rustc_mir::monomorphize::collector::collect_crate_mono_items
35: rustc_mir::monomorphize::collector::collect_crate_mono_items
36: rustc_mir::util::def_use::Info::use_count
37: <rustc_mir::dataflow::impls::borrows::Borrows<'a, 'gcx, 'tcx> as rustc_mir::dataflow::BitDenotation>::start_block_effect
38: rustc_mir::monomorphize::collector::collect_crate_mono_items
39: <rustc_codegen_llvm::time_graph::TimelineId as core::fmt::Debug>::fmt
40: <rustc_codegen_llvm::base::ValueIter as core::iter::iterator::Iterator>::next
41: rustc::ty::context::tls::track_diagnostic
42: rustc::ty::context::tls::track_diagnostic
43: rustc::dep_graph::graph::DepGraph::assert_ignored
44: rustc::ty::context::tls::track_diagnostic
45: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
46: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
47: <rustc_codegen_llvm::back::linker::MsvcLinker<'a> as rustc_codegen_llvm::back::linker::Linker>::finalize
48: rustc::ty::context::tls::track_diagnostic
49: rustc::ty::context::tls::track_diagnostic
50: rustc::dep_graph::graph::DepGraph::assert_ignored
51: rustc::ty::context::tls::track_diagnostic
52: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
53: rustc::ty::query::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_print_query_stack
54: <rustc_metadata::encoder::ImplVisitor<'a, 'tcx> as rustc::hir::itemlikevisit::ItemLikeVisitor<'v>>::visit_item
55: rustc_metadata::cstore_impl::<impl rustc::middle::cstore::CrateStore for rustc_metadata::cstore::CStore>::encode_metadata
56: rustc::ty::context::TyCtxt::encode_metadata
57: rustc_codegen_llvm::base::codegen_instance
58: <rustc_codegen_llvm::time_graph::TimelineId as core::fmt::Debug>::fmt
59: <rustc_codegen_llvm::base::ValueIter as core::iter::iterator::Iterator>::next
60: <rustc_codegen_llvm::LlvmCodegenBackend as rustc_codegen_utils::codegen_backend::CodegenBackend>::codegen_crate
61: rustc_driver::target_features::add_configuration
62: rustc_driver::driver::phase_4_codegen
63: rustc_driver::profile::dump
64: <humantime::date::Error as std::error::Error>::cause
65: <rustc_driver::pretty::IdentifiedAnnotation<'hir> as rustc_driver::pretty::PrinterSupport>::sess
66: <unknown>
67: rustc_driver::driver::compile_input
68: rustc_driver::run_compiler
69: <env_logger::filter::inner::Filter as core::fmt::Display>::fmt
70: <rustc_driver::derive_registrar::Finder as rustc::hir::itemlikevisit::ItemLikeVisitor<'v>>::visit_item
71: _rust_maybe_catch_panic
72: <rustc_driver::derive_registrar::Finder as rustc::hir::itemlikevisit::ItemLikeVisitor<'v>>::visit_item
73: rustc_driver::main
74: <unknown>
75: std::panicking::update_panic_count
76: _rust_maybe_catch_panic
77: std::rt::lang_start_internal
78: <unknown>
79: <unknown>
80: BaseThreadInitThunk
81: RtlUserThreadStart
query stack during panic:
#0 [optimized_mir] processing `internal_compiler_errors::broken_mir::{{closure}}`
#1 [mir_shims] generating MIR shim for `std::ptr::drop_in_place`
#2 [collect_and_partition_mono_items] collect_and_partition_mono_items
#3 [exported_symbols] exported_symbols
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.28.0-nightly (e3bf634e0 2018-06-28) running on x86_64-pc-windows-msvc
note: compiler flags: -C debuginfo=2 -C incremental --crate-type lib
note: some of the compiler flags provided by cargo are hidden