diff --git a/util/bigint/src/uint.rs b/util/bigint/src/uint.rs index f87b494a9..5c8da4a3c 100644 --- a/util/bigint/src/uint.rs +++ b/util/bigint/src/uint.rs @@ -92,8 +92,8 @@ macro_rules! uint_overflowing_add_reg { macro_rules! uint_overflowing_add { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; - let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; - let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; + let self_t: &[u64; 4] = &self.0; + let other_t: &[u64; 4] = &other.0; let overflow: u8; unsafe { @@ -115,8 +115,8 @@ macro_rules! uint_overflowing_add { }); (U512, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 8] = unsafe { mem::uninitialized() }; - let self_t: &[u64; 8] = unsafe { &mem::transmute($self_expr) }; - let other_t: &[u64; 8] = unsafe { &mem::transmute($other) }; + let self_t: &[u64; 8] = &self.0; + let other_t: &[u64; 8] = &other.0; let overflow: u8; @@ -196,8 +196,8 @@ macro_rules! uint_overflowing_sub_reg { macro_rules! uint_overflowing_sub { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; - let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; - let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; + let self_t: &[u64; 4] = &self.0; + let other_t: &[u64; 4] = &other.0; let overflow: u8; unsafe { @@ -218,8 +218,8 @@ macro_rules! uint_overflowing_sub { }); (U512, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 8] = unsafe { mem::uninitialized() }; - let self_t: &[u64; 8] = unsafe { &mem::transmute($self_expr) }; - let other_t: &[u64; 8] = unsafe { &mem::transmute($other) }; + let self_t: &[u64; 8] = &self.0; + let other_t: &[u64; 8] = &other.0; let overflow: u8; @@ -270,8 +270,8 @@ macro_rules! uint_overflowing_sub { macro_rules! uint_overflowing_mul { (U256, $n_words: expr, $self_expr: expr, $other: expr) => ({ let mut result: [u64; 4] = unsafe { mem::uninitialized() }; - let self_t: &[u64; 4] = unsafe { &mem::transmute($self_expr) }; - let other_t: &[u64; 4] = unsafe { &mem::transmute($other) }; + let self_t: &[u64; 4] = &self.0; + let other_t: &[u64; 4] = &self.0; let overflow: u64; unsafe { @@ -548,6 +548,7 @@ pub trait Uint: Sized + Default + FromStr + From + fmt::Debug + fmt::Displa macro_rules! construct_uint { ($name:ident, $n_words:expr) => ( /// Little-endian large integer type + #[repr(C)] #[derive(Copy, Clone, Eq, PartialEq)] pub struct $name(pub [u64; $n_words]); @@ -1132,8 +1133,8 @@ impl U256 { /// No overflow possible #[cfg(all(asm_available, target_arch="x86_64"))] pub fn full_mul(self, other: U256) -> U512 { - let self_t: &[u64; 4] = unsafe { &mem::transmute(self) }; - let other_t: &[u64; 4] = unsafe { &mem::transmute(other) }; + let self_t: &[u64; 4] = &self.0; + let other_t: &[u64; 4] = &other.0; let mut result: [u64; 8] = unsafe { mem::uninitialized() }; unsafe { asm!("