diff options
| author | Ralf Jung <post@ralfj.de> | 2018-11-22 13:43:05 +0100 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-11-22 16:08:58 +0100 |
| commit | af9b057156f610df3528a502c668cfed99ce8a1a (patch) | |
| tree | d593b21ccab9ff40fb52bfe990efe2b781483785 | |
| parent | 4bec59c93baa71d599a616fda9f1180febb08386 (diff) | |
| download | rust-af9b057156f610df3528a502c668cfed99ce8a1a.tar.gz rust-af9b057156f610df3528a502c668cfed99ce8a1a.zip | |
drop glue takes in mutable references, it should reflect that in its type
| -rw-r--r-- | src/libcore/ptr.rs | 14 | ||||
| -rw-r--r-- | src/librustc_mir/interpret/terminator.rs | 3 | ||||
| -rw-r--r-- | src/librustc_mir/shim.rs | 7 |
3 files changed, 21 insertions, 3 deletions
diff --git a/src/libcore/ptr.rs b/src/libcore/ptr.rs index e9cf11424ca..ba1028f76c1 100644 --- a/src/libcore/ptr.rs +++ b/src/libcore/ptr.rs @@ -189,12 +189,22 @@ pub use intrinsics::write_bytes; /// i.e., you do not usually have to worry about such issues unless you call `drop_in_place` /// manually. #[stable(feature = "drop_in_place", since = "1.8.0")] +#[inline(always)] +pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) { + real_drop_in_place(&mut *to_drop) +} + +// The real `drop_in_place` -- the one that gets called implicitly when variables go +// out of scope -- should have a safe reference and not a raw pointer as argument +// type. When we drop a local variable, we access it with a pointer that behaves +// like a safe reference; transmuting that to a raw pointer does not mean we can +// actually access it with raw pointers. #[lang = "drop_in_place"] #[allow(unconditional_recursion)] -pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) { +unsafe fn real_drop_in_place<T: ?Sized>(to_drop: &mut T) { // Code here does not matter - this is replaced by the // real drop glue by the compiler. - drop_in_place(to_drop); + real_drop_in_place(to_drop) } /// Creates a null raw pointer. diff --git a/src/librustc_mir/interpret/terminator.rs b/src/librustc_mir/interpret/terminator.rs index 6070b31d3e7..44894656797 100644 --- a/src/librustc_mir/interpret/terminator.rs +++ b/src/librustc_mir/interpret/terminator.rs @@ -196,6 +196,9 @@ impl<'a, 'mir, 'tcx, M: Machine<'a, 'mir, 'tcx>> EvalContext<'a, 'mir, 'tcx, M> // that will take care to make it UB to leave the range, just // like for transmute). caller.value == callee.value, + (layout::Abi::ScalarPair(ref caller1, ref caller2), + layout::Abi::ScalarPair(ref callee1, ref callee2)) => + caller1.value == callee1.value && caller2.value == callee2.value, // Be conservative _ => false } diff --git a/src/librustc_mir/shim.rs b/src/librustc_mir/shim.rs index 93bf1b3e36e..04079319a78 100644 --- a/src/librustc_mir/shim.rs +++ b/src/librustc_mir/shim.rs @@ -226,9 +226,14 @@ fn build_drop_shim<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, // The first argument (index 0), but add 1 for the return value. let dropee_ptr = Place::Local(Local::new(1+0)); if tcx.sess.opts.debugging_opts.mir_emit_retag { - // We use raw ptr operations, better prepare the alias tracking for that + // Function arguments should be retagged mir.basic_blocks_mut()[START_BLOCK].statements.insert(0, Statement { source_info, + kind: StatementKind::Retag { fn_entry: true, place: dropee_ptr.clone() }, + }); + // We use raw ptr operations, better prepare the alias tracking for that + mir.basic_blocks_mut()[START_BLOCK].statements.insert(1, Statement { + source_info, kind: StatementKind::EscapeToRaw(Operand::Copy(dropee_ptr.clone())), }) } |
