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

error: internal compiler error: librustc_mir/hair/cx/expr.rs:544: invalid loop id for break: label not found #50576

Closed
vegard opened this issue May 9, 2018 · 8 comments · Fixed by #51070
Labels
C-bug Category: This is a bug. 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

@vegard
Copy link

vegard commented May 9, 2018

Input:

fn main() {
    |bool: [u8; break 'L]| 0;
}

Output:

$ rustc -
error[E0426]: use of undeclared label `'L`
 --> <anon>:2:23
  |
2 |     |bool: [u8; break 'L]| 0;
  |                       ^^ undeclared label `'L`

error: internal compiler error: librustc_mir/hair/cx/expr.rs:544: invalid loop id for break: label not found

thread 'main' panicked at 'Box<Any>', librustc_errors/lib.rs:554:9
stack backtrace:
...
  13: rustc::session::bug_fmt
             at librustc/session/mod.rs:1256
  14: rustc_mir::hair::cx::expr::make_mirror_unadjusted
             at librustc_mir/hair/cx/expr.rs:544
  15: rustc_mir::hair::cx::expr::<impl rustc_mir::hair::Mirror<'tcx> for &'tcx rustc::hir::Expr>::make_mirror
             at librustc_mir/hair/cx/expr.rs:35
  16: rustc_mir::build::mir_build::{{closure}}
             at librustc_mir/hair/cx/mod.rs:111
             at librustc_mir/build/mod.rs:577
             at librustc_mir/build/mod.rs:145
...
Complete output
$ rustc -
error[E0426]: use of undeclared label `'L`
 --> <anon>:2:23
  |
2 |     |bool: [u8; break 'L]| 0;
  |                       ^^ undeclared label `'L`

error: internal compiler error: librustc_mir/hair/cx/expr.rs:544: invalid loop id for break: label not found

thread 'main' panicked at 'Box<Any>', librustc_errors/lib.rs:554:9
stack backtrace:
   0: std::sys::unix::backtrace::tracing::imp::unwind_backtrace
             at libstd/sys/unix/backtrace/tracing/gcc_s.rs:49
   1: std::sys_common::backtrace::_print
             at libstd/sys_common/backtrace.rs:71
   2: std::panicking::default_hook::{{closure}}
             at libstd/sys_common/backtrace.rs:59
             at libstd/panicking.rs:211
   3: std::panicking::default_hook
             at libstd/panicking.rs:227
   4: rustc::util::common::panic_hook
             at librustc/util/common.rs:54
   5: std::panicking::rust_panic_with_hook
             at libstd/panicking.rs:467
   6: std::panicking::begin_panic
             at /home/vegard/rust/src/libstd/panicking.rs:397
   7: rustc_errors::Handler::bug
             at librustc_errors/lib.rs:554
   8: rustc::session::opt_span_bug_fmt::{{closure}}
             at librustc/session/mod.rs:1280
   9: rustc::ty::context::tls::with_opt::{{closure}}
             at librustc/ty/context.rs:1943
  10: rustc::ty::context::tls::with_context_opt
             at librustc/ty/context.rs:1880
  11: rustc::ty::context::tls::with_opt
             at librustc/ty/context.rs:1943
  12: rustc::session::opt_span_bug_fmt
             at librustc/session/mod.rs:1276
  13: rustc::session::bug_fmt
             at librustc/session/mod.rs:1256
  14: rustc_mir::hair::cx::expr::make_mirror_unadjusted
             at librustc_mir/hair/cx/expr.rs:544
  15: rustc_mir::hair::cx::expr::<impl rustc_mir::hair::Mirror<'tcx> for &'tcx rustc::hir::Expr>::make_mirror
             at librustc_mir/hair/cx/expr.rs:35
  16: rustc_mir::build::mir_build::{{closure}}
             at librustc_mir/hair/cx/mod.rs:111
             at librustc_mir/build/mod.rs:577
             at librustc_mir/build/mod.rs:145
  17: rustc_mir::build::mir_build
             at /home/vegard/rust/src/librustc/infer/mod.rs:453
             at /home/vegard/rust/src/librustc/ty/context.rs:1578
             at /home/vegard/rust/src/librustc/ty/context.rs:1844
             at /home/vegard/rust/src/librustc/ty/context.rs:1787
             at /home/vegard/rust/src/librustc/ty/context.rs:1843
             at /home/vegard/rust/src/librustc/ty/context.rs:1577
             at /home/vegard/rust/src/librustc/ty/context.rs:1905
             at /home/vegard/rust/src/librustc/ty/context.rs:1889
             at /home/vegard/rust/src/librustc/ty/context.rs:1880
             at /home/vegard/rust/src/librustc/ty/context.rs:1889
             at /home/vegard/rust/src/librustc/ty/context.rs:1900
             at /home/vegard/rust/src/librustc/ty/context.rs:1570
             at /home/vegard/rust/src/librustc/infer/mod.rs:453
             at librustc_mir/build/mod.rs:87
  18: rustc_mir::transform::mir_built
             at librustc_mir/transform/mod.rs:110
  19: rustc::ty::maps::<impl rustc::ty::maps::config::QueryConfig<'tcx> for rustc::ty::maps::queries::mir_built<'tcx>>::compute
             at librustc/ty/maps/plumbing.rs:723
  20: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/dep_graph/graph.rs:343
  21: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  22: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
             at librustc/ty/maps/plumbing.rs:606
  23: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_built
             at librustc/ty/maps/plumbing.rs:776
             at librustc/ty/maps/plumbing.rs:769
  24: rustc_mir::transform::check_unsafety::unsafety_check_result
             at librustc_mir/transform/check_unsafety.rs:327
  25: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/ty/maps/plumbing.rs:723
             at librustc/dep_graph/graph.rs:343
  26: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  27: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
             at librustc/ty/maps/plumbing.rs:606
  28: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::unsafety_check_result
             at librustc/ty/maps/plumbing.rs:776
             at librustc/ty/maps/plumbing.rs:769
  29: rustc_mir::transform::mir_const
             at librustc_mir/transform/mod.rs:191
  30: rustc::ty::maps::<impl rustc::ty::maps::config::QueryConfig<'tcx> for rustc::ty::maps::queries::mir_const<'tcx>>::compute
             at librustc/ty/maps/plumbing.rs:723
  31: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/dep_graph/graph.rs:343
  32: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  33: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
             at librustc/ty/maps/plumbing.rs:606
  34: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_const
             at librustc/ty/maps/plumbing.rs:776
             at librustc/ty/maps/plumbing.rs:769
  35: rustc_mir::transform::qualify_consts::mir_const_qualif
             at librustc_mir/transform/qualify_consts.rs:1130
  36: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/ty/maps/plumbing.rs:723
             at librustc/dep_graph/graph.rs:343
  37: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  38: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
             at librustc/ty/maps/plumbing.rs:606
  39: rustc_mir::interpret::const_eval::const_eval_provider
             at librustc_mir/interpret/const_eval.rs:459
  40: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/ty/maps/plumbing.rs:723
             at librustc/dep_graph/graph.rs:343
  41: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  42: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::try_get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
  43: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_const
             at librustc/ty/maps/plumbing.rs:606
             at librustc/ty/maps/plumbing.rs:776
             at librustc/ty/maps/plumbing.rs:769
             at librustc/traits/project.rs:436
  44: <rustc::traits::project::AssociatedTypeNormalizer<'a, 'b, 'gcx, 'tcx> as rustc::ty::fold::TypeFolder<'gcx, 'tcx>>::fold_ty
             at librustc/ty/structural_impls.rs:1176
             at librustc/ty/structural_impls.rs:857
             at librustc/traits/project.rs:346
  45: rustc_typeck::check::Inherited::normalize_associated_types_in
             at /home/vegard/rust/src/librustc/ty/structural_impls.rs:890
             at /home/vegard/rust/src/librustc/traits/project.rs:324
             at /home/vegard/rust/src/librustc/traits/project.rs:283
             at /home/vegard/rust/src/librustc/traits/project.rs:267
             at /home/vegard/rust/src/librustc/infer/mod.rs:1358
             at librustc_typeck/check/mod.rs:677
  46: <rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx> as rustc_typeck::astconv::AstConv<'gcx, 'tcx>>::normalize_ty
             at librustc_typeck/check/mod.rs:2075
             at librustc_typeck/check/mod.rs:1776
  47: <rustc_typeck::astconv::AstConv<'gcx, 'tcx> + 'o>::ast_ty_to_ty
             at librustc_typeck/astconv.rs:1095
  48: rustc_typeck::check::closure::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::supplied_sig_of_closure
             at librustc_typeck/check/closure.rs:604
             at /home/vegard/rust/src/libcore/ops/function.rs:271
             at /home/vegard/rust/src/libcore/option.rs:404
             at /home/vegard/rust/src/libcore/iter/mod.rs:1347
             at /home/vegard/rust/src/libcore/iter/mod.rs:814
             at /home/vegard/rust/src/librustc_data_structures/array_vec.rs:197
             at /home/vegard/rust/src/librustc_data_structures/accumulate_vec.rs:113
             at /home/vegard/rust/src/libcore/iter/iterator.rs:1375
             at /home/vegard/rust/src/librustc/ty/context.rs:2729
             at /home/vegard/rust/src/librustc/ty/context.rs:2717
             at /home/vegard/rust/src/librustc/ty/context.rs:2569
             at librustc_typeck/check/closure.rs:610
  49: rustc_typeck::check::closure::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::sig_of_closure_no_expectation
             at librustc_typeck/check/closure.rs:379
  50: rustc_typeck::check::closure::<impl rustc_typeck::check::FnCtxt<'a, 'gcx, 'tcx>>::check_closure
             at librustc_typeck/check/closure.rs:365
             at librustc_typeck/check/closure.rs:88
  51: rustc_typeck::check::FnCtxt::check_expr_kind
             at librustc_typeck/check/closure.rs:66
             at librustc_typeck/check/mod.rs:3910
  52: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_needs
             at librustc_typeck/check/mod.rs:3530
  53: rustc_typeck::check::FnCtxt::check_block_with_expected::{{closure}}
             at librustc_typeck/check/mod.rs:2864
             at librustc_typeck/check/mod.rs:2868
             at librustc_typeck/check/mod.rs:4296
             at librustc_typeck/check/mod.rs:4361
  54: rustc_typeck::check::FnCtxt::check_block_with_expected
             at librustc_typeck/check/mod.rs:5070
             at librustc_typeck/check/mod.rs:4359
  55: rustc_typeck::check::FnCtxt::check_expr_kind
             at librustc_typeck/check/mod.rs:3913
  56: rustc_typeck::check::FnCtxt::check_expr_with_expectation_and_needs
             at librustc_typeck/check/mod.rs:3530
  57: rustc_typeck::check::FnCtxt::check_return_expr
             at librustc_typeck/check/mod.rs:2864
             at librustc_typeck/check/mod.rs:2858
             at librustc_typeck/check/mod.rs:2996
  58: rustc_typeck::check::check_fn
             at librustc_typeck/check/mod.rs:1081
  59: rustc_typeck::check::typeck_tables_of::{{closure}}
             at librustc_typeck/check/mod.rs:871
  60: rustc_typeck::check::typeck_tables_of
             at librustc_typeck/check/mod.rs:617
             at /home/vegard/rust/src/librustc/infer/mod.rs:453
             at /home/vegard/rust/src/librustc/ty/context.rs:1578
             at /home/vegard/rust/src/librustc/ty/context.rs:1844
             at /home/vegard/rust/src/librustc/ty/context.rs:1787
             at /home/vegard/rust/src/librustc/ty/context.rs:1843
             at /home/vegard/rust/src/librustc/ty/context.rs:1577
             at /home/vegard/rust/src/librustc/ty/context.rs:1905
             at /home/vegard/rust/src/librustc/ty/context.rs:1889
             at /home/vegard/rust/src/librustc/ty/context.rs:1880
             at /home/vegard/rust/src/librustc/ty/context.rs:1889
             at /home/vegard/rust/src/librustc/ty/context.rs:1900
             at /home/vegard/rust/src/librustc/ty/context.rs:1570
             at /home/vegard/rust/src/librustc/infer/mod.rs:453
             at librustc_typeck/check/mod.rs:617
             at librustc_typeck/check/mod.rs:855
  61: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/ty/maps/plumbing.rs:723
             at librustc/dep_graph/graph.rs:343
  62: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  63: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
             at librustc/ty/maps/plumbing.rs:606
  64: rustc::ty::maps::<impl rustc::ty::maps::queries::typeck_tables_of<'tcx>>::ensure
             at librustc/ty/maps/plumbing.rs:574
             at librustc/ty/maps/plumbing.rs:740
  65: rustc_typeck::check::typeck_item_bodies
             at librustc_typeck/check/mod.rs:715
             at /home/vegard/rust/src/librustc/session/mod.rs:318
             at librustc_typeck/check/mod.rs:713
  66: rustc::dep_graph::graph::DepGraph::with_task_impl
             at librustc/ty/maps/plumbing.rs:723
             at librustc/dep_graph/graph.rs:343
  67: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::force_query_with_job
             at librustc/dep_graph/graph.rs:209
             at librustc/ty/maps/plumbing.rs:530
             at librustc/ty/maps/plumbing.rs:200
             at librustc/ty/context.rs:1844
             at librustc/ty/context.rs:1787
             at librustc/ty/context.rs:1843
             at librustc/ty/maps/plumbing.rs:199
             at librustc/ty/context.rs:1905
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1880
             at librustc/ty/context.rs:1889
             at librustc/ty/context.rs:1900
             at librustc/ty/maps/plumbing.rs:189
             at librustc/ty/maps/plumbing.rs:523
  68: rustc::ty::maps::plumbing::<impl rustc::ty::context::TyCtxt<'a, 'gcx, 'tcx>>::get_query
             at librustc/ty/maps/plumbing.rs:372
             at librustc/ty/maps/plumbing.rs:599
             at librustc/ty/maps/plumbing.rs:606
  69: rustc_typeck::check_crate
             at librustc_typeck/check/mod.rs:706
             at librustc_typeck/lib.rs:344
             at /home/vegard/rust/src/librustc/util/common.rs:166
             at /home/vegard/rust/src/librustc/util/common.rs:160
             at librustc_typeck/lib.rs:344
  70: rustc::ty::context::TyCtxt::create_and_enter
             at librustc_driver/driver.rs:1121
             at /home/vegard/rust/src/librustc/ty/context.rs:1867
             at /home/vegard/rust/src/librustc/ty/context.rs:1844
             at /home/vegard/rust/src/librustc/ty/context.rs:1787
             at /home/vegard/rust/src/librustc/ty/context.rs:1843
             at /home/vegard/rust/src/librustc/ty/context.rs:1866
             at /home/vegard/rust/src/librustc/ty/context.rs:1833
             at /home/vegard/rust/src/libstd/thread/local.rs:294
             at /home/vegard/rust/src/libstd/thread/local.rs:248
             at /home/vegard/rust/src/librustc/ty/context.rs:1825
             at /home/vegard/rust/src/libstd/thread/local.rs:294
             at /home/vegard/rust/src/libstd/thread/local.rs:248
             at /home/vegard/rust/src/librustc/ty/context.rs:1817
             at /home/vegard/rust/src/librustc/ty/context.rs:1855
             at /home/vegard/rust/src/librustc/ty/context.rs:1299
  71: rustc_driver::driver::compile_input
             at librustc_driver/driver.rs:1095
             at librustc_driver/driver.rs:231
  72: rustc_driver::run_compiler
             at librustc_driver/lib.rs:540
             at librustc_driver/lib.rs:457
             at /home/vegard/.cargo/registry/src/github.com-1ecc6299db9ec823/scoped-tls-0.1.1/src/lib.rs:155
             at /home/vegard/rust/src/libsyntax/lib.rs:97
             at /home/vegard/.cargo/registry/src/github.com-1ecc6299db9ec823/scoped-tls-0.1.1/src/lib.rs:155
             at /home/vegard/rust/src/libsyntax/lib.rs:96
             at librustc_driver/lib.rs:456
  73: rustc_driver::monitor::{{closure}}
             at librustc_driver/lib.rs:1684
             at librustc_driver/lib.rs:174
             at librustc_driver/lib.rs:1598
  74: __rust_maybe_catch_panic
             at libpanic_unwind/lib.rs:105
  75: rustc_driver::run
             at /home/vegard/rust/src/libstd/panicking.rs:289
             at /home/vegard/rust/src/libstd/panic.rs:374
             at librustc_driver/lib.rs:1530
             at librustc_driver/lib.rs:1597
             at librustc_driver/lib.rs:173
  76: rustc_driver::main
             at librustc_driver/lib.rs:1677
  77: std::rt::lang_start::{{closure}}
             at /home/vegard/rust/src/libstd/rt.rs:74
  78: std::panicking::try::do_call
             at libstd/rt.rs:59
             at libstd/panicking.rs:310
  79: __rust_maybe_catch_panic
             at libpanic_unwind/lib.rs:105
  80: std::rt::lang_start_internal
             at libstd/panicking.rs:289
             at libstd/panic.rs:374
             at libstd/rt.rs:58
  81: main
  82: __libc_start_main
  83: _start
query stack during panic:
#0 [mir_built] processing `main::{{closure}}::{{initializer}}`
#1 [unsafety_check_result] processing `main::{{closure}}::{{initializer}}`
#2 [mir_const] processing `main::{{closure}}::{{initializer}}`
#3 [mir_const_qualif] processing `main::{{closure}}::{{initializer}}`
#4 [const_eval] const-evaluating `main::{{closure}}::{{initializer}}`
#5 [typeck_tables_of] processing `main`
#6 [typeck_item_bodies] type-checking all item bodies
end of query stack
error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0426`.

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

On commit c166b03

@kennytm kennytm 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. C-bug Category: This is a bug. labels May 9, 2018
@vegard
Copy link
Author

vegard commented May 9, 2018

Here's another input that causes a similar enough crash that I don't want to open another issue for it (but let me know if I should do it anyway):

fn main() {
    Vec::<[u8; break]>::new();
}

Output:

error[E0268]: `break` outside of loop
 --> <anon>:2:16
  |
2 |     Vec::<[u8; break]>::new();
  |                ^^^^^ cannot break outside of a loop

error: internal compiler error: librustc_mir/hair/cx/expr.rs:544: invalid loop id for break: not inside loop scope

thread 'main' panicked at 'Box<Any>', librustc_errors/lib.rs:554:9
note: Run with `RUST_BACKTRACE=1` for a backtrace.
error: aborting due to 2 previous errors

And if you put a loop {} around it:

fn main() {
    loop {
        Vec::<[u8; break]>::new();
    }
}

Output:
error: internal compiler error: librustc_typeck/check/mod.rs:501: could not find enclosing breakable with id 13

@vegard
Copy link
Author

vegard commented May 11, 2018

This also looks like it might be part of the same problem:

fn main() {
    move |u8: u8| while true {
        [u8; continue]
    };
}

Output:

error: internal compiler error: librustc_mir/build/scope.rs:552: no enclosing breakable scope found
 --> <anon>:3:14
  |
3 |         [u8; continue]
  |              ^^^^^^^^

thread 'main' panicked at 'Box<Any>', librustc_errors/lib.rs:499:9

est31 added a commit to est31/rust that referenced this issue May 17, 2018
This turns an ICE on this code:

fn main() {
    |_: [u8; break]| ();
}

from
    'assertion failed: self.tcx.sess.err_count() > 0', librustc_typeck/check/mod.rs
to
    librustc_mir/hair/cx/expr.rs:543: invalid loop id for break: not inside loop scope

which is at a later stage during compilation and most importantly
fixes of bug rust-lang#50576 will fix this as well.
@est31
Copy link
Member

est31 commented May 17, 2018

Found another ICE:

fn main() {
    |_: [u8; break]| ();
}

This one's giving a different ICE though. Made a PR to make it be the same ICE (the change is needed anyway): #50849

@est31
Copy link
Member

est31 commented May 17, 2018

I gave this bug a look. My results: const eval attempts to build MIR but MIR building fails because MIR building expects break destinations to be well formed. This only dawned to me when I looked at stack traces but I guess it is obvious from the code invoked as well as the place the ICE occurs.

In vanilla compilation, it seems that code like this is handled by MIR not being built if typecheck failed, but apparently this isn't upheld during const eval. Apparently const eval runs here during type check... at least according to stack traces.

No idea what a good way of fixing this is. Making MIR building failible? Somehow running type check during type check? Maybe adding some tainted_by_errors checks will fix this?

It feels weird tho that only this code runs into this particular constellation.

kennytm added a commit to kennytm/rust that referenced this issue May 22, 2018
…woerister

CheckLoopVisitor: also visit closure arguments

This turns the ICE rust-lang#50581 in this code:

```rust
fn main() {
    |_: [u8; break]| ();
}
```

from
```
    'assertion failed: self.tcx.sess.err_count() > 0', librustc_typeck/check/mod.rs
```
to
```
    librustc_mir/hair/cx/expr.rs:543: invalid loop id for break: not inside loop scope
```

which is an ICE as well but at a later stage during compilation and most importantly
fixes of bug rust-lang#50576 will fix this as well.

As this "only" moves an ICE to a later stage, I didn't add any tests.

Now I have manually verified the default impls of the visitor trait to check whether we have missed any other opportunity to visit more stuff and coudln't find anything (except the missing `break` visit I've fixed in rust-lang#50829 but that one was already r+'d so I didn't want to push more commits).
@est31
Copy link
Member

est31 commented May 24, 2018

cc @oli-obk as this is miri related

@oli-obk
Copy link
Contributor

oli-obk commented May 24, 2018

I think this is essentially the same issue as #50637

Apparently const eval runs here during type check

Yes, and that's necessary, otherwise you couldn't figure out that [T; 2] and [T; 1 + 1] are the same type.

No idea what a good way of fixing this is. Making MIR building failible? Somehow running type check during type check? Maybe adding some tainted_by_errors checks will fix this?

The latter sounds like it would be about right. Essentially const eval should return the TypeckError error variant whenever it encounters a type that has is tainted_by_errors. Backtraces into the ICEs above should show where such a type is used.

@oli-obk
Copy link
Contributor

oli-obk commented May 24, 2018

E.g. the following code should not report a typeck error about array length 56:

fn main() {
    let x: [u8; {
        let mut x = 42;
        while x < 50 {
            x += 7;
        }
        x
    }] = [0; 0];
}

@est31
Copy link
Member

est31 commented May 24, 2018

Oh I think I know what happens: type check doesn't actually fail. I'll send a patch tomorrow or on saturday when I actually can try out a possible fix. Until then, thanks for the help @oli-obk !

est31 added a commit to est31/rust that referenced this issue May 26, 2018
Lone breaks outside of loops create errors in the
loop check pass but as they are not fatal,
compilation continues.

MIR building code assumes all HIR break statements
to point to valid locations and fires ICEs if this
assumption is violated. In normal compilation,
this causes no issues, as code apparently prevents
MIR from being built if errors are present.

However, before that, typecheck runs and with it
MIR const eval. Here we operate differently
from normal compilation: it doesn't check for any
errors except for type checker ones and then
directly builds the MIR.

This constellation causes an ICE-on-error if
bogus break statements are being put into array
length expressions.

This commit fixes this ICE by letting typecheck
fail if bogus break statements are encountered.
This way, MIR const eval fails cleanly with a
type check error.

Fixes rust-lang#50576
Fixes rust-lang#50581
kennytm added a commit to kennytm/rust that referenced this issue May 26, 2018
Fail typecheck if we encounter a bogus break

Lone breaks outside of loops create errors in the
loop check pass but as they are not fatal,
compilation continues.

MIR building code assumes all HIR break statements
to point to valid locations and fires ICEs if this
assumption is violated. In normal compilation,
this causes no issues, as code apparently prevents
MIR from being built if errors are present.

However, before that, typecheck runs and with it
MIR const eval. Here we operate differently
from normal compilation: it doesn't check for any
errors except for type checker ones and then
directly builds the MIR.

This constellation causes an ICE-on-error if
bogus break statements are being put into array
length expressions.

This commit fixes this ICE by letting typecheck
fail if bogus break statements are encountered.
This way, MIR const eval fails cleanly with a
type check error.

Fixes rust-lang#50576
Fixes rust-lang#50581
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
C-bug Category: This is a bug. 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.

4 participants