diff --git a/src/shims/thread.rs b/src/shims/thread.rs index d11853d53452..29a4ed367687 100644 --- a/src/shims/thread.rs +++ b/src/shims/thread.rs @@ -1,3 +1,5 @@ +use std::convert::TryInto; + use crate::*; use rustc_target::abi::LayoutOf; @@ -63,7 +65,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx } let thread_id = this.read_scalar(thread)?.to_machine_usize(this)?; - this.join_thread(thread_id.into())?; + this.join_thread(thread_id.try_into().expect("thread ID should fit in u32"))?; Ok(0) } @@ -72,7 +74,7 @@ pub trait EvalContextExt<'mir, 'tcx: 'mir>: crate::MiriEvalContextExt<'mir, 'tcx let this = self.eval_context_mut(); let thread_id = this.read_scalar(thread)?.to_machine_usize(this)?; - this.detach_thread(thread_id.into())?; + this.detach_thread(thread_id.try_into().expect("thread ID should fit in u32"))?; Ok(0) } diff --git a/src/thread.rs b/src/thread.rs index 715107530cef..69e7bcdb298c 100644 --- a/src/thread.rs +++ b/src/thread.rs @@ -3,7 +3,7 @@ use std::cell::RefCell; use std::convert::TryFrom; use std::convert::TryInto; -use std::num::NonZeroU32; +use std::num::{NonZeroU32, TryFromIntError}; use log::trace; @@ -45,20 +45,22 @@ impl Idx for ThreadId { fn new(idx: usize) -> Self { ThreadId(u32::try_from(idx).unwrap()) } + fn index(self) -> usize { usize::try_from(self.0).unwrap() } } -impl From for ThreadId { - fn from(id: u64) -> Self { - Self(u32::try_from(id).unwrap()) +impl TryFrom for ThreadId { + type Error = TryFromIntError; + fn try_from(id: u64) -> Result { + u32::try_from(id).map(|id_u32| Self(id_u32)) } } impl From for ThreadId { fn from(id: u32) -> Self { - Self(u32::try_from(id).unwrap()) + Self(id) } }