diff options
| author | Oliver Scherer <github35764891676564198441@oli-obk.de> | 2019-06-24 15:31:25 +0200 |
|---|---|---|
| committer | Oliver Scherer <github35764891676564198441@oli-obk.de> | 2019-06-24 15:31:25 +0200 |
| commit | 354163d478a4fc089af07203948036c4b1e237d3 (patch) | |
| tree | 42025a6afc2e77f1240bf7732835d7853e4a62dd /src | |
| parent | 166c49d7a1db570d273a653b2b0a0d9219b7700f (diff) | |
| download | rust-354163d478a4fc089af07203948036c4b1e237d3.tar.gz rust-354163d478a4fc089af07203948036c4b1e237d3.zip | |
Simplify vtable interning
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_mir/interpret/intern.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/consts/miri_unleashed/mutable_references_ice.rs | 1 | ||||
| -rw-r--r-- | src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr | 4 |
3 files changed, 5 insertions, 8 deletions
diff --git a/src/librustc_mir/interpret/intern.rs b/src/librustc_mir/interpret/intern.rs index 416b66daa05..c7545b7101c 100644 --- a/src/librustc_mir/interpret/intern.rs +++ b/src/librustc_mir/interpret/intern.rs @@ -3,7 +3,6 @@ //! After a const evaluation has computed a value, before we destroy the const evaluator's session //! memory, we need to extract all memory allocations to the global memory pool so they stay around. -use rustc::ty::layout::LayoutOf; use rustc::ty::{Ty, TyCtxt, ParamEnv, self}; use rustc::mir::interpret::{ InterpResult, ErrorHandled, @@ -143,13 +142,11 @@ for // Handle Reference types, as these are the only relocations supported by const eval. // Raw pointers (and boxes) are handled by the `leftover_relocations` logic. let ty = mplace.layout.ty; - if let ty::Ref(_, _, mutability) = ty.sty { + if let ty::Ref(_, referenced_ty, mutability) = ty.sty { let value = self.ecx.read_immediate(mplace.into())?; // Handle trait object vtables if let Ok(meta) = value.to_meta() { - let layout = self.ecx.layout_of(ty.builtin_deref(true).unwrap().ty)?; - if layout.is_unsized() { - if let ty::Dynamic(..) = self.ecx.tcx.struct_tail(layout.ty).sty { + if let ty::Dynamic(..) = self.ecx.tcx.struct_tail(referenced_ty).sty { if let Ok(vtable) = meta.unwrap().to_ptr() { // explitly choose `Immutable` here, since vtables are immutable, even // if the reference of the fat pointer is mutable @@ -157,7 +154,6 @@ for } } } - } let mplace = self.ecx.ref_to_mplace(value)?; // Check if we have encountered this pointer+layout combination before. // Only recurse for allocation-backed pointers. diff --git a/src/test/ui/consts/miri_unleashed/mutable_references_ice.rs b/src/test/ui/consts/miri_unleashed/mutable_references_ice.rs index 4a77534c6c7..9352d9bfd7c 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references_ice.rs +++ b/src/test/ui/consts/miri_unleashed/mutable_references_ice.rs @@ -3,6 +3,7 @@ // rustc-env:RUST_BACKTRACE=0 // normalize-stderr-test "note: rustc 1.* running on .*" -> "note: rustc VERSION running on TARGET" // normalize-stderr-test "note: compiler flags: .*" -> "note: compiler flags: FLAGS" +// normalize-stderr-test "src/librustc_mir/interpret/intern.rs:[0-9]*:[0-9]*" -> "src/librustc_mir/interpret/intern.rs:LL:CC" #![allow(const_err)] diff --git a/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr b/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr index ff2351e1fdc..82569e26014 100644 --- a/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr +++ b/src/test/ui/consts/miri_unleashed/mutable_references_ice.stderr @@ -1,12 +1,12 @@ warning: skipping const checks - --> $DIR/mutable_references_ice.rs:26:9 + --> $DIR/mutable_references_ice.rs:27:9 | LL | *MUH.x.get() = 99; | ^^^^^^^^^^^^^^^^^ thread 'rustc' panicked at 'assertion failed: `(left != right)` left: `Const`, - right: `Const`: UnsafeCells are not allowed behind references in constants. This should have been prevented statically by const qualification. If this were allowed one would be able to change a constant at one use site and other use sites may arbitrarily decide to change, too.', src/librustc_mir/interpret/intern.rs:127:17 + right: `Const`: UnsafeCells are not allowed behind references in constants. This should have been prevented statically by const qualification. If this were allowed one would be able to change a constant at one use site and other use sites may arbitrarily decide to change, too.', src/librustc_mir/interpret/intern.rs:LL:CC note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. error: internal compiler error: unexpected panic |
