Closed
Description
I encountered an internal compiler error (on stable, beta and nightly) in my code and i could reduce it to this: playground link.
const NUM: u8 = std::mem::size_of::<u8>() as u8;
fn main() {
match 1 {
NUM => unimplemented!(),
_ => unimplemented!(),
}
}
I would expect that this program won't compile because of the non-const fn in a const declaration.
Nightly rightly gives an error message to that effect and panics, stable just panics.
Stacktrace:
rustc 1.20.0-nightly (3610a70ce 2017-07-05)
error[E0015]: calls in constants are limited to constant functions, struct and enum constructors
--> <anon>:2:17
|
2 | const NUM: u8 = std::mem::size_of::<u8>() as u8;
| ^^^^^^^^^^^^^^^^^^^^^^^^^
error: internal compiler error: /checkout/src/librustc_const_eval/pattern.rs:282: encountered errors lowering pattern: [ConstEval(ConstEvalErr { span: <anon>:2:17: 2:42, kind: TypeckError })]
--> <anon>:6:9
|
6 | NUM => unimplemented!(),
| ^^^
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.20.0-nightly (3610a70ce 2017-07-05) running on x86_64-unknown-linux-gnu
note: run with `RUST_BACKTRACE=1` for a backtrace
thread 'rustc' panicked at 'Box<Any>', /checkout/src/librustc_errors/lib.rs:426:8
note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace.
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::session::opt_span_bug_fmt::{{closure}}
7: rustc::session::span_bug_fmt
8: rustc_const_eval::pattern::Pattern::from_hir
9: rustc_mir::hair::cx::expr::make_mirror_unadjusted
10: rustc_mir::hair::cx::expr::<impl rustc_mir::hair::Mirror<'tcx> for &'tcx rustc::hir::Expr>::make_mirror
11: <rustc_mir::hair::ExprRef<'tcx> as rustc_mir::build::into::EvalInto<'tcx>>::eval_into
12: rustc_mir::build::block::<impl rustc_mir::build::Builder<'a, 'gcx, 'tcx>>::ast_block_stmts
13: rustc_mir::build::scope::<impl rustc_mir::build::Builder<'a, 'gcx, 'tcx>>::in_scope
14: rustc_mir::build::scope::<impl rustc_mir::build::Builder<'a, 'gcx, 'tcx>>::in_opt_scope
15: rustc_mir::build::expr::into::<impl rustc_mir::build::Builder<'a, 'gcx, 'tcx>>::into_expr
16: <rustc_mir::hair::ExprRef<'tcx> as rustc_mir::build::into::EvalInto<'tcx>>::eval_into
17: rustc_mir::build::expr::into::<impl rustc_mir::build::Builder<'a, 'gcx, 'tcx>>::into_expr
18: <rustc_mir::hair::ExprRef<'tcx> as rustc_mir::build::into::EvalInto<'tcx>>::eval_into
19: rustc_mir::build::expr::into::<impl rustc_mir::build::Builder<'a, 'gcx, 'tcx>>::into_expr
20: rustc_mir::transform::mir_const
21: rustc::ty::maps::<impl rustc::ty::maps::queries::mir_const<'tcx>>::try_get
22: rustc::ty::maps::TyCtxtAt::mir_const
23: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_const
24: rustc_mir::transform::mir_validated
25: rustc::ty::maps::<impl rustc::ty::maps::queries::mir_validated<'tcx>>::try_get
26: rustc::ty::maps::TyCtxtAt::mir_validated
27: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::mir_validated
28: rustc_borrowck::borrowck::borrowck
29: rustc::ty::maps::<impl rustc::ty::maps::queries::borrowck<'tcx>>::try_get
30: rustc::ty::maps::<impl rustc::ty::context::TyCtxt<'a, 'tcx, 'lcx>>::borrowck
31: rustc_borrowck::borrowck::check_crate
32: rustc_driver::driver::phase_3_run_analysis_passes::{{closure}}
33: rustc_driver::driver::phase_3_run_analysis_passes
34: rustc_driver::driver::compile_input
35: rustc_driver::run_compiler