Rollup merge of #80886 - RalfJung:stable-raw-ref-macros, r=m-ou-se
Stabilize raw ref macros This stabilizes `raw_ref_macros` (https://github.com/rust-lang/rust/issues/73394), which is possible now that https://github.com/rust-lang/rust/issues/74355 is fixed. However, as I already said in https://github.com/rust-lang/rust/issues/73394#issuecomment-751342185, I am not particularly happy with the current names of the macros. So I propose we also change them, which means I am proposing to stabilize the following in `core::ptr`: ```rust pub macro const_addr_of($e:expr) { &raw const $e } pub macro mut_addr_of($e:expr) { &raw mut $e } ``` The macro name change means we need another round of FCP. Cc `````@rust-lang/libs````` Fixes #73394
This commit is contained in:
commit
b94d84d38a
11 changed files with 30 additions and 37 deletions
|
@ -126,7 +126,6 @@
|
|||
#![feature(auto_traits)]
|
||||
#![feature(or_patterns)]
|
||||
#![feature(prelude_import)]
|
||||
#![feature(raw_ref_macros)]
|
||||
#![feature(repr_simd, platform_intrinsics)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(simd_ffi)]
|
||||
|
|
|
@ -1501,7 +1501,6 @@ fnptr_impls_args! { A, B, C, D, E, F, G, H, I, J, K, L }
|
|||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(raw_ref_macros)]
|
||||
/// use std::ptr;
|
||||
///
|
||||
/// #[repr(packed)]
|
||||
|
@ -1512,14 +1511,14 @@ fnptr_impls_args! { A, B, C, D, E, F, G, H, I, J, K, L }
|
|||
///
|
||||
/// let packed = Packed { f1: 1, f2: 2 };
|
||||
/// // `&packed.f2` would create an unaligned reference, and thus be Undefined Behavior!
|
||||
/// let raw_f2 = ptr::raw_const!(packed.f2);
|
||||
/// let raw_f2 = ptr::addr_of!(packed.f2);
|
||||
/// assert_eq!(unsafe { raw_f2.read_unaligned() }, 2);
|
||||
/// ```
|
||||
#[unstable(feature = "raw_ref_macros", issue = "73394")]
|
||||
#[stable(feature = "raw_ref_macros", since = "1.51.0")]
|
||||
#[rustc_macro_transparency = "semitransparent"]
|
||||
#[allow_internal_unstable(raw_ref_op)]
|
||||
pub macro raw_const($e:expr) {
|
||||
&raw const $e
|
||||
pub macro addr_of($place:expr) {
|
||||
&raw const $place
|
||||
}
|
||||
|
||||
/// Create a `mut` raw pointer to a place, without creating an intermediate reference.
|
||||
|
@ -1534,7 +1533,6 @@ pub macro raw_const($e:expr) {
|
|||
/// # Example
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(raw_ref_macros)]
|
||||
/// use std::ptr;
|
||||
///
|
||||
/// #[repr(packed)]
|
||||
|
@ -1545,13 +1543,13 @@ pub macro raw_const($e:expr) {
|
|||
///
|
||||
/// let mut packed = Packed { f1: 1, f2: 2 };
|
||||
/// // `&mut packed.f2` would create an unaligned reference, and thus be Undefined Behavior!
|
||||
/// let raw_f2 = ptr::raw_mut!(packed.f2);
|
||||
/// let raw_f2 = ptr::addr_of_mut!(packed.f2);
|
||||
/// unsafe { raw_f2.write_unaligned(42); }
|
||||
/// assert_eq!({packed.f2}, 42); // `{...}` forces copying the field instead of creating a reference.
|
||||
/// ```
|
||||
#[unstable(feature = "raw_ref_macros", issue = "73394")]
|
||||
#[stable(feature = "raw_ref_macros", since = "1.51.0")]
|
||||
#[rustc_macro_transparency = "semitransparent"]
|
||||
#[allow_internal_unstable(raw_ref_op)]
|
||||
pub macro raw_mut($e:expr) {
|
||||
&raw mut $e
|
||||
pub macro addr_of_mut($place:expr) {
|
||||
&raw mut $place
|
||||
}
|
||||
|
|
|
@ -543,8 +543,8 @@ impl<T> [T] {
|
|||
#[inline]
|
||||
pub fn swap(&mut self, a: usize, b: usize) {
|
||||
// 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]);
|
||||
let pa = ptr::addr_of_mut!(self[a]);
|
||||
let pb = ptr::addr_of_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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue