about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2021-01-22 00:01:53 +0000
committerbors <bors@rust-lang.org>2021-01-22 00:01:53 +0000
commita9a396d8ed0244ba8bb3fe1793ae2a6fdabd7754 (patch)
treec428fe61b739acb0e673343d5aab45bfc44ec159
parent202720bf483088dbdb343f78c0aa77067fdd8156 (diff)
parentdc04ceae710a432baa11ddb986541d89253279a4 (diff)
downloadrust-a9a396d8ed0244ba8bb3fe1793ae2a6fdabd7754.tar.gz
rust-a9a396d8ed0244ba8bb3fe1793ae2a6fdabd7754.zip
Auto merge of #81160 - RalfJung:swap, r=oli-obk
use raw-ptr-addr-of for slice::swap

Fixes https://github.com/rust-lang/rust/issues/80682
-rw-r--r--library/core/src/lib.rs1
-rw-r--r--library/core/src/slice/mod.rs7
2 files changed, 4 insertions, 4 deletions
diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs
index df8d9ff371f..263c6c9cf0f 100644
--- a/library/core/src/lib.rs
+++ b/library/core/src/lib.rs
@@ -126,6 +126,7 @@
 #![feature(auto_traits)]
 #![feature(or_patterns)]
 #![feature(prelude_import)]
+#![feature(raw_ref_macros)]
 #![feature(repr_simd, platform_intrinsics)]
 #![feature(rustc_attrs)]
 #![feature(simd_ffi)]
diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs
index de8d7fc29dc..b06b6e93373 100644
--- a/library/core/src/slice/mod.rs
+++ b/library/core/src/slice/mod.rs
@@ -542,10 +542,9 @@ impl<T> [T] {
     #[stable(feature = "rust1", since = "1.0.0")]
     #[inline]
     pub fn swap(&mut self, a: usize, b: usize) {
-        // Can't take two mutable loans from one vector, so instead just cast
-        // them to their raw pointers to do the swap.
-        let pa: *mut T = &mut self[a];
-        let pb: *mut T = &mut self[b];
+        // Can't take two mutable loans from one vector, so instead use raw pointers.
+        let pa = ptr::raw_mut!(self[a]);
+        let pb = ptr::raw_mut!(self[b]);
         // SAFETY: `pa` and `pb` have been created from safe mutable references and refer
         // to elements in the slice and therefore are guaranteed to be valid and aligned.
         // Note that accessing the elements behind `a` and `b` is checked and will