about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEduard-Mihai Burtescu <edy.burt@gmail.com>2017-09-22 14:48:59 +0300
committerGitHub <noreply@github.com>2017-09-22 14:48:59 +0300
commita5503a33e6bfe503089cd776c97da9cc8e00bd37 (patch)
tree9887f7e0bfee51386e57adeed7c402174b9bee34
parent728e66473999abf7de5a037158df8e3a7d19be40 (diff)
parent1ad9709e0032c2f3c37c4a156419cadb7e9c17ac (diff)
downloadrust-a5503a33e6bfe503089cd776c97da9cc8e00bd37.tar.gz
rust-a5503a33e6bfe503089cd776c97da9cc8e00bd37.zip
Merge pull request #350 from RalfJung/inhabited
get rid of ad-hoc inhabitedness test
-rw-r--r--src/librustc_mir/interpret/eval_context.rs6
-rw-r--r--src/librustc_mir/interpret/terminator/mod.rs3
-rw-r--r--tests/compile-fail/never_say_never.rs3
-rw-r--r--tests/compile-fail/never_transmute_humans.rs3
-rw-r--r--tests/compile-fail/never_transmute_void.rs7
5 files changed, 12 insertions, 10 deletions
diff --git a/src/librustc_mir/interpret/eval_context.rs b/src/librustc_mir/interpret/eval_context.rs
index 8fb63b3cb2c..0d761c24593 100644
--- a/src/librustc_mir/interpret/eval_context.rs
+++ b/src/librustc_mir/interpret/eval_context.rs
@@ -1818,7 +1818,7 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
                 let val = match val {
                     PrimVal::Bytes(0) => false,
                     PrimVal::Bytes(1) => true,
-                    // TODO: This seems a little overeager, should reading at bool type already be UB?
+                    // TODO: This seems a little overeager, should reading at bool type already be insta-UB?
                     _ => return err!(InvalidBool),
                 };
                 PrimVal::from_bool(val)
@@ -2237,10 +2237,6 @@ impl IntegerExt for layout::Integer {
     }
 }
 
-pub fn is_inhabited<'a, 'tcx: 'a>(tcx: TyCtxt<'a, 'tcx, 'tcx>, ty: Ty<'tcx>) -> bool {
-    ty.uninhabited_from(&mut HashMap::default(), tcx).is_empty()
-}
-
 /// FIXME: expose trans::monomorphize::resolve_closure
 pub fn resolve_closure<'a, 'tcx>(
     tcx: TyCtxt<'a, 'tcx, 'tcx>,
diff --git a/src/librustc_mir/interpret/terminator/mod.rs b/src/librustc_mir/interpret/terminator/mod.rs
index bee0fe23f7f..e01777cdb4e 100644
--- a/src/librustc_mir/interpret/terminator/mod.rs
+++ b/src/librustc_mir/interpret/terminator/mod.rs
@@ -251,9 +251,6 @@ impl<'a, 'tcx, M: Machine<'tcx>> EvalContext<'a, 'tcx, M> {
                     _ => return err!(Unreachable),
                 };
                 let ty = sig.output();
-                if !eval_context::is_inhabited(self.tcx, ty) {
-                    return err!(Unreachable);
-                }
                 let layout = self.type_layout(ty)?;
                 M::call_intrinsic(self, instance, args, ret, ty, layout, target)?;
                 self.dump_local(ret);
diff --git a/tests/compile-fail/never_say_never.rs b/tests/compile-fail/never_say_never.rs
index 3e80cb20b3f..6aa4e281818 100644
--- a/tests/compile-fail/never_say_never.rs
+++ b/tests/compile-fail/never_say_never.rs
@@ -1,3 +1,6 @@
+// This should fail even without validation
+// compile-flags: -Zmir-emit-validate=0
+
 #![feature(never_type)]
 #![allow(unreachable_code)]
 
diff --git a/tests/compile-fail/never_transmute_humans.rs b/tests/compile-fail/never_transmute_humans.rs
index 38406eeb3fe..7390596cf7f 100644
--- a/tests/compile-fail/never_transmute_humans.rs
+++ b/tests/compile-fail/never_transmute_humans.rs
@@ -1,3 +1,6 @@
+// This should fail even without validation
+// compile-flags: -Zmir-emit-validate=0
+
 #![feature(never_type)]
 #![allow(unreachable_code)]
 #![allow(unused_variables)]
diff --git a/tests/compile-fail/never_transmute_void.rs b/tests/compile-fail/never_transmute_void.rs
index 3fffacc55ea..0b089764440 100644
--- a/tests/compile-fail/never_transmute_void.rs
+++ b/tests/compile-fail/never_transmute_void.rs
@@ -1,3 +1,6 @@
+// This should fail even without validation
+// compile-flags: -Zmir-emit-validate=0
+
 #![feature(never_type)]
 #![allow(unreachable_code)]
 #![allow(unused_variables)]
@@ -5,12 +8,12 @@
 enum Void {}
 
 fn f(v: Void) -> ! {
-    match v {}
+    match v {} //~ ERROR entered unreachable code
 }
 
 fn main() {
     let v: Void = unsafe {
-        std::mem::transmute::<(), Void>(()) //~ ERROR entered unreachable code
+        std::mem::transmute::<(), Void>(())
     };
     f(v);
 }