diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index df8d9ff371fe4..263c6c9cf0f26 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 de8d7fc29dc05..b06b6e93373f3 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -542,10 +542,9 @@ impl [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