diff options
| author | Ralf Jung <post@ralfj.de> | 2018-08-24 18:36:52 +0200 |
|---|---|---|
| committer | Ralf Jung <post@ralfj.de> | 2018-08-27 18:12:49 +0200 |
| commit | 548b3738c2fa83d8ba91384cbcd2df37b2eba45c (patch) | |
| tree | 4ba3f8259ad2b058192ee9bd6513ee7e7a45c270 /src/librustc/mir | |
| parent | 9cfc9f07657dca1a08f99656dd1cd8da4b7db0c7 (diff) | |
| download | rust-548b3738c2fa83d8ba91384cbcd2df37b2eba45c.tar.gz rust-548b3738c2fa83d8ba91384cbcd2df37b2eba45c.zip | |
dedicated handling for binops on bool and char (UB if they are not valid)
Diffstat (limited to 'src/librustc/mir')
| -rw-r--r-- | src/librustc/mir/interpret/value.rs | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/src/librustc/mir/interpret/value.rs b/src/librustc/mir/interpret/value.rs index 958c50e69d2..d793bb1cc63 100644 --- a/src/librustc/mir/interpret/value.rs +++ b/src/librustc/mir/interpret/value.rs @@ -187,27 +187,35 @@ impl<'tcx> Scalar { } } - fn to_u8(self) -> EvalResult<'static, u8> { + pub fn to_char(self) -> EvalResult<'tcx, char> { + let val = self.to_u32()?; + match ::std::char::from_u32(val) { + Some(c) => Ok(c), + None => err!(InvalidChar(val as u128)), + } + } + + pub fn to_u8(self) -> EvalResult<'static, u8> { let sz = Size::from_bits(8); let b = self.to_bits(sz)?; assert_eq!(b as u8 as u128, b); Ok(b as u8) } - fn to_u32(self) -> EvalResult<'static, u32> { + pub fn to_u32(self) -> EvalResult<'static, u32> { let sz = Size::from_bits(32); let b = self.to_bits(sz)?; assert_eq!(b as u32 as u128, b); Ok(b as u32) } - fn to_usize(self, cx: impl HasDataLayout) -> EvalResult<'static, u64> { + pub fn to_usize(self, cx: impl HasDataLayout) -> EvalResult<'static, u64> { let b = self.to_bits(cx.data_layout().pointer_size)?; assert_eq!(b as u64 as u128, b); Ok(b as u64) } - fn to_i8(self) -> EvalResult<'static, i8> { + pub fn to_i8(self) -> EvalResult<'static, i8> { let sz = Size::from_bits(8); let b = self.to_bits(sz)?; let b = sign_extend(b, sz) as i128; @@ -215,7 +223,7 @@ impl<'tcx> Scalar { Ok(b as i8) } - fn to_i32(self) -> EvalResult<'static, i32> { + pub fn to_i32(self) -> EvalResult<'static, i32> { let sz = Size::from_bits(32); let b = self.to_bits(sz)?; let b = sign_extend(b, sz) as i128; @@ -223,7 +231,7 @@ impl<'tcx> Scalar { Ok(b as i32) } - fn to_isize(self, cx: impl HasDataLayout) -> EvalResult<'static, i64> { + pub fn to_isize(self, cx: impl HasDataLayout) -> EvalResult<'static, i64> { let b = self.to_bits(cx.data_layout().pointer_size)?; let b = sign_extend(b, cx.data_layout().pointer_size) as i128; assert_eq!(b as i64 as i128, b); @@ -296,6 +304,11 @@ impl<'tcx> ScalarMaybeUndef { } #[inline(always)] + pub fn to_char(self) -> EvalResult<'tcx, char> { + self.not_undef()?.to_char() + } + + #[inline(always)] pub fn to_u8(self) -> EvalResult<'tcx, u8> { self.not_undef()?.to_u8() } |
