diff --git a/src/librustc_mir/build/mod.rs b/src/librustc_mir/build/mod.rs index d814b092c9d69..51ebb78c74ef8 100644 --- a/src/librustc_mir/build/mod.rs +++ b/src/librustc_mir/build/mod.rs @@ -472,6 +472,13 @@ fn construct_const<'a, 'gcx, 'tcx>(hir: Cx<'a, 'gcx, 'tcx>, // Constants can't `return` so a return block should not be created. assert_eq!(builder.cached_return_block, None); + // Constants may be match expressions in which case an unreachable block may + // be created, so terminate it properly. + if let Some(unreachable_block) = builder.cached_unreachable_block { + builder.cfg.terminate(unreachable_block, source_info, + TerminatorKind::Unreachable); + } + builder.finish(vec![], None) } diff --git a/src/test/compile-fail/issue-46843.rs b/src/test/compile-fail/issue-46843.rs new file mode 100644 index 0000000000000..d88b4e568b034 --- /dev/null +++ b/src/test/compile-fail/issue-46843.rs @@ -0,0 +1,22 @@ +// Copyright 2017 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +enum Thing { This, That } + +fn non_const() -> Thing { + Thing::This +} + +pub const Q: i32 = match non_const() { //~ ERROR E0015 + Thing::This => 1, //~ ERROR unimplemented expression type + Thing::That => 0 +}; + +fn main() {}