Skip to content

Commit

Permalink
clean up transmutes in core
Browse files Browse the repository at this point in the history
  • Loading branch information
Lukas Markeffsky committed May 6, 2023
1 parent 151a070 commit 7e3b934
Show file tree
Hide file tree
Showing 2 changed files with 9 additions and 13 deletions.
4 changes: 2 additions & 2 deletions library/core/src/mem/maybe_uninit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1287,7 +1287,7 @@ impl<T, const N: usize> MaybeUninit<[T; N]> {
#[inline]
pub const fn transpose(self) -> [MaybeUninit<T>; N] {
// SAFETY: T and MaybeUninit<T> have the same layout
unsafe { super::transmute_copy(&ManuallyDrop::new(self)) }
unsafe { intrinsics::transmute_unchecked(self) }
}
}

Expand All @@ -1307,6 +1307,6 @@ impl<T, const N: usize> [MaybeUninit<T>; N] {
#[inline]
pub const fn transpose(self) -> MaybeUninit<[T; N]> {
// SAFETY: T and MaybeUninit<T> have the same layout
unsafe { super::transmute_copy(&ManuallyDrop::new(self)) }
unsafe { intrinsics::transmute_unchecked(self) }
}
}
18 changes: 7 additions & 11 deletions library/core/src/tuple.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// See src/libstd/primitive_docs.rs for documentation.

use crate::cmp::Ordering::{self, *};
use crate::mem::transmute;

// Recursive macro for implementing n-ary tuple functions and operations
//
Expand Down Expand Up @@ -142,16 +141,13 @@ macro_rules! maybe_tuple_doc {
#[inline]
const fn ordering_is_some(c: Option<Ordering>, x: Ordering) -> bool {
// FIXME: Just use `==` once that's const-stable on `Option`s.
// This isn't using `match` because that optimizes worse due to
// making a two-step check (`Some` *then* the inner value).

// SAFETY: There's no public guarantee for `Option<Ordering>`,
// but we're core so we know that it's definitely a byte.
unsafe {
let c: i8 = transmute(c);
let x: i8 = transmute(Some(x));
c == x
}
// This is mapping `None` to 2 and then doing the comparison afterwards
// because it optimizes better (`None::<Ordering>` is represented as 2).
x as i8
== match c {
Some(c) => c as i8,
None => 2,
}
}

// Constructs an expression that performs a lexical ordering using method `$rel`.
Expand Down

0 comments on commit 7e3b934

Please sign in to comment.