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)
}
}
-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>,
_ => 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);
+// This should fail even without validation
+// compile-flags: -Zmir-emit-validate=0
+
#![feature(never_type)]
#![allow(unreachable_code)]
+// This should fail even without validation
+// compile-flags: -Zmir-emit-validate=0
+
#![feature(never_type)]
#![allow(unreachable_code)]
#![allow(unused_variables)]
+// This should fail even without validation
+// compile-flags: -Zmir-emit-validate=0
+
#![feature(never_type)]
#![allow(unreachable_code)]
#![allow(unused_variables)]
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);
}