diff options
| author | Yuki Okushi <huyuumi.dev@gmail.com> | 2020-03-14 04:03:33 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-03-14 04:03:33 +0900 |
| commit | f2af2cff0fa16aaa277241f6a8c8dbd9c205c4a8 (patch) | |
| tree | c2717937fed0f56ec56e89ae9808010b8fcf610e /src | |
| parent | 77263db96f30a5bc2c4b74d0546803ad9d79b865 (diff) | |
| parent | 13ea774513131b8102f35cb105cc17f39eb1b947 (diff) | |
| download | rust-f2af2cff0fa16aaa277241f6a8c8dbd9c205c4a8.tar.gz rust-f2af2cff0fa16aaa277241f6a8c8dbd9c205c4a8.zip | |
Rollup merge of #69960 - RalfJung:abort, r=oli-obk
miri engine: fix treatment of abort intrinsic I screwed up in https://github.com/rust-lang/rust/pull/69830 and added `abort` to the wrong block of intrinsics, namely the one that actually has a return place. So that branch was never actually reached. r? @oli-obk
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/interpret/intrinsics.rs | 13 | ||||
| -rw-r--r-- | src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr | 2 |
2 files changed, 6 insertions, 9 deletions
diff --git a/src/librustc_mir/interpret/intrinsics.rs b/src/librustc_mir/interpret/intrinsics.rs index 869eb1227f2..37a60bcc836 100644 --- a/src/librustc_mir/interpret/intrinsics.rs +++ b/src/librustc_mir/interpret/intrinsics.rs @@ -84,14 +84,15 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let substs = instance.substs; let intrinsic_name = self.tcx.item_name(instance.def_id()); - // We currently do not handle any intrinsics that are *allowed* to diverge, - // but `transmute` could lack a return place in case of UB. + // First handle intrinsics without return place. let (dest, ret) = match ret { - Some(p) => p, None => match intrinsic_name { - sym::transmute => throw_ub!(Unreachable), + sym::transmute => throw_ub_format!("transmuting to uninhabited type"), + sym::abort => M::abort(self)?, + // Unsupported diverging intrinsic. _ => return Ok(false), }, + Some(p) => p, }; // Keep the patterns in this match ordered the same as the list in @@ -103,10 +104,6 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.write_scalar(location.ptr, dest)?; } - sym::abort => { - M::abort(self)?; - } - sym::min_align_of | sym::pref_align_of | sym::needs_drop diff --git a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr index d0e35615dab..cede356a6b8 100644 --- a/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr +++ b/src/test/ui/consts/const-eval/validate_uninhabited_zsts.stderr @@ -4,7 +4,7 @@ warning: any use of this value will cause an error LL | unsafe { std::mem::transmute(()) } | ^^^^^^^^^^^^^^^^^^^^^^^ | | - | entering unreachable code + | transmuting to uninhabited type | inside call to `foo` at $DIR/validate_uninhabited_zsts.rs:14:26 ... LL | const FOO: [Empty; 3] = [foo(); 3]; |
