Rollup merge of #93236 - woppopo:const_nonnull_new, r=oli-obk
Make `NonNull::new` `const` Tracking issue: #93235
This commit is contained in:
commit
37e9cb34e5
@ -211,8 +211,9 @@ impl<T: ?Sized> NonNull<T> {
|
||||
/// }
|
||||
/// ```
|
||||
#[stable(feature = "nonnull", since = "1.25.0")]
|
||||
#[rustc_const_unstable(feature = "const_nonnull_new", issue = "93235")]
|
||||
#[inline]
|
||||
pub fn new(ptr: *mut T) -> Option<Self> {
|
||||
pub const fn new(ptr: *mut T) -> Option<Self> {
|
||||
if !ptr.is_null() {
|
||||
// SAFETY: The pointer is already checked and is not null
|
||||
Some(unsafe { Self::new_unchecked(ptr) })
|
||||
|
@ -17,7 +17,9 @@
|
||||
#![feature(const_maybe_uninit_as_mut_ptr)]
|
||||
#![feature(const_maybe_uninit_assume_init)]
|
||||
#![feature(const_maybe_uninit_assume_init_read)]
|
||||
#![feature(const_nonnull_new)]
|
||||
#![feature(const_num_from_num)]
|
||||
#![feature(const_ptr_as_ref)]
|
||||
#![feature(const_ptr_read)]
|
||||
#![feature(const_ptr_write)]
|
||||
#![feature(const_ptr_offset)]
|
||||
|
@ -274,6 +274,21 @@ fn test_unsized_nonnull() {
|
||||
assert!(ys == zs);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_const_nonnull_new() {
|
||||
const {
|
||||
assert!(NonNull::new(core::ptr::null_mut::<()>()).is_none());
|
||||
|
||||
let value = &mut 0u32;
|
||||
let mut ptr = NonNull::new(value).unwrap();
|
||||
unsafe { *ptr.as_mut() = 42 };
|
||||
|
||||
let reference = unsafe { &*ptr.as_ref() };
|
||||
assert!(*reference == *value);
|
||||
assert!(*reference == 42);
|
||||
};
|
||||
}
|
||||
|
||||
#[test]
|
||||
#[allow(warnings)]
|
||||
// Have a symbol for the test below. It doesn’t need to be an actual variadic function, match the
|
||||
|
Loading…
x
Reference in New Issue
Block a user