mirror of
https://github.com/rust-lang/rust.git
synced 2025-02-20 02:43:45 +00:00
Auto merge of #75653 - JohnTitor:rollup-0ejtdfo, r=JohnTitor
Rollup of 8 pull requests Successful merges: - #75389 (attempt to improve span_label docs) - #75392 (Add `as_uninit`-like methods to pointer types and unify documentation of `as_ref` methods) - #75464 (Move to intra doc links for ascii.rs and panic.rs) - #75578 (Allowing raw ptr dereference in const fn) - #75613 (Add explanation for `&mut self` method call when expecting `-> Self`) - #75626 (Clean up E0754 explanation) - #75629 (Use intra-doc links in `std::env`, `std::alloc` and `std::error`) - #75634 (Mark x86_64-linux-kernel as *) Failed merges: r? @ghost
This commit is contained in:
commit
d7dcae03c9
@ -114,6 +114,7 @@
|
||||
#![feature(optin_builtin_traits)]
|
||||
#![feature(or_patterns)]
|
||||
#![feature(prelude_import)]
|
||||
#![feature(ptr_as_uninit)]
|
||||
#![feature(repr_simd, platform_intrinsics)]
|
||||
#![feature(rustc_attrs)]
|
||||
#![feature(simd_ffi)]
|
||||
|
@ -2,7 +2,7 @@ use super::*;
|
||||
use crate::cmp::Ordering::{self, Equal, Greater, Less};
|
||||
use crate::intrinsics;
|
||||
use crate::mem;
|
||||
use crate::slice::SliceIndex;
|
||||
use crate::slice::{self, SliceIndex};
|
||||
|
||||
#[lang = "const_ptr"]
|
||||
impl<T: ?Sized> *const T {
|
||||
@ -48,32 +48,33 @@ impl<T: ?Sized> *const T {
|
||||
self as _
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a reference to
|
||||
/// the value wrapped in `Some`.
|
||||
/// Returns `None` if the pointer is null, or else returns a shared reference to
|
||||
/// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_ref`]
|
||||
/// must be used instead.
|
||||
///
|
||||
/// [`as_uninit_ref`]: #method.as_uninit_ref
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// While this method and its mutable counterpart are useful for
|
||||
/// null-safety, it is important to note that this is still an unsafe
|
||||
/// operation because the returned value could be pointing to invalid
|
||||
/// memory.
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
/// - it is properly aligned
|
||||
/// - it must point to an initialized instance of T; in particular, the pointer must be
|
||||
/// "dereferenceable" in the sense defined [here].
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * The pointer must point to an initialized instance of `T`.
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
/// (The part about being initialized is not yet fully decided, but until
|
||||
/// it is, the only safe approach is to ensure that they are indeed initialized.)
|
||||
///
|
||||
/// Additionally, the lifetime `'a` returned is arbitrarily chosen and does
|
||||
/// not necessarily reflect the actual lifetime of the data. *You* must enforce
|
||||
/// Rust's aliasing rules. In particular, for the duration of this lifetime,
|
||||
/// the memory the pointer points to must not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// [here]: crate::ptr#safety
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -111,6 +112,56 @@ impl<T: ?Sized> *const T {
|
||||
if self.is_null() { None } else { unsafe { Some(&*self) } }
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a shared reference to
|
||||
/// the value wrapped in `Some`. In contrast to [`as_ref`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// [`as_ref`]: #method.as_ref
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(ptr_as_uninit)]
|
||||
///
|
||||
/// let ptr: *const u8 = &10u8 as *const u8;
|
||||
///
|
||||
/// unsafe {
|
||||
/// if let Some(val_back) = ptr.as_uninit_ref() {
|
||||
/// println!("We got back the value: {}!", val_back.assume_init());
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_ref<'a>(self) -> Option<&'a MaybeUninit<T>>
|
||||
where
|
||||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must guarantee that `self` meets all the
|
||||
// requirements for a reference.
|
||||
if self.is_null() { None } else { Some(unsafe { &*(self as *const MaybeUninit<T>) }) }
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer.
|
||||
///
|
||||
/// `count` is in units of T; e.g., a `count` of 3 represents a pointer
|
||||
@ -925,6 +976,55 @@ impl<T> *const [T] {
|
||||
// SAFETY: the caller ensures that `self` is dereferencable and `index` in-bounds.
|
||||
unsafe { index.get_unchecked(self) }
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a shared slice to
|
||||
/// the value wrapped in `Some`. In contrast to [`as_ref`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// [`as_ref`]: #method.as_ref
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
///
|
||||
/// * The pointer must be [valid] for reads for `ptr.len() * mem::size_of::<T>()` many bytes,
|
||||
/// and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
/// reason for this is that enum layout optimizations may rely on references
|
||||
/// (including slices of any length) being aligned and non-null to distinguish
|
||||
/// them from other data. You can obtain a pointer that is usable as `data`
|
||||
/// for zero-length slices using [`NonNull::dangling()`].
|
||||
///
|
||||
/// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
|
||||
/// See the safety documentation of [`pointer::offset`].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// See also [`slice::from_raw_parts`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [`NonNull::dangling()`]: NonNull::dangling
|
||||
/// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
|
||||
if self.is_null() {
|
||||
None
|
||||
} else {
|
||||
// SAFETY: the caller must uphold the safety contract for `as_uninit_slice`.
|
||||
Some(unsafe { slice::from_raw_parts(self as *const MaybeUninit<T>, self.len()) })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Equality for pointers
|
||||
|
@ -1,7 +1,7 @@
|
||||
use super::*;
|
||||
use crate::cmp::Ordering::{self, Equal, Greater, Less};
|
||||
use crate::intrinsics;
|
||||
use crate::slice::SliceIndex;
|
||||
use crate::slice::{self, SliceIndex};
|
||||
|
||||
#[lang = "mut_ptr"]
|
||||
impl<T: ?Sized> *mut T {
|
||||
@ -47,32 +47,36 @@ impl<T: ?Sized> *mut T {
|
||||
self as _
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a reference to
|
||||
/// the value wrapped in `Some`.
|
||||
/// Returns `None` if the pointer is null, or else returns a shared reference to
|
||||
/// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_ref`]
|
||||
/// must be used instead.
|
||||
///
|
||||
/// For the mutable counterpart see [`as_mut`].
|
||||
///
|
||||
/// [`as_uninit_ref`]: #method.as_uninit_ref-1
|
||||
/// [`as_mut`]: #method.as_mut
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// While this method and its mutable counterpart are useful for
|
||||
/// null-safety, it is important to note that this is still an unsafe
|
||||
/// operation because the returned value could be pointing to invalid
|
||||
/// memory.
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
/// - it is properly aligned
|
||||
/// - it must point to an initialized instance of T; in particular, the pointer must be
|
||||
/// "dereferencable" in the sense defined [here].
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * The pointer must point to an initialized instance of `T`.
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
/// (The part about being initialized is not yet fully decided, but until
|
||||
/// it is, the only safe approach is to ensure that they are indeed initialized.)
|
||||
///
|
||||
/// Additionally, the lifetime `'a` returned is arbitrarily chosen and does
|
||||
/// not necessarily reflect the actual lifetime of the data. *You* must enforce
|
||||
/// Rust's aliasing rules. In particular, for the duration of this lifetime,
|
||||
/// the memory the pointer points to must not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// [here]: crate::ptr#safety
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -110,6 +114,59 @@ impl<T: ?Sized> *mut T {
|
||||
if self.is_null() { None } else { unsafe { Some(&*self) } }
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a shared reference to
|
||||
/// the value wrapped in `Some`. In contrast to [`as_ref`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// For the mutable counterpart see [`as_uninit_mut`].
|
||||
///
|
||||
/// [`as_ref`]: #method.as_ref-1
|
||||
/// [`as_uninit_mut`]: #method.as_uninit_mut
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Basic usage:
|
||||
///
|
||||
/// ```
|
||||
/// #![feature(ptr_as_uninit)]
|
||||
///
|
||||
/// let ptr: *mut u8 = &mut 10u8 as *mut u8;
|
||||
///
|
||||
/// unsafe {
|
||||
/// if let Some(val_back) = ptr.as_uninit_ref() {
|
||||
/// println!("We got back the value: {}!", val_back.assume_init());
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_ref<'a>(self) -> Option<&'a MaybeUninit<T>>
|
||||
where
|
||||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must guarantee that `self` meets all the
|
||||
// requirements for a reference.
|
||||
if self.is_null() { None } else { Some(unsafe { &*(self as *const MaybeUninit<T>) }) }
|
||||
}
|
||||
|
||||
/// Calculates the offset from a pointer.
|
||||
///
|
||||
/// `count` is in units of T; e.g., a `count` of 3 represents a pointer
|
||||
@ -235,33 +292,36 @@ impl<T: ?Sized> *mut T {
|
||||
unsafe { intrinsics::arith_offset(self, count) as *mut T }
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a mutable
|
||||
/// reference to the value wrapped in `Some`.
|
||||
/// Returns `None` if the pointer is null, or else returns a unique reference to
|
||||
/// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_mut`]
|
||||
/// must be used instead.
|
||||
///
|
||||
/// For the shared counterpart see [`as_ref`].
|
||||
///
|
||||
/// [`as_uninit_mut`]: #method.as_uninit_mut
|
||||
/// [`as_ref`]: #method.as_ref-1
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// As with [`as_ref`], this is unsafe because it cannot verify the validity
|
||||
/// of the returned pointer, nor can it ensure that the lifetime `'a`
|
||||
/// returned is indeed a valid lifetime for the contained data.
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
/// - it is properly aligned
|
||||
/// - it must point to an initialized instance of T; in particular, the pointer must be
|
||||
/// "dereferenceable" in the sense defined [here].
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * The pointer must point to an initialized instance of `T`.
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
/// (The part about being initialized is not yet fully decided, but until
|
||||
/// it is the only safe approach is to ensure that they are indeed initialized.)
|
||||
/// it is, the only safe approach is to ensure that they are indeed initialized.)
|
||||
///
|
||||
/// Additionally, the lifetime `'a` returned is arbitrarily chosen and does
|
||||
/// not necessarily reflect the actual lifetime of the data. *You* must enforce
|
||||
/// Rust's aliasing rules. In particular, for the duration of this lifetime,
|
||||
/// the memory this pointer points to must not get accessed (read or written)
|
||||
/// through any other pointer.
|
||||
///
|
||||
/// [here]: crate::ptr#safety
|
||||
/// [`as_ref`]: #method.as_ref
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -272,6 +332,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// let ptr: *mut u32 = s.as_mut_ptr();
|
||||
/// let first_value = unsafe { ptr.as_mut().unwrap() };
|
||||
/// *first_value = 4;
|
||||
/// # assert_eq!(s, [4, 2, 3]);
|
||||
/// println!("{:?}", s); // It'll print: "[4, 2, 3]".
|
||||
/// ```
|
||||
///
|
||||
@ -286,6 +347,7 @@ impl<T: ?Sized> *mut T {
|
||||
/// let ptr: *mut u32 = s.as_mut_ptr();
|
||||
/// let first_value = unsafe { &mut *ptr };
|
||||
/// *first_value = 4;
|
||||
/// # assert_eq!(s, [4, 2, 3]);
|
||||
/// println!("{:?}", s); // It'll print: "[4, 2, 3]".
|
||||
/// ```
|
||||
#[stable(feature = "ptr_as_ref", since = "1.9.0")]
|
||||
@ -296,6 +358,43 @@ impl<T: ?Sized> *mut T {
|
||||
if self.is_null() { None } else { unsafe { Some(&mut *self) } }
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a unique reference to
|
||||
/// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// For the shared counterpart see [`as_uninit_ref`].
|
||||
///
|
||||
/// [`as_mut`]: #method.as_mut
|
||||
/// [`as_uninit_ref`]: #method.as_uninit_ref-1
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_mut<'a>(self) -> Option<&'a mut MaybeUninit<T>>
|
||||
where
|
||||
T: Sized,
|
||||
{
|
||||
// SAFETY: the caller must guarantee that `self` meets all the
|
||||
// requirements for a reference.
|
||||
if self.is_null() { None } else { Some(unsafe { &mut *(self as *mut MaybeUninit<T>) }) }
|
||||
}
|
||||
|
||||
/// Returns whether two pointers are guaranteed to be equal.
|
||||
///
|
||||
/// At runtime this function behaves like `self == other`.
|
||||
@ -1131,6 +1230,110 @@ impl<T> *mut [T] {
|
||||
// SAFETY: the caller ensures that `self` is dereferencable and `index` in-bounds.
|
||||
unsafe { index.get_unchecked_mut(self) }
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a shared slice to
|
||||
/// the value wrapped in `Some`. In contrast to [`as_ref`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// For the mutable counterpart see [`as_uninit_slice_mut`].
|
||||
///
|
||||
/// [`as_ref`]: #method.as_ref-1
|
||||
/// [`as_uninit_slice_mut`]: #method.as_uninit_slice_mut
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
///
|
||||
/// * The pointer must be [valid] for reads for `ptr.len() * mem::size_of::<T>()` many bytes,
|
||||
/// and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
/// reason for this is that enum layout optimizations may rely on references
|
||||
/// (including slices of any length) being aligned and non-null to distinguish
|
||||
/// them from other data. You can obtain a pointer that is usable as `data`
|
||||
/// for zero-length slices using [`NonNull::dangling()`].
|
||||
///
|
||||
/// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
|
||||
/// See the safety documentation of [`pointer::offset`].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// See also [`slice::from_raw_parts`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [`NonNull::dangling()`]: NonNull::dangling
|
||||
/// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit<T>]> {
|
||||
if self.is_null() {
|
||||
None
|
||||
} else {
|
||||
// SAFETY: the caller must uphold the safety contract for `as_uninit_slice`.
|
||||
Some(unsafe { slice::from_raw_parts(self as *const MaybeUninit<T>, self.len()) })
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns `None` if the pointer is null, or else returns a unique slice to
|
||||
/// the value wrapped in `Some`. In contrast to [`as_mut`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// For the shared counterpart see [`as_uninit_slice`].
|
||||
///
|
||||
/// [`as_mut`]: #method.as_mut
|
||||
/// [`as_uninit_slice`]: #method.as_uninit_slice-1
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that *either* the pointer is NULL *or*
|
||||
/// all of the following is true:
|
||||
///
|
||||
/// * The pointer must be [valid] for reads and writes for `ptr.len() * mem::size_of::<T>()`
|
||||
/// many bytes, and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
/// reason for this is that enum layout optimizations may rely on references
|
||||
/// (including slices of any length) being aligned and non-null to distinguish
|
||||
/// them from other data. You can obtain a pointer that is usable as `data`
|
||||
/// for zero-length slices using [`NonNull::dangling()`].
|
||||
///
|
||||
/// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
|
||||
/// See the safety documentation of [`pointer::offset`].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// See also [`slice::from_raw_parts_mut`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [`NonNull::dangling()`]: NonNull::dangling
|
||||
/// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice_mut<'a>(self) -> Option<&'a mut [MaybeUninit<T>]> {
|
||||
if self.is_null() {
|
||||
None
|
||||
} else {
|
||||
// SAFETY: the caller must uphold the safety contract for `as_uninit_slice_mut`.
|
||||
Some(unsafe { slice::from_raw_parts_mut(self as *mut MaybeUninit<T>, self.len()) })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Equality for pointers
|
||||
|
@ -3,10 +3,10 @@ use crate::convert::From;
|
||||
use crate::fmt;
|
||||
use crate::hash;
|
||||
use crate::marker::Unsize;
|
||||
use crate::mem;
|
||||
use crate::mem::{self, MaybeUninit};
|
||||
use crate::ops::{CoerceUnsized, DispatchFromDyn};
|
||||
use crate::ptr::Unique;
|
||||
use crate::slice::SliceIndex;
|
||||
use crate::slice::{self, SliceIndex};
|
||||
|
||||
/// `*mut T` but non-zero and covariant.
|
||||
///
|
||||
@ -76,6 +76,70 @@ impl<T: Sized> NonNull<T> {
|
||||
NonNull::new_unchecked(ptr)
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns a shared references to the value. In contrast to [`as_ref`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// For the mutable counterpart see [`as_uninit_mut`].
|
||||
///
|
||||
/// [`as_ref`]: #method.as_ref
|
||||
/// [`as_uninit_mut`]: #method.as_uninit_mut
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that all of the following is true:
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_ref(&self) -> &MaybeUninit<T> {
|
||||
// SAFETY: the caller must guarantee that `self` meets all the
|
||||
// requirements for a reference.
|
||||
unsafe { &*self.cast().as_ptr() }
|
||||
}
|
||||
|
||||
/// Returns a unique references to the value. In contrast to [`as_mut`], this does not require
|
||||
/// that the value has to be initialized.
|
||||
///
|
||||
/// For the shared counterpart see [`as_uninit_ref`].
|
||||
///
|
||||
/// [`as_mut`]: #method.as_mut
|
||||
/// [`as_uninit_ref`]: #method.as_uninit_ref
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that all of the following is true:
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_mut(&mut self) -> &mut MaybeUninit<T> {
|
||||
// SAFETY: the caller must guarantee that `self` meets all the
|
||||
// requirements for a reference.
|
||||
unsafe { &mut *self.cast().as_ptr() }
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: ?Sized> NonNull<T> {
|
||||
@ -112,29 +176,34 @@ impl<T: ?Sized> NonNull<T> {
|
||||
self.pointer as *mut T
|
||||
}
|
||||
|
||||
/// Dereferences the content.
|
||||
/// Returns a shared reference to the value. If the value may be uninitialized, [`as_uninit_ref`]
|
||||
/// must be used instead.
|
||||
///
|
||||
/// The resulting lifetime is bound to self so this behaves "as if"
|
||||
/// it were actually an instance of T that is getting borrowed. If a longer
|
||||
/// (unbound) lifetime is needed, use `&*my_ptr.as_ptr()`.
|
||||
/// For the mutable counterpart see [`as_mut`].
|
||||
///
|
||||
/// [`as_uninit_ref`]: #method.as_uninit_ref
|
||||
/// [`as_mut`]: #method.as_mut
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that all of the following is true:
|
||||
/// - `self` is properly aligned
|
||||
/// - `self` must point to an initialized instance of T; in particular, the pointer must be
|
||||
/// "dereferencable" in the sense defined [here].
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * The pointer must point to an initialized instance of `T`.
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
/// (The part about being initialized is not yet fully decided, but until
|
||||
/// it is, the only safe approach is to ensure that they are indeed initialized.)
|
||||
///
|
||||
/// Additionally, the lifetime of `self` does not necessarily reflect the actual
|
||||
/// lifetime of the data. *You* must enforce Rust's aliasing rules. In particular,
|
||||
/// for the duration of this lifetime, the memory the pointer points to must not
|
||||
/// get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// [here]: crate::ptr#safety
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
#[stable(feature = "nonnull", since = "1.25.0")]
|
||||
#[inline]
|
||||
pub unsafe fn as_ref(&self) -> &T {
|
||||
@ -143,29 +212,34 @@ impl<T: ?Sized> NonNull<T> {
|
||||
unsafe { &*self.as_ptr() }
|
||||
}
|
||||
|
||||
/// Mutably dereferences the content.
|
||||
/// Returns a unique reference to the value. If the value may be uninitialized, [`as_uninit_mut`]
|
||||
/// must be used instead.
|
||||
///
|
||||
/// The resulting lifetime is bound to self so this behaves "as if"
|
||||
/// it were actually an instance of T that is getting borrowed. If a longer
|
||||
/// (unbound) lifetime is needed, use `&mut *my_ptr.as_ptr()`.
|
||||
/// For the shared counterpart see [`as_ref`].
|
||||
///
|
||||
/// [`as_uninit_mut`]: #method.as_uninit_mut
|
||||
/// [`as_ref`]: #method.as_ref
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that all of the following is true:
|
||||
/// - `self` is properly aligned
|
||||
/// - `self` must point to an initialized instance of T; in particular, the pointer must be
|
||||
/// "dereferenceable" in the sense defined [here].
|
||||
///
|
||||
/// * The pointer must be properly aligned.
|
||||
///
|
||||
/// * It must be "dereferencable" in the sense defined in [the module documentation].
|
||||
///
|
||||
/// * The pointer must point to an initialized instance of `T`.
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
/// (The part about being initialized is not yet fully decided, but until
|
||||
/// it is the only safe approach is to ensure that they are indeed initialized.)
|
||||
/// it is, the only safe approach is to ensure that they are indeed initialized.)
|
||||
///
|
||||
/// Additionally, the lifetime of `self` does not necessarily reflect the actual
|
||||
/// lifetime of the data. *You* must enforce Rust's aliasing rules. In particular,
|
||||
/// for the duration of this lifetime, the memory this pointer points to must not
|
||||
/// get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// [here]: crate::ptr#safety
|
||||
/// [the module documentation]: crate::ptr#safety
|
||||
#[stable(feature = "nonnull", since = "1.25.0")]
|
||||
#[inline]
|
||||
pub unsafe fn as_mut(&mut self) -> &mut T {
|
||||
@ -278,6 +352,115 @@ impl<T> NonNull<[T]> {
|
||||
self.as_non_null_ptr().as_ptr()
|
||||
}
|
||||
|
||||
/// Returns a shared reference to a slice of possibly uninitialized values. In contrast to
|
||||
/// [`as_ref`], this does not require that the value has to be initialized.
|
||||
///
|
||||
/// For the mutable counterpart see [`as_uninit_slice_mut`].
|
||||
///
|
||||
/// [`as_ref`]: #method.as_ref
|
||||
/// [`as_uninit_slice_mut`]: #method.as_uninit_slice_mut
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that all of the following is true:
|
||||
///
|
||||
/// * The pointer must be [valid] for reads for `ptr.len() * mem::size_of::<T>()` many bytes,
|
||||
/// and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
/// reason for this is that enum layout optimizations may rely on references
|
||||
/// (including slices of any length) being aligned and non-null to distinguish
|
||||
/// them from other data. You can obtain a pointer that is usable as `data`
|
||||
/// for zero-length slices using [`NonNull::dangling()`].
|
||||
///
|
||||
/// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
|
||||
/// See the safety documentation of [`pointer::offset`].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get mutated (except inside `UnsafeCell`).
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// See also [`slice::from_raw_parts`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [`NonNull::dangling()`]: NonNull::dangling
|
||||
/// [`pointer::offset`]: ../../std/primitive.pointer.html#method.offset
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice(&self) -> &[MaybeUninit<T>] {
|
||||
// SAFETY: the caller must uphold the safety contract for `as_uninit_slice`.
|
||||
unsafe { slice::from_raw_parts(self.cast().as_ptr(), self.len()) }
|
||||
}
|
||||
|
||||
/// Returns a unique reference to a slice of possibly uninitialized values. In contrast to
|
||||
/// [`as_mut`], this does not require that the value has to be initialized.
|
||||
///
|
||||
/// For the shared counterpart see [`as_uninit_slice`].
|
||||
///
|
||||
/// [`as_mut`]: #method.as_mut
|
||||
/// [`as_uninit_slice`]: #method.as_uninit_slice
|
||||
///
|
||||
/// # Safety
|
||||
///
|
||||
/// When calling this method, you have to ensure that all of the following is true:
|
||||
///
|
||||
/// * The pointer must be [valid] for reads and writes for `ptr.len() * mem::size_of::<T>()`
|
||||
/// many bytes, and it must be properly aligned. This means in particular:
|
||||
///
|
||||
/// * The entire memory range of this slice must be contained within a single allocated object!
|
||||
/// Slices can never span across multiple allocated objects.
|
||||
///
|
||||
/// * The pointer must be aligned even for zero-length slices. One
|
||||
/// reason for this is that enum layout optimizations may rely on references
|
||||
/// (including slices of any length) being aligned and non-null to distinguish
|
||||
/// them from other data. You can obtain a pointer that is usable as `data`
|
||||
/// for zero-length slices using [`NonNull::dangling()`].
|
||||
///
|
||||
/// * The total size `ptr.len() * mem::size_of::<T>()` of the slice must be no larger than `isize::MAX`.
|
||||
/// See the safety documentation of [`pointer::offset`].
|
||||
///
|
||||
/// * You must enforce Rust's aliasing rules, since the returned lifetime `'a` is
|
||||
/// arbitrarily chosen and does not necessarily reflect the actual lifetime of the data.
|
||||
/// In particular, for the duration of this lifetime, the memory the pointer points to must
|
||||
/// not get accessed (read or written) through any other pointer.
|
||||
///
|
||||
/// This applies even if the result of this method is unused!
|
||||
///
|
||||
/// See also [`slice::from_raw_parts_mut`][].
|
||||
///
|
||||
/// [valid]: crate::ptr#safety
|
||||
/// [`NonNull::dangling()`]: NonNull::dangling
|
||||
/// [`pointer::offset`]: ../../std/primitive.pointer.html#method.offset
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```rust
|
||||
/// #![feature(allocator_api, ptr_as_uninit)]
|
||||
///
|
||||
/// use std::alloc::{AllocRef, Layout, Global};
|
||||
/// use std::mem::MaybeUninit;
|
||||
/// use std::ptr::NonNull;
|
||||
///
|
||||
/// let memory: NonNull<[u8]> = Global.alloc(Layout::new::<[u8; 32]>())?;
|
||||
/// // This is safe as `memory` is valid for reads and writes for `memory.len()` many bytes.
|
||||
/// // Note that calling `memory.as_mut()` is not allowed here as the content may be uninitialized.
|
||||
/// # #[allow(unused_variables)]
|
||||
/// let slice: &mut [MaybeUninit<u8>] = unsafe { memory.as_uninit_slice_mut() };
|
||||
/// # Ok::<_, std::alloc::AllocErr>(())
|
||||
/// ```
|
||||
#[inline]
|
||||
#[unstable(feature = "ptr_as_uninit", issue = "75402")]
|
||||
pub unsafe fn as_uninit_slice_mut(&self) -> &mut [MaybeUninit<T>] {
|
||||
// SAFETY: the caller must uphold the safety contract for `as_uninit_slice_mut`.
|
||||
unsafe { slice::from_raw_parts_mut(self.cast().as_ptr(), self.len()) }
|
||||
}
|
||||
|
||||
/// Returns a raw pointer to an element or subslice, without doing bounds
|
||||
/// checking.
|
||||
///
|
||||
|
@ -7,8 +7,6 @@
|
||||
//! like `cdylib`s and `staticlib`s are guaranteed to use the [`System`] by
|
||||
//! default.
|
||||
//!
|
||||
//! [`System`]: struct.System.html
|
||||
//!
|
||||
//! # The `#[global_allocator]` attribute
|
||||
//!
|
||||
//! This attribute allows configuring the choice of global allocator.
|
||||
@ -43,8 +41,6 @@
|
||||
//! The attribute is used on a `static` item whose type implements the
|
||||
//! [`GlobalAlloc`] trait. This type can be provided by an external library:
|
||||
//!
|
||||
//! [`GlobalAlloc`]: ../../core/alloc/trait.GlobalAlloc.html
|
||||
//!
|
||||
//! ```rust,ignore (demonstrates crates.io usage)
|
||||
//! extern crate jemallocator;
|
||||
//!
|
||||
@ -284,9 +280,6 @@ static HOOK: AtomicPtr<()> = AtomicPtr::new(ptr::null_mut());
|
||||
/// about the allocation that failed.
|
||||
///
|
||||
/// The allocation error hook is a global resource.
|
||||
///
|
||||
/// [`set_alloc_error_hook`]: fn.set_alloc_error_hook.html
|
||||
/// [`take_alloc_error_hook`]: fn.take_alloc_error_hook.html
|
||||
#[unstable(feature = "alloc_error_hook", issue = "51245")]
|
||||
pub fn set_alloc_error_hook(hook: fn(Layout)) {
|
||||
HOOK.store(hook as *mut (), Ordering::SeqCst);
|
||||
@ -297,8 +290,6 @@ pub fn set_alloc_error_hook(hook: fn(Layout)) {
|
||||
/// *See also the function [`set_alloc_error_hook`].*
|
||||
///
|
||||
/// If no custom hook is registered, the default hook will be returned.
|
||||
///
|
||||
/// [`set_alloc_error_hook`]: fn.set_alloc_error_hook.html
|
||||
#[unstable(feature = "alloc_error_hook", issue = "51245")]
|
||||
pub fn take_alloc_error_hook() -> fn(Layout) {
|
||||
let hook = HOOK.swap(ptr::null_mut(), Ordering::SeqCst);
|
||||
|
@ -10,9 +10,6 @@
|
||||
//!
|
||||
//! The [`escape_default`] function provides an iterator over the bytes of an
|
||||
//! escaped version of the character given.
|
||||
//!
|
||||
//! [`AsciiExt`]: trait.AsciiExt.html
|
||||
//! [`escape_default`]: fn.escape_default.html
|
||||
|
||||
#![stable(feature = "rust1", since = "1.0.0")]
|
||||
|
||||
@ -52,7 +49,7 @@ pub trait AsciiExt {
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// This method will be deprecated in favor of the identically-named
|
||||
/// This method is deprecated in favor of the identically-named
|
||||
/// inherent methods on `u8`, `char`, `[u8]` and `str`.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
fn is_ascii(&self) -> bool;
|
||||
@ -69,10 +66,10 @@ pub trait AsciiExt {
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// This method will be deprecated in favor of the identically-named
|
||||
/// This method is deprecated in favor of the identically-named
|
||||
/// inherent methods on `u8`, `char`, `[u8]` and `str`.
|
||||
///
|
||||
/// [`make_ascii_uppercase`]: #tymethod.make_ascii_uppercase
|
||||
/// [`make_ascii_uppercase`]: AsciiExt::make_ascii_uppercase
|
||||
/// [`str::to_uppercase`]: ../primitive.str.html#method.to_uppercase
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[allow(deprecated)]
|
||||
@ -90,10 +87,10 @@ pub trait AsciiExt {
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// This method will be deprecated in favor of the identically-named
|
||||
/// This method is deprecated in favor of the identically-named
|
||||
/// inherent methods on `u8`, `char`, `[u8]` and `str`.
|
||||
///
|
||||
/// [`make_ascii_lowercase`]: #tymethod.make_ascii_lowercase
|
||||
/// [`make_ascii_lowercase`]: AsciiExt::make_ascii_lowercase
|
||||
/// [`str::to_lowercase`]: ../primitive.str.html#method.to_lowercase
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
#[allow(deprecated)]
|
||||
@ -106,7 +103,7 @@ pub trait AsciiExt {
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// This method will be deprecated in favor of the identically-named
|
||||
/// This method is deprecated in favor of the identically-named
|
||||
/// inherent methods on `u8`, `char`, `[u8]` and `str`.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
fn eq_ignore_ascii_case(&self, other: &Self) -> bool;
|
||||
@ -121,10 +118,10 @@ pub trait AsciiExt {
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// This method will be deprecated in favor of the identically-named
|
||||
/// This method is deprecated in favor of the identically-named
|
||||
/// inherent methods on `u8`, `char`, `[u8]` and `str`.
|
||||
///
|
||||
/// [`to_ascii_uppercase`]: #tymethod.to_ascii_uppercase
|
||||
/// [`to_ascii_uppercase`]: AsciiExt::to_ascii_uppercase
|
||||
#[stable(feature = "ascii", since = "1.9.0")]
|
||||
fn make_ascii_uppercase(&mut self);
|
||||
|
||||
@ -138,10 +135,10 @@ pub trait AsciiExt {
|
||||
///
|
||||
/// # Note
|
||||
///
|
||||
/// This method will be deprecated in favor of the identically-named
|
||||
/// This method is deprecated in favor of the identically-named
|
||||
/// inherent methods on `u8`, `char`, `[u8]` and `str`.
|
||||
///
|
||||
/// [`to_ascii_lowercase`]: #tymethod.to_ascii_lowercase
|
||||
/// [`to_ascii_lowercase`]: AsciiExt::to_ascii_lowercase
|
||||
#[stable(feature = "ascii", since = "1.9.0")]
|
||||
fn make_ascii_lowercase(&mut self);
|
||||
}
|
||||
|
@ -7,9 +7,6 @@
|
||||
//! There are several functions and structs in this module that have a
|
||||
//! counterpart ending in `os`. Those ending in `os` will return an [`OsString`]
|
||||
//! and those without will return a [`String`].
|
||||
//!
|
||||
//! [`OsString`]: ../../std/ffi/struct.OsString.html
|
||||
//! [`String`]: ../string/struct.String.html
|
||||
|
||||
#![stable(feature = "env", since = "1.0.0")]
|
||||
|
||||
@ -31,9 +28,6 @@ use crate::sys::os as os_imp;
|
||||
/// * Current directory does not exist.
|
||||
/// * There are insufficient permissions to access the current directory.
|
||||
///
|
||||
/// [`PathBuf`]: ../../std/path/struct.PathBuf.html
|
||||
/// [`Err`]: ../../std/result/enum.Result.html#method.err
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -54,8 +48,6 @@ pub fn current_dir() -> io::Result<PathBuf> {
|
||||
///
|
||||
/// Returns an [`Err`] if the operation fails.
|
||||
///
|
||||
/// [`Err`]: ../../std/result/enum.Result.html#method.err
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -76,7 +68,7 @@ pub fn set_current_dir<P: AsRef<Path>>(path: P) -> io::Result<()> {
|
||||
/// This structure is created by the [`std::env::vars`] function. See its
|
||||
/// documentation for more.
|
||||
///
|
||||
/// [`std::env::vars`]: fn.vars.html
|
||||
/// [`std::env::vars`]: vars
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub struct Vars {
|
||||
inner: VarsOs,
|
||||
@ -87,7 +79,7 @@ pub struct Vars {
|
||||
/// This structure is created by the [`std::env::vars_os`] function. See
|
||||
/// its documentation for more.
|
||||
///
|
||||
/// [`std::env::vars_os`]: fn.vars_os.html
|
||||
/// [`std::env::vars_os`]: vars_os
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub struct VarsOs {
|
||||
inner: os_imp::Env,
|
||||
@ -106,7 +98,7 @@ pub struct VarsOs {
|
||||
/// environment is not valid unicode. If this is not desired, consider using the
|
||||
/// [`env::vars_os`] function.
|
||||
///
|
||||
/// [`env::vars_os`]: fn.vars_os.html
|
||||
/// [`env::vars_os`]: vars_os
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
@ -222,8 +214,6 @@ fn _var(key: &OsStr) -> Result<String, VarError> {
|
||||
/// Fetches the environment variable `key` from the current process, returning
|
||||
/// [`None`] if the variable isn't set.
|
||||
///
|
||||
/// [`None`]: ../option/enum.Option.html#variant.None
|
||||
///
|
||||
/// # Panics
|
||||
///
|
||||
/// This function may panic if `key` is empty, contains an ASCII equals sign
|
||||
@ -254,7 +244,7 @@ fn _var_os(key: &OsStr) -> Option<OsString> {
|
||||
/// The error type for operations interacting with environment variables.
|
||||
/// Possibly returned from the [`env::var`] function.
|
||||
///
|
||||
/// [`env::var`]: fn.var.html
|
||||
/// [`env::var`]: var
|
||||
#[derive(Debug, PartialEq, Eq, Clone)]
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub enum VarError {
|
||||
@ -382,8 +372,7 @@ fn _remove_var(k: &OsStr) {
|
||||
/// This structure is created by the [`std::env::split_paths`] function. See its
|
||||
/// documentation for more.
|
||||
///
|
||||
/// [`PathBuf`]: ../../std/path/struct.PathBuf.html
|
||||
/// [`std::env::split_paths`]: fn.split_paths.html
|
||||
/// [`std::env::split_paths`]: split_paths
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub struct SplitPaths<'a> {
|
||||
inner: os_imp::SplitPaths<'a>,
|
||||
@ -410,8 +399,6 @@ pub struct SplitPaths<'a> {
|
||||
/// None => println!("{} is not defined in the environment.", key)
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// [`PathBuf`]: ../../std/path/struct.PathBuf.html
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub fn split_paths<T: AsRef<OsStr> + ?Sized>(unparsed: &T) -> SplitPaths<'_> {
|
||||
SplitPaths { inner: os_imp::split_paths(unparsed.as_ref()) }
|
||||
@ -438,7 +425,7 @@ impl fmt::Debug for SplitPaths<'_> {
|
||||
/// The error type for operations on the `PATH` variable. Possibly returned from
|
||||
/// the [`env::join_paths`] function.
|
||||
///
|
||||
/// [`env::join_paths`]: fn.join_paths.html
|
||||
/// [`env::join_paths`]: join_paths
|
||||
#[derive(Debug)]
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub struct JoinPathsError {
|
||||
@ -450,14 +437,10 @@ pub struct JoinPathsError {
|
||||
///
|
||||
/// # Errors
|
||||
///
|
||||
/// Returns an [`Err`][err] (containing an error message) if one of the input
|
||||
/// Returns an [`Err`] (containing an error message) if one of the input
|
||||
/// [`Path`]s contains an invalid character for constructing the `PATH`
|
||||
/// variable (a double quote on Windows or a colon on Unix).
|
||||
///
|
||||
/// [`Path`]: ../../std/path/struct.Path.html
|
||||
/// [`OsString`]: ../../std/ffi/struct.OsString.html
|
||||
/// [err]: ../../std/result/enum.Result.html#variant.Err
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// Joining paths on a Unix-like platform:
|
||||
@ -508,7 +491,7 @@ pub struct JoinPathsError {
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// [`env::split_paths`]: fn.split_paths.html
|
||||
/// [`env::split_paths`]: split_paths
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub fn join_paths<I, T>(paths: I) -> Result<OsString, JoinPathsError>
|
||||
where
|
||||
@ -688,8 +671,7 @@ pub fn current_exe() -> io::Result<PathBuf> {
|
||||
/// set to arbitrary text, and may not even exist. This means this property
|
||||
/// should not be relied upon for security purposes.
|
||||
///
|
||||
/// [`String`]: ../string/struct.String.html
|
||||
/// [`std::env::args`]: ./fn.args.html
|
||||
/// [`std::env::args`]: args
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub struct Args {
|
||||
inner: ArgsOs,
|
||||
@ -705,8 +687,7 @@ pub struct Args {
|
||||
/// set to arbitrary text, and may not even exist. This means this property
|
||||
/// should not be relied upon for security purposes.
|
||||
///
|
||||
/// [`OsString`]: ../ffi/struct.OsString.html
|
||||
/// [`std::env::args_os`]: ./fn.args_os.html
|
||||
/// [`std::env::args_os`]: args_os
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub struct ArgsOs {
|
||||
inner: sys::args::Args,
|
||||
@ -744,8 +725,6 @@ pub struct ArgsOs {
|
||||
/// println!("{}", argument);
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// [`args_os`]: ./fn.args_os.html
|
||||
#[stable(feature = "env", since = "1.0.0")]
|
||||
pub fn args() -> Args {
|
||||
Args { inner: args_os() }
|
||||
|
@ -40,10 +40,8 @@ use crate::string;
|
||||
/// provide its own errors while also revealing some of the implementation for
|
||||
/// debugging via [`source`] chains.
|
||||
///
|
||||
/// [`Result<T, E>`]: ../result/enum.Result.html
|
||||
/// [`Display`]: ../fmt/trait.Display.html
|
||||
/// [`Debug`]: ../fmt/trait.Debug.html
|
||||
/// [`source`]: trait.Error.html#method.source
|
||||
/// [`Result<T, E>`]: Result
|
||||
/// [`source`]: Error::source
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub trait Error: Debug + Display {
|
||||
/// The lower-level source of this error, if any.
|
||||
@ -164,8 +162,6 @@ mod private {
|
||||
impl<'a, E: Error + 'a> From<E> for Box<dyn Error + 'a> {
|
||||
/// Converts a type of [`Error`] into a box of dyn [`Error`].
|
||||
///
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -199,8 +195,6 @@ impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync +
|
||||
/// Converts a type of [`Error`] + [`Send`] + [`Sync`] into a box of
|
||||
/// dyn [`Error`] + [`Send`] + [`Sync`].
|
||||
///
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -238,8 +232,6 @@ impl<'a, E: Error + Send + Sync + 'a> From<E> for Box<dyn Error + Send + Sync +
|
||||
impl From<String> for Box<dyn Error + Send + Sync> {
|
||||
/// Converts a [`String`] into a box of dyn [`Error`] + [`Send`] + [`Sync`].
|
||||
///
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -283,8 +275,6 @@ impl From<String> for Box<dyn Error + Send + Sync> {
|
||||
impl From<String> for Box<dyn Error> {
|
||||
/// Converts a [`String`] into a box of dyn [`Error`].
|
||||
///
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -306,8 +296,6 @@ impl From<String> for Box<dyn Error> {
|
||||
impl<'a> From<&str> for Box<dyn Error + Send + Sync + 'a> {
|
||||
/// Converts a [`str`] into a box of dyn [`Error`] + [`Send`] + [`Sync`].
|
||||
///
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -329,8 +317,6 @@ impl<'a> From<&str> for Box<dyn Error + Send + Sync + 'a> {
|
||||
impl From<&str> for Box<dyn Error> {
|
||||
/// Converts a [`str`] into a box of dyn [`Error`].
|
||||
///
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -350,9 +336,6 @@ impl From<&str> for Box<dyn Error> {
|
||||
impl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + Send + Sync + 'a> {
|
||||
/// Converts a [`Cow`] into a box of dyn [`Error`] + [`Send`] + [`Sync`].
|
||||
///
|
||||
/// [`Cow`]: ../borrow/enum.Cow.html
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -374,9 +357,6 @@ impl<'a, 'b> From<Cow<'b, str>> for Box<dyn Error + Send + Sync + 'a> {
|
||||
impl<'a> From<Cow<'a, str>> for Box<dyn Error> {
|
||||
/// Converts a [`Cow`] into a box of dyn [`Error`].
|
||||
///
|
||||
/// [`Cow`]: ../borrow/enum.Cow.html
|
||||
/// [`Error`]: ../error/trait.Error.html
|
||||
///
|
||||
/// # Examples
|
||||
///
|
||||
/// ```
|
||||
@ -703,7 +683,7 @@ impl dyn Error {
|
||||
/// assert!(iter.next().is_none());
|
||||
/// ```
|
||||
///
|
||||
/// [`source`]: trait.Error.html#method.source
|
||||
/// [`source`]: Error::source
|
||||
#[unstable(feature = "error_iter", issue = "58520")]
|
||||
#[inline]
|
||||
pub fn chain(&self) -> Chain<'_> {
|
||||
@ -715,8 +695,6 @@ impl dyn Error {
|
||||
///
|
||||
/// If you want to omit the initial error and only process
|
||||
/// its sources, use `skip(1)`.
|
||||
///
|
||||
/// [`Error`]: trait.Error.html
|
||||
#[unstable(feature = "error_iter", issue = "58520")]
|
||||
#[derive(Clone, Debug)]
|
||||
pub struct Chain<'a> {
|
||||
|
@ -30,10 +30,6 @@ pub use core::panic::{Location, PanicInfo};
|
||||
/// purpose of this trait is to encode what types are safe to cross a [`catch_unwind`]
|
||||
/// boundary with no fear of unwind safety.
|
||||
///
|
||||
/// [`Send`]: ../marker/trait.Send.html
|
||||
/// [`Sync`]: ../marker/trait.Sync.html
|
||||
/// [`catch_unwind`]: ./fn.catch_unwind.html
|
||||
///
|
||||
/// ## What is unwind safety?
|
||||
///
|
||||
/// In Rust a function can "return" early if it either panics or calls a
|
||||
@ -99,8 +95,6 @@ pub use core::panic::{Location, PanicInfo};
|
||||
/// above, the lack of `unsafe` means it is mostly an advisory. The
|
||||
/// [`AssertUnwindSafe`] wrapper struct can be used to force this trait to be
|
||||
/// implemented for any closed over variables passed to `catch_unwind`.
|
||||
///
|
||||
/// [`AssertUnwindSafe`]: ./struct.AssertUnwindSafe.html
|
||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||
#[rustc_on_unimplemented(
|
||||
message = "the type `{Self}` may not be safely transferred across an unwind boundary",
|
||||
@ -116,9 +110,6 @@ pub auto trait UnwindSafe {}
|
||||
///
|
||||
/// This is a "helper marker trait" used to provide impl blocks for the
|
||||
/// [`UnwindSafe`] trait, for more information see that documentation.
|
||||
///
|
||||
/// [`UnsafeCell`]: ../cell/struct.UnsafeCell.html
|
||||
/// [`UnwindSafe`]: ./trait.UnwindSafe.html
|
||||
#[stable(feature = "catch_unwind", since = "1.9.0")]
|
||||
#[rustc_on_unimplemented(
|
||||
message = "the type `{Self}` may contain interior mutability and a reference may not be safely \
|
||||
@ -138,7 +129,6 @@ pub auto trait RefUnwindSafe {}
|
||||
/// account. This wrapper struct is useful for a quick and lightweight
|
||||
/// annotation that a variable is indeed unwind safe.
|
||||
///
|
||||
/// [`catch_unwind`]: ./fn.catch_unwind.html
|
||||
/// # Examples
|
||||
///
|
||||
/// One way to use `AssertUnwindSafe` is to assert that the entire closure
|
||||
@ -352,8 +342,6 @@ impl<F: Future> Future for AssertUnwindSafe<F> {
|
||||
/// can fail on a regular basis. Additionally, this function is not guaranteed
|
||||
/// to catch all panics, see the "Notes" section below.
|
||||
///
|
||||
/// [`Result`]: ../result/enum.Result.html
|
||||
///
|
||||
/// The closure provided is required to adhere to the [`UnwindSafe`] trait to ensure
|
||||
/// that all captured variables are safe to cross this boundary. The purpose of
|
||||
/// this bound is to encode the concept of [exception safety][rfc] in the type
|
||||
@ -362,9 +350,6 @@ impl<F: Future> Future for AssertUnwindSafe<F> {
|
||||
/// becomes a problem the [`AssertUnwindSafe`] wrapper struct can be used to quickly
|
||||
/// assert that the usage here is indeed unwind safe.
|
||||
///
|
||||
/// [`AssertUnwindSafe`]: ./struct.AssertUnwindSafe.html
|
||||
/// [`UnwindSafe`]: ./trait.UnwindSafe.html
|
||||
///
|
||||
/// [rfc]: https://github.com/rust-lang/rfcs/blob/master/text/1236-stabilize-catch-panic.md
|
||||
///
|
||||
/// # Notes
|
||||
@ -399,8 +384,6 @@ pub fn catch_unwind<F: FnOnce() -> R + UnwindSafe, R>(f: F) -> Result<R> {
|
||||
/// This is designed to be used in conjunction with [`catch_unwind`] to, for
|
||||
/// example, carry a panic across a layer of C code.
|
||||
///
|
||||
/// [`catch_unwind`]: ./fn.catch_unwind.html
|
||||
///
|
||||
/// # Notes
|
||||
///
|
||||
/// Note that panics in Rust are not always implemented via unwinding, but they
|
||||
|
@ -204,7 +204,7 @@ target | std | host | notes
|
||||
`thumbv4t-none-eabi` | * | | ARMv4T T32
|
||||
`x86_64-apple-ios-macabi` | ✓[^apple] | | Apple Catalyst
|
||||
`x86_64-apple-tvos` | *[^apple] | | x86 64-bit tvOS
|
||||
`x86_64-linux-kernel` | ? | | Linux kernel modules
|
||||
`x86_64-linux-kernel` | * | | Linux kernel modules
|
||||
`x86_64-pc-solaris` | ? | |
|
||||
`x86_64-pc-windows-msvc` | ✓ | | 64-bit Windows XP support
|
||||
`x86_64-unknown-cloudabi` | ✓ | | 64-bit CloudABI
|
||||
|
@ -1,31 +1,25 @@
|
||||
An non-ascii identifier was used in an invalid context.
|
||||
|
||||
Erroneous code example:
|
||||
Erroneous code examples:
|
||||
|
||||
```compile_fail,E0754
|
||||
# #![feature(non_ascii_idents)]
|
||||
|
||||
mod řųśť;
|
||||
// ^ error!
|
||||
fn main() {}
|
||||
```
|
||||
|
||||
```compile_fail,E0754
|
||||
# #![feature(non_ascii_idents)]
|
||||
mod řųśť; // error!
|
||||
|
||||
#[no_mangle]
|
||||
fn řųśť() {}
|
||||
// ^ error!
|
||||
fn řųśť() {} // error!
|
||||
|
||||
fn main() {}
|
||||
```
|
||||
|
||||
Non-ascii can be used as module names if it is inline
|
||||
or a #\[path\] attribute is specified. For example:
|
||||
Non-ascii can be used as module names if it is inlined or if a `#[path]`
|
||||
attribute is specified. For example:
|
||||
|
||||
```
|
||||
# #![feature(non_ascii_idents)]
|
||||
|
||||
mod řųśť {
|
||||
mod řųśť { // ok!
|
||||
const IS_GREAT: bool = true;
|
||||
}
|
||||
|
||||
|
@ -127,14 +127,15 @@ impl Diagnostic {
|
||||
}
|
||||
|
||||
/// Adds a span/label to be included in the resulting snippet.
|
||||
/// This label will be shown together with the original span/label used when creating the
|
||||
/// diagnostic, *not* a span added by one of the `span_*` methods.
|
||||
///
|
||||
/// This is pushed onto the `MultiSpan` that was created when the
|
||||
/// diagnostic was first built. If you don't call this function at
|
||||
/// all, and you just supplied a `Span` to create the diagnostic,
|
||||
/// then the snippet will just include that `Span`, which is
|
||||
/// called the primary span.
|
||||
/// This is pushed onto the [`MultiSpan`] that was created when the diagnostic
|
||||
/// was first built. That means it will be shown together with the original
|
||||
/// span/label, *not* a span added by one of the `span_{note,warn,help,suggestions}` methods.
|
||||
///
|
||||
/// This span is *not* considered a ["primary span"][`MultiSpan`]; only
|
||||
/// the `Span` supplied when creating the diagnostic is primary.
|
||||
///
|
||||
/// [`MultiSpan`]: ../rustc_span/struct.MultiSpan.html
|
||||
pub fn span_label<T: Into<String>>(&mut self, span: Span, label: T) -> &mut Self {
|
||||
self.span.push_span_label(span, label.into());
|
||||
self
|
||||
|
@ -184,11 +184,15 @@ impl<'a> DiagnosticBuilder<'a> {
|
||||
}
|
||||
|
||||
/// Adds a span/label to be included in the resulting snippet.
|
||||
/// This is pushed onto the `MultiSpan` that was created when the
|
||||
/// diagnostic was first built. If you don't call this function at
|
||||
/// all, and you just supplied a `Span` to create the diagnostic,
|
||||
/// then the snippet will just include that `Span`, which is
|
||||
/// called the primary span.
|
||||
///
|
||||
/// This is pushed onto the [`MultiSpan`] that was created when the diagnostic
|
||||
/// was first built. That means it will be shown together with the original
|
||||
/// span/label, *not* a span added by one of the `span_{note,warn,help,suggestions}` methods.
|
||||
///
|
||||
/// This span is *not* considered a ["primary span"][`MultiSpan`]; only
|
||||
/// the `Span` supplied when creating the diagnostic is primary.
|
||||
///
|
||||
/// [`MultiSpan`]: ../rustc_span/struct.MultiSpan.html
|
||||
pub fn span_label(&mut self, span: Span, label: impl Into<String>) -> &mut Self {
|
||||
self.0.diagnostic.span_label(span, label);
|
||||
self
|
||||
|
@ -228,7 +228,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> {
|
||||
let base_ty = Place::ty_from(place.local, proj_base, self.body, self.tcx).ty;
|
||||
match base_ty.kind {
|
||||
ty::RawPtr(..) => self.require_unsafe(
|
||||
UnsafetyViolationKind::General,
|
||||
UnsafetyViolationKind::GeneralAndConstFn,
|
||||
UnsafetyViolationDetails::DerefOfRawPointer,
|
||||
),
|
||||
ty::Adt(adt, _) => {
|
||||
|
@ -36,6 +36,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
self.suggest_missing_await(err, expr, expected, expr_ty);
|
||||
self.suggest_missing_parentheses(err, expr);
|
||||
self.note_need_for_fn_pointer(err, expected, expr_ty);
|
||||
self.note_internal_mutation_in_method(err, expr, expected, expr_ty);
|
||||
}
|
||||
|
||||
// Requires that the two types unify, and prints an error message if
|
||||
|
@ -5198,6 +5198,51 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
||||
}
|
||||
}
|
||||
|
||||
fn note_internal_mutation_in_method(
|
||||
&self,
|
||||
err: &mut DiagnosticBuilder<'_>,
|
||||
expr: &hir::Expr<'_>,
|
||||
expected: Ty<'tcx>,
|
||||
found: Ty<'tcx>,
|
||||
) {
|
||||
if found != self.tcx.types.unit {
|
||||
return;
|
||||
}
|
||||
if let ExprKind::MethodCall(path_segment, _, [rcvr, ..], _) = expr.kind {
|
||||
if self
|
||||
.typeck_results
|
||||
.borrow()
|
||||
.expr_ty_adjusted_opt(rcvr)
|
||||
.map_or(true, |ty| expected.peel_refs() != ty.peel_refs())
|
||||
{
|
||||
return;
|
||||
}
|
||||
let mut sp = MultiSpan::from_span(path_segment.ident.span);
|
||||
sp.push_span_label(
|
||||
path_segment.ident.span,
|
||||
format!(
|
||||
"this call modifies {} in-place",
|
||||
match rcvr.kind {
|
||||
ExprKind::Path(QPath::Resolved(
|
||||
None,
|
||||
hir::Path { segments: [segment], .. },
|
||||
)) => format!("`{}`", segment.ident),
|
||||
_ => "its receiver".to_string(),
|
||||
}
|
||||
),
|
||||
);
|
||||
sp.push_span_label(
|
||||
rcvr.span,
|
||||
"you probably want to use this value after calling the method...".to_string(),
|
||||
);
|
||||
err.span_note(
|
||||
sp,
|
||||
&format!("method `{}` modifies its receiver in-place", path_segment.ident),
|
||||
);
|
||||
err.note(&format!("...instead of the `()` output of method `{}`", path_segment.ident));
|
||||
}
|
||||
}
|
||||
|
||||
/// When encountering an `impl Future` where `BoxFuture` is expected, suggest `Box::pin`.
|
||||
fn suggest_calling_boxed_future_when_appropriate(
|
||||
&self,
|
||||
|
@ -0,0 +1,11 @@
|
||||
// check-pass
|
||||
#![feature(const_raw_ptr_deref)]
|
||||
#![feature(raw_ref_macros)]
|
||||
|
||||
use std::ptr;
|
||||
|
||||
const fn test_fn(x: *const i32) {
|
||||
let x2 = unsafe { ptr::raw_const!(*x) };
|
||||
}
|
||||
|
||||
fn main() {}
|
@ -1,4 +1,4 @@
|
||||
const fn bad_const_fn_deref_raw(x: *mut usize) -> &'static usize { unsafe { &*x } } //~ is unsafe
|
||||
const fn bad_const_fn_deref_raw(x: *mut usize) -> &'static usize { unsafe { &*x } }
|
||||
//~^ dereferencing raw pointers in constant functions
|
||||
|
||||
const unsafe fn bad_const_unsafe_deref_raw(x: *mut usize) -> usize { *x }
|
||||
|
@ -34,15 +34,7 @@ LL | Foo { x: () }.y
|
||||
= note: see issue #57563 <https://github.com/rust-lang/rust/issues/57563> for more information
|
||||
= help: add `#![feature(const_fn)]` to the crate attributes to enable
|
||||
|
||||
error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block
|
||||
--> $DIR/min_const_fn_unsafe_bad.rs:1:77
|
||||
|
|
||||
LL | const fn bad_const_fn_deref_raw(x: *mut usize) -> &'static usize { unsafe { &*x } }
|
||||
| ^^^ dereference of raw pointer
|
||||
|
|
||||
= note: raw pointers may be NULL, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
error: aborting due to 5 previous errors
|
||||
|
||||
Some errors have detailed explanations: E0133, E0658, E0723.
|
||||
For more information about an error, try `rustc --explain E0133`.
|
||||
Some errors have detailed explanations: E0658, E0723.
|
||||
For more information about an error, try `rustc --explain E0658`.
|
||||
|
@ -0,0 +1,4 @@
|
||||
fn main() {}
|
||||
fn foo(mut s: String) -> String {
|
||||
s.push_str("asdf") //~ ERROR mismatched types
|
||||
}
|
@ -0,0 +1,20 @@
|
||||
error[E0308]: mismatched types
|
||||
--> $DIR/chain-method-call-mutation-in-place.rs:3:5
|
||||
|
|
||||
LL | fn foo(mut s: String) -> String {
|
||||
| ------ expected `std::string::String` because of return type
|
||||
LL | s.push_str("asdf")
|
||||
| ^^^^^^^^^^^^^^^^^^ expected struct `std::string::String`, found `()`
|
||||
|
|
||||
note: method `push_str` modifies its receiver in-place
|
||||
--> $DIR/chain-method-call-mutation-in-place.rs:3:7
|
||||
|
|
||||
LL | s.push_str("asdf")
|
||||
| - ^^^^^^^^ this call modifies `s` in-place
|
||||
| |
|
||||
| you probably want to use this value after calling the method...
|
||||
= note: ...instead of the `()` output of method `push_str`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
For more information about this error, try `rustc --explain E0308`.
|
Loading…
Reference in New Issue
Block a user