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

[NLL] yield-subtype.rs test ICEs #47587

Closed
spastorino opened this issue Jan 19, 2018 · 6 comments · Fixed by #47353
Closed

[NLL] yield-subtype.rs test ICEs #47587

spastorino opened this issue Jan 19, 2018 · 6 comments · Fixed by #47353
Labels
A-NLL Area: Non-lexical lifetimes (NLL) I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.

Comments

@spastorino
Copy link
Member

$ RUST_BACKTRACE=full rustc +stage1 src/test/run-pass/generator/yield-subtype.rs -Znll -Zborrowck=mir -Ztwo-phase-borrows
error: internal compiler error: librustc_mir/borrow_check/nll/universal_regions.rs:805: cannot convert `ReScope(Node(ItemLocalId(23)))` to a region vid

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.25.0-dev running on x86_64-unknown-linux-gnu

note: run with `RUST_BACKTRACE=1` for a backtrace

thread 'rustc' panicked at 'Box<Any>', librustc_errors/lib.rs:509:9
stack backtrace:
   0:     0x7f5407f6a0fb - std::sys::unix::backtrace::tracing::imp::unwind_backtrace::h89e4e024185eb251
                               at libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1:     0x7f5407f7e861 - std::sys_common::backtrace::print::h2c98df9d22a6e204
                               at libstd/sys_common/backtrace.rs:68
                               at libstd/sys_common/backtrace.rs:57
   2:     0x7f5407f5f651 - std::panicking::default_hook::{{closure}}::hc4353cdd7897b77b
                               at libstd/panicking.rs:380
   3:     0x7f5407f5f271 - std::panicking::default_hook::h9bbd1477c233f26c
                               at libstd/panicking.rs:390
   4:     0x7f5407f5f946 - std::panicking::rust_panic_with_hook::hdfded1d66d2e81cf
                               at libstd/panicking.rs:576
   5:     0x7f54020d2b0a - std::panicking::begin_panic::hc1e06300d698b4bf
                               at /home/santiago/src/oss/rust1/src/libstd/panicking.rs:537
   6:     0x7f54020b90fc - rustc_errors::Handler::bug::he87305f1ede57b19
                               at librustc_errors/lib.rs:509
   7:     0x7f5403d097ec - <std::thread::local::LocalKey<T>>::with::h5470058d3b926080
                               at librustc/session/mod.rs:1137
                               at librustc/ty/context.rs:1600
                               at librustc/ty/context.rs:1589
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:377
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:288
   8:     0x7f540386ed79 - rustc::ty::context::tls::with_opt::h2796bc91cf351e3e
                               at librustc/ty/context.rs:1585
                               at librustc/ty/context.rs:1600
   9:     0x7f5403802892 - rustc::session::opt_span_bug_fmt::hf3a2233d30c89c49
                               at librustc/session/mod.rs:1133
  10:     0x7f54037eaf29 - rustc::session::bug_fmt::h607a5b7f07dd949a
                               at librustc/session/mod.rs:1117
  11:     0x7f5405aa36c6 - rustc_mir::borrow_check::nll::universal_regions::UniversalRegionIndices::to_region_vid::he03012a5077f472e
                               at librustc_mir/borrow_check/nll/universal_regions.rs:805
  12:     0x7f5405a8c588 - rustc_mir::borrow_check::nll::subtype_constraint_generation::generate::h6bf13380917ccf40
                               at librustc_mir/borrow_check/nll/subtype_constraint_generation.rs:159
                               at librustc_mir/borrow_check/nll/subtype_constraint_generation.rs:74
                               at librustc_mir/borrow_check/nll/subtype_constraint_generation.rs:33
  13:     0x7f5405a7acdc - rustc_mir::borrow_check::nll::compute_regions::h8a28351ecd692877
                               at librustc_mir/borrow_check/nll/mod.rs:97
  14:     0x7f5405a72d5d - rustc_mir::borrow_check::do_mir_borrowck::h5527e035bdb6f90b
                               at librustc_mir/borrow_check/mod.rs:196
  15:     0x7f5405c4fbcc - <std::thread::local::LocalKey<T>>::with::h09e3d281217138a6
                               at librustc_mir/borrow_check/mod.rs:81
                               at /home/santiago/src/oss/rust1/src/librustc/infer/mod.rs:439
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1573
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:377
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:288
  16:     0x7f5405a43f0a - rustc::ty::context::tls::enter::hf92705338ff04233
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1570
  17:     0x7f5405a4666c - rustc::ty::context::GlobalCtxt::enter_local::h834852a1d0d3a09a
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1381
  18:     0x7f5405a2f3f2 - rustc::infer::InferCtxtBuilder::enter::h876297f802958ad2
                               at /home/santiago/src/oss/rust1/src/librustc/infer/mod.rs:439
  19:     0x7f5405a724ad - rustc_mir::borrow_check::mir_borrowck::ha3ddcadee42ed870
                               at librustc_mir/borrow_check/mod.rs:79
  20:     0x7f54039d2b90 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_borrowck<'tcx>>::compute_result::hf45a226b5c044941
                               at librustc/ty/maps/plumbing.rs:383
  21:     0x7f540361d108 - rustc::dep_graph::graph::DepGraph::with_task_impl::h977b285d649164fa
                               at librustc/dep_graph/graph.rs:289
  22:     0x7f54035efa0f - rustc::dep_graph::graph::DepGraph::with_task::h606c300c86adccb4
                               at librustc/dep_graph/graph.rs:199
  23:     0x7f5403b1c057 - rustc_errors::Handler::track_diagnostics::h5c4733a59e59914c
                               at librustc/ty/maps/plumbing.rs:492
                               at /home/santiago/src/oss/rust1/src/librustc_errors/lib.rs:572
  24:     0x7f540389face - rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::cycle_check::h510dda0193aa77a2
                               at librustc/ty/maps/plumbing.rs:485
                               at librustc/ty/maps/plumbing.rs:121
  25:     0x7f54039d2c92 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_borrowck<'tcx>>::force::h5b5a43ddd69d4127
                               at librustc/ty/maps/plumbing.rs:484
  26:     0x7f54039d3921 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_borrowck<'tcx>>::try_get::hb7409412e9075295
                               at librustc/ty/maps/plumbing.rs:301
                               at librustc/ty/maps/plumbing.rs:526
  27:     0x7f5403927015 - rustc::ty::maps::TyCtxtAt::mir_borrowck::hb6ba692bbeabd5e9
                               at librustc/ty/maps/plumbing.rs:565
  28:     0x7f540386a718 - rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_borrowck::h44d6f533e09947b5
                               at librustc/ty/maps/plumbing.rs:558
  29:     0x7f5405b609b5 - rustc_mir::transform::optimized_mir::h96ad9f601d2a4c3a
                               at librustc_mir/transform/mod.rs:224
  30:     0x7f54039be29c - rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::compute_result::h6bc9586df0c100de
                               at librustc/ty/maps/plumbing.rs:383
  31:     0x7f54035fa4ec - rustc::dep_graph::graph::DepGraph::with_task_impl::h0f418d56d7276c24
                               at librustc/dep_graph/graph.rs:289
  32:     0x7f54035f283f - rustc::dep_graph::graph::DepGraph::with_task::hc1043ef620363c9a
                               at librustc/dep_graph/graph.rs:199
  33:     0x7f5403b2efe9 - rustc_errors::Handler::track_diagnostics::hadbe002cf50db752
                               at librustc/ty/maps/plumbing.rs:492
                               at /home/santiago/src/oss/rust1/src/librustc_errors/lib.rs:572
  34:     0x7f54038aaf9e - rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::cycle_check::h693e209892dd1b62
                               at librustc/ty/maps/plumbing.rs:485
                               at librustc/ty/maps/plumbing.rs:121
  35:     0x7f54039be3a2 - rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::force::hdbac92685025573c
                               at librustc/ty/maps/plumbing.rs:484
  36:     0x7f54039bef59 - rustc::ty::maps::<impl rustc::ty::maps::queries::optimized_mir<'tcx>>::try_get::h9bf0895892cac397
                               at librustc/ty/maps/plumbing.rs:301
                               at librustc/ty/maps/plumbing.rs:526
  37:     0x7f54039264f0 - rustc::ty::maps::TyCtxtAt::optimized_mir::hece9302269f90869
                               at librustc/ty/maps/plumbing.rs:565
  38:     0x7f5403869933 - rustc::ty::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::generator_layout::h2a24fe370eb0bf02
                               at librustc/ty/maps/plumbing.rs:558
                               at librustc/ty/mod.rs:2408
  39:     0x7f5403aa3338 - rustc::ty::sty::ClosureSubsts::field_tys::h4e78d846c4c7b99f
                               at librustc/ty/sty.rs:385
                               at librustc/ty/sty.rs:395
  40:     0x7f5405a94fa5 - rustc_mir::borrow_check::nll::type_check::TypeChecker::check_stmt::hc0b1fc4eb739da1b
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:1237
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:1391
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:1257
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:736
  41:     0x7f5405a8f275 - rustc_mir::borrow_check::nll::type_check::type_check_internal::hb6a53cb1aaf14481
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:1529
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:147
  42:     0x7f5405c54973 - <std::thread::local::LocalKey<T>>::with::he82eb33141148d71
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:1567
                               at /home/santiago/src/oss/rust1/src/librustc/infer/mod.rs:439
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1573
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:377
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:288
  43:     0x7f5405a43cf6 - rustc::ty::context::tls::enter::h7e83703a337535c9
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1570
  44:     0x7f5405a463b1 - rustc::ty::context::GlobalCtxt::enter_local::h0621d96c5b6be670
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1381
  45:     0x7f5405a2f55c - rustc::infer::InferCtxtBuilder::enter::hd88b6ff241782a73
                               at /home/santiago/src/oss/rust1/src/librustc/infer/mod.rs:439
  46:     0x7f5405a99b58 - <rustc_mir::borrow_check::nll::type_check::TypeckMir as rustc_mir::transform::MirPass>::run_pass::hda62eb5dbe17f5d1
                               at librustc_mir/borrow_check/nll/type_check/mod.rs:1566
  47:     0x7f5405b60e42 - rustc_mir::transform::mir_const::{{closure}}::{{closure}}::h0de20d8d525be8fd
                               at librustc_mir/transform/mod.rs:169
  48:     0x7f5405b60f42 - rustc_mir::transform::mir_const::{{closure}}::hb1e9a7d1fc75a315
                               at librustc_mir/transform/mod.rs:174
  49:     0x7f5405b6056f - rustc_mir::transform::mir_const::ha9721567bbd1fc84
                               at librustc_mir/transform/mod.rs:192
  50:     0x7f54039bad1c - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_const<'tcx>>::compute_result::h22d13433e4ac1ce3
                               at librustc/ty/maps/plumbing.rs:383
  51:     0x7f540361194c - rustc::dep_graph::graph::DepGraph::with_task_impl::h6754f85d18706e9d
                               at librustc/dep_graph/graph.rs:289
  52:     0x7f54035ee31f - rustc::dep_graph::graph::DepGraph::with_task::h03a19d6cec9ab89c
                               at librustc/dep_graph/graph.rs:199
  53:     0x7f5403b26a49 - rustc_errors::Handler::track_diagnostics::h84e04bd5e8e43f45
                               at librustc/ty/maps/plumbing.rs:492
                               at /home/santiago/src/oss/rust1/src/librustc_errors/lib.rs:572
  54:     0x7f54038a705e - rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::cycle_check::h5d450ec0965c9207
                               at librustc/ty/maps/plumbing.rs:485
                               at librustc/ty/maps/plumbing.rs:121
  55:     0x7f54039bae22 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_const<'tcx>>::force::he85a45ff85b59637
                               at librustc/ty/maps/plumbing.rs:484
  56:     0x7f54039bb954 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_const<'tcx>>::try_get::h28d2986d18b02275
                               at librustc/ty/maps/plumbing.rs:301
                               at librustc/ty/maps/plumbing.rs:526
  57:     0x7f54039262f0 - rustc::ty::maps::TyCtxtAt::mir_const::h4f8bc05eeb6cccc1
                               at librustc/ty/maps/plumbing.rs:565
  58:     0x7f540386a473 - rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_const::he004809d23112ee3
                               at librustc/ty/maps/plumbing.rs:558
  59:     0x7f5405b607a9 - rustc_mir::transform::mir_validated::hf134800fbe95f026
                               at librustc_mir/transform/mod.rs:212
  60:     0x7f54039bc7dc - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_validated<'tcx>>::compute_result::h74ab2466cec6553c
                               at librustc/ty/maps/plumbing.rs:383
  61:     0x7f540361194c - rustc::dep_graph::graph::DepGraph::with_task_impl::h6754f85d18706e9d
                               at librustc/dep_graph/graph.rs:289
  62:     0x7f54035ee31f - rustc::dep_graph::graph::DepGraph::with_task::h03a19d6cec9ab89c
                               at librustc/dep_graph/graph.rs:199
  63:     0x7f5403b26d39 - rustc_errors::Handler::track_diagnostics::h853cd199344d6d16
                               at librustc/ty/maps/plumbing.rs:492
                               at /home/santiago/src/oss/rust1/src/librustc_errors/lib.rs:572
  64:     0x7f54038f283e - rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::cycle_check::hfa507479adc53f93
                               at librustc/ty/maps/plumbing.rs:485
                               at librustc/ty/maps/plumbing.rs:121
  65:     0x7f54039bc8e2 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_validated<'tcx>>::force::h1e214bd57c21da95
                               at librustc/ty/maps/plumbing.rs:484
  66:     0x7f54039bd414 - rustc::ty::maps::<impl rustc::ty::maps::queries::mir_validated<'tcx>>::try_get::hf5dc975a017672f6
                               at librustc/ty/maps/plumbing.rs:301
                               at librustc/ty/maps/plumbing.rs:526
  67:     0x7f54039263f0 - rustc::ty::maps::TyCtxtAt::mir_validated::h45ff48459758b218
                               at librustc/ty/maps/plumbing.rs:565
  68:     0x7f540386a4a3 - rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_validated::hdbdc23429ae79cdc
                               at librustc/ty/maps/plumbing.rs:558
  69:     0x7f5407422073 - rustc_borrowck::borrowck::borrowck::h4c28b8b81f9c7c9c
                               at librustc_borrowck/borrowck/mod.rs:130
  70:     0x7f54039d099c - rustc::ty::maps::<impl rustc::ty::maps::queries::borrowck<'tcx>>::compute_result::h7b0ba7aa8ea2f5ea
                               at librustc/ty/maps/plumbing.rs:383
  71:     0x7f54035f73bc - rustc::dep_graph::graph::DepGraph::with_task_impl::h03cc6e388e9bd81f
                               at librustc/dep_graph/graph.rs:289
  72:     0x7f54035ef74f - rustc::dep_graph::graph::DepGraph::with_task::h4d7d47f94085b0dc
                               at librustc/dep_graph/graph.rs:199
  73:     0x7f5403b1b894 - rustc_errors::Handler::track_diagnostics::h5b589e6cac23d674
                               at librustc/ty/maps/plumbing.rs:492
                               at /home/santiago/src/oss/rust1/src/librustc_errors/lib.rs:572
  74:     0x7f54038c374e - rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::cycle_check::h904d9c707287cca3
                               at librustc/ty/maps/plumbing.rs:485
                               at librustc/ty/maps/plumbing.rs:121
  75:     0x7f54039d0aa2 - rustc::ty::maps::<impl rustc::ty::maps::queries::borrowck<'tcx>>::force::h409818cdbf2bb909
                               at librustc/ty/maps/plumbing.rs:484
  76:     0x7f54039d16da - rustc::ty::maps::<impl rustc::ty::maps::queries::borrowck<'tcx>>::try_get::ha7f0405e162ef756
                               at librustc/ty/maps/plumbing.rs:301
                               at librustc/ty/maps/plumbing.rs:526
  77:     0x7f5403926f00 - rustc::ty::maps::TyCtxtAt::borrowck::hb4533b6244fdbf36
                               at librustc/ty/maps/plumbing.rs:565
  78:     0x7f540386a6e3 - rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::borrowck::h04686234667b58f9
                               at librustc/ty/maps/plumbing.rs:558
  79:     0x7f5407421d1e - rustc_borrowck::borrowck::check_crate::h0595475cbfb5e26f
                               at librustc_borrowck/borrowck/mod.rs:70
  80:     0x7f54083b9207 - <std::thread::local::LocalKey<T>>::with::h5c65293ff59250fe
                               at librustc_driver/driver.rs:1067
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1573
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:377
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:288
  81:     0x7f54082d671e - rustc::ty::context::tls::enter::h88b739b20317ffe4
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1570
  82:     0x7f54083b7cec - <std::thread::local::LocalKey<T>>::with::h43c40e0d4e18765b
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1557
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:377
                               at /home/santiago/src/oss/rust1/src/libstd/thread/local.rs:288
  83:     0x7f54082d61d7 - rustc::ty::context::tls::enter_global::h0e8e2e22f658e325
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1554
  84:     0x7f54082dabf5 - rustc::ty::context::TyCtxt::create_and_enter::h1843d08844146f02
                               at /home/santiago/src/oss/rust1/src/librustc/ty/context.rs:1197
  85:     0x7f540831fe27 - rustc_driver::driver::phase_3_run_analysis_passes::hdca06791b92b8d71
                               at librustc_driver/driver.rs:1017
  86:     0x7f5408311c57 - rustc_driver::driver::compile_input::h80b1c15489d523ea
                               at librustc_driver/driver.rs:220
  87:     0x7f5408303646 - rustc_driver::run_compiler::h6941f27d9cf14ec2
                               at librustc_driver/lib.rs:248
  88:     0x7f54083b097a - std::sys_common::backtrace::__rust_begin_short_backtrace::h2f40e38beb20488f
                               at librustc_driver/lib.rs:1305
                               at librustc_driver/lib.rs:132
                               at librustc_driver/lib.rs:1212
                               at /home/santiago/src/oss/rust1/src/libstd/sys_common/backtrace.rs:133
  89:     0x7f5407f93e76 - __rust_maybe_catch_panic
                               at libpanic_unwind/lib.rs:102
  90:     0x7f5408393437 - std::panicking::try::hf10cda8586478214
                               at /home/santiago/src/oss/rust1/src/libstd/panicking.rs:458
  91:     0x7f540839327d - std::panic::catch_unwind::h95b8c396b2db40d5
                               at /home/santiago/src/oss/rust1/src/libstd/panic.rs:358
  92:     0x7f54083c59f3 - <F as alloc::boxed::FnBox<A>>::call_box::h6aa43ee35a088e4c
                               at /home/santiago/src/oss/rust1/src/libstd/thread/mod.rs:405
                               at /home/santiago/src/oss/rust1/src/liballoc/boxed.rs:817
  93:     0x7f5407f86792 - std::sys_common::thread::start_thread::he35a8e58b745ed7d
                               at libstd/sys_common/thread.rs:24
  94:     0x7f5407f7b408 - std::sys::unix::thread::Thread::new::thread_start::h669389680624d627
                               at libstd/sys/unix/thread.rs:90
  95:     0x7f54017d608b - start_thread
  96:     0x7f5407c29e1e - __GI___clone
  97:                0x0 - <unknown>
@spastorino
Copy link
Member Author

#47586 is probably the same issue.

@nikomatsakis nikomatsakis added I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. A-NLL Area: Non-lexical lifetimes (NLL) WG-compiler-nll labels Jan 19, 2018
@nikomatsakis nikomatsakis added this to the NLL: Valid code works milestone Jan 19, 2018
@nikomatsakis
Copy link
Contributor

So I think the problem here is that generators are not completely integrated into the universal region setup.

First problem: The MIR visitor doesn't visit the yield_ty field. In particular, generators have a yield_ty field:

/// Yield type of the function, if it is a generator.
pub yield_ty: Option<Ty<'tcx>>,

but the MIR visitor doesn't seem to visit it:

fn super_mir(&mut self,
mir: & $($mutability)* Mir<'tcx>) {
// for best performance, we want to use an iterator rather
// than a for-loop, to avoid calling Mir::invalidate for
// each basic block.
macro_rules! basic_blocks {
(mut) => (mir.basic_blocks_mut().iter_enumerated_mut());
() => (mir.basic_blocks().iter_enumerated());
};
for (bb, data) in basic_blocks!($($mutability)*) {
self.visit_basic_block_data(bb, data);
}
for scope in &$($mutability)* mir.visibility_scopes {
self.visit_visibility_scope_data(scope);
}
self.visit_ty(&$($mutability)* mir.return_ty(), TyContext::ReturnTy(SourceInfo {
span: mir.span,
scope: ARGUMENT_VISIBILITY_SCOPE,
}));
for local in mir.local_decls.indices() {
self.visit_local_decl(local, & $($mutability)* mir.local_decls[local]);
}
self.visit_span(&$($mutability)* mir.span);
}

I would expect something like

    if let Some(yield_ty) = &$($mutability)* mir.yield_ty {
               self.visit_ty(yield_ty, TyContext::YieldTy(SourceInfo {
                    span: mir.span,
                    scope: ARGUMENT_VISIBILITY_SCOPE,
                }));
    }

@nikomatsakis
Copy link
Contributor

As a result of that, the MIR renumbering code will not replace the regions in the yield type with inference variables. You can see that if you look at the mir-dump, at least you can if you do it on my branch from #47353. This is contents of rustc.bar-{{closure}}.-------.renumber.0.mir:

fn bar::{{closure}}(_1: [generator@yield-subtype.rs:17:5: 20:6 a:&'_#15r &'_#16r str, b:&'_#17r &'_#18r str (&'_#19r str, (), &'_#20r str)]) -> ()
yields &ReScope(Node(ItemLocalId(23))) str
{

Note that the region in the yield type is a ReScope. This is because the renumber never visited it.

@nikomatsakis
Copy link
Contributor

However, it's not enough for the renumberer to visit the yield_ty. This would cause the yield type to be replaced with an inference variable, but in a way it almost makes the problem worse. We also need to "relate" the renumbered yield_ty with the "formal" type that we extract from the generator signature. This should basically follow the same model as what we do for the return type.

Let me try to explain that (in follow-up comments to come).

@nikomatsakis
Copy link
Contributor

Basically, the idea here is that all the types and regions in the Mir data structure get rewritten to use fresh variables. Separately, the universal_regions code computes what the inputs/output types ought to be, and then we use that to impose some constraints on those inference variables that appear in the types of parameters and the return slot. We want to do the same for the yield type.

The universal_regions code is in here, in the universal_regions.rs file.

The idea is that for each MIR we have a "defining type":

/// The "defining" type for this function, with all universal
/// regions instantiated. For a closure or generator, this is the
/// closure type, but for a top-level function it's the `TyFnDef`.
pub defining_ty: DefiningTy<'tcx>,

The defining type kind of captures everything we need to compute the types of the "external things", such as the function signature. For a generator, this includes the "yield type" (and "return type").

In the case of the parameters, we have some other fields in the UniversalRegions struct that stores the input/return types:

/// The return type of this function, with all regions replaced by
/// their universal `RegionVid` equivalents.
///
/// NB. Associated types in this type have not been normalized,
/// as the name suggests. =)
pub unnormalized_output_ty: Ty<'tcx>,
/// The fully liberated input types of this function, with all
/// regions replaced by their universal `RegionVid` equivalents.
///
/// NB. Associated types in these types have not been normalized,
/// as the name suggests. =)
pub unnormalized_input_tys: &'tcx [Ty<'tcx>],

(Those fields are "unnormalized", which means that associated types are not normalized. This is not especially relevant to yield types.)

I think we will want to add a yield_ty: Option<Ty<'tcx>> field to UniversalRegions alongside those fields. It will be None if this is not a generator. Otherwise, it can be initialized from the DefiningTy. I'll talk about that later.

Anyway, the code that relates the types in UniversalRegions to those appearing in the MIR is in the MIR type checker, specifically input_output.rs. For example, this loop equates the type of each function parameter found in the MIR with the type from the UniversalRegions:

// Equate expected input tys with those in the MIR.
let argument_locals = (1..).map(Local::new);
for (&unnormalized_input_ty, local) in unnormalized_input_tys.iter().zip(argument_locals) {
let input_ty = self.normalize(&unnormalized_input_ty, start_position);
let mir_input_ty = mir.local_decls[local].ty;
self.equate_normalized_input_or_output(start_position, input_ty, mir_input_ty);
}

We want to add some code after this loop like so:

assert!(
    mir.yield_ty.is_some() && universal_regions.yield_ty.is_some() ||
    mir.yield_ty.is_nome() && universal_regions.yield_ty.is_nome()
);
if let Some(mir_yield_ty) = mir.yield_ty {
    let ur_yield_ty = universal_regions.yield_ty.unwrap();
    self.equate_normalized_input_or_output(start_position, ur_yield_ty, mir_yield_ty);
}

To initialize the yield_ty field in UniversalRegions, we'll want to match on the defining type. When it is the Generator variant:

/// The MIR is a generator. The signature is that generators take
/// no parameters and return the result of
/// `ClosureSubsts::generator_return_ty`.
Generator(DefId, ty::ClosureSubsts<'tcx>, ty::GeneratorInterior<'tcx>),

we can extract the yield_ty by invoking substs.generator_yield_ty:

rust/src/librustc/ty/sty.rs

Lines 325 to 328 in 5965b79

/// Returns the type representing the yield type of the generator.
pub fn generator_yield_ty(self, def_id: DefId, tcx: TyCtxt<'_, '_, '_>) -> Ty<'tcx> {
self.closure_kind_ty(def_id, tcx)
}

@nikomatsakis
Copy link
Contributor

Oh, and I think that this test case is the same bug (it comes from a generator PR):

#![feature(nll, generators, generator_trait)]
use std::ops::Generator;

fn main() {
    let a = 1;
    let mut generator = unsafe { || {
        let b = &a;
        yield(b); // CRASH the compiler
        // adding .clone() to b or removing feature(nll) makes the compiler happy
    }};

    println!("{:?}", generator.resume());
}

bors added a commit that referenced this issue Jan 22, 2018
…akis

renumber regions in generators

This fixes #47189, but I think we still have to double check various things around how to treat generators in MIR type check + borrow check (e.g., what borrows should be invalidated by a `Suspend`? What consistency properties should type check be enforcing anyway around the "interior" type?)

Also fixes #47587 thanks to @spastorino's commit.

r? @pnkfelix
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
A-NLL Area: Non-lexical lifetimes (NLL) I-ICE Issue: The compiler panicked, giving an Internal Compilation Error (ICE) ❄️ 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.

2 participants