mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Implement alloc::vec::IsZero
for Option<$NUM>
types
This commit is contained in:
parent
f34cc658eb
commit
b94a29a25f
@ -106,6 +106,7 @@
|
|||||||
#![feature(const_size_of_val)]
|
#![feature(const_size_of_val)]
|
||||||
#![feature(const_align_of_val)]
|
#![feature(const_align_of_val)]
|
||||||
#![feature(const_ptr_read)]
|
#![feature(const_ptr_read)]
|
||||||
|
#![feature(const_maybe_uninit_zeroed)]
|
||||||
#![feature(const_maybe_uninit_write)]
|
#![feature(const_maybe_uninit_write)]
|
||||||
#![feature(const_maybe_uninit_as_mut_ptr)]
|
#![feature(const_maybe_uninit_as_mut_ptr)]
|
||||||
#![feature(const_refs_to_cell)]
|
#![feature(const_refs_to_cell)]
|
||||||
|
@ -147,6 +147,23 @@ impl_is_zero_option_of_nonzero!(
|
|||||||
NonZeroIsize,
|
NonZeroIsize,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
macro_rules! impl_is_zero_option_of_num {
|
||||||
|
($($t:ty,)+) => {$(
|
||||||
|
unsafe impl IsZero for Option<$t> {
|
||||||
|
#[inline]
|
||||||
|
fn is_zero(&self) -> bool {
|
||||||
|
const {
|
||||||
|
let none: Self = unsafe { core::mem::MaybeUninit::zeroed().assume_init() };
|
||||||
|
assert!(none.is_none());
|
||||||
|
}
|
||||||
|
self.is_none()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)+};
|
||||||
|
}
|
||||||
|
|
||||||
|
impl_is_zero_option_of_num!(u8, u16, u32, u64, u128, i8, i16, i32, i64, i128, usize, isize,);
|
||||||
|
|
||||||
unsafe impl<T: IsZero> IsZero for Wrapping<T> {
|
unsafe impl<T: IsZero> IsZero for Wrapping<T> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn is_zero(&self) -> bool {
|
fn is_zero(&self) -> bool {
|
||||||
|
@ -161,6 +161,23 @@ pub fn vec_option_bool(n: usize) -> Vec<Option<bool>> {
|
|||||||
vec![Some(false); n]
|
vec![Some(false); n]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CHECK-LABEL: @vec_option_i32
|
||||||
|
#[no_mangle]
|
||||||
|
pub fn vec_option_i32(n: usize) -> Vec<Option<i32>> {
|
||||||
|
// CHECK-NOT: call {{.*}}alloc::vec::from_elem
|
||||||
|
// CHECK-NOT: call {{.*}}reserve
|
||||||
|
// CHECK-NOT: call {{.*}}__rust_alloc(
|
||||||
|
|
||||||
|
// CHECK: call {{.*}}__rust_alloc_zeroed(
|
||||||
|
|
||||||
|
// CHECK-NOT: call {{.*}}alloc::vec::from_elem
|
||||||
|
// CHECK-NOT: call {{.*}}reserve
|
||||||
|
// CHECK-NOT: call {{.*}}__rust_alloc(
|
||||||
|
|
||||||
|
// CHECK: ret void
|
||||||
|
vec![None; n]
|
||||||
|
}
|
||||||
|
|
||||||
// Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away.
|
// Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away.
|
||||||
// CHECK: declare noalias ptr @__rust_alloc_zeroed(i64, i64 allocalign) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]]
|
// CHECK: declare noalias ptr @__rust_alloc_zeroed(i64, i64 allocalign) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]]
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user