@@ -236,14 +236,22 @@ impl<'tcx, Tag> Scalar<Tag> {
236236 Scalar :: Raw { data : c as u128 , size : 4 }
237237 }
238238
239+ #[ inline]
240+ pub fn try_from_uint ( i : impl Into < u128 > , size : Size ) -> Option < Self > {
241+ let i = i. into ( ) ;
242+ if truncate ( i, size) == i {
243+ Some ( Scalar :: Raw { data : i, size : size. bytes ( ) as u8 } )
244+ } else {
245+ None
246+ }
247+ }
248+
239249 #[ inline]
240250 pub fn from_uint ( i : impl Into < u128 > , size : Size ) -> Self {
241251 let i = i. into ( ) ;
242- assert_eq ! (
243- truncate( i, size) , i,
244- "Unsigned value {:#x} does not fit in {} bits" , i, size. bits( )
245- ) ;
246- Scalar :: Raw { data : i, size : size. bytes ( ) as u8 }
252+ Self :: try_from_uint ( i, size) . unwrap_or_else ( || {
253+ bug ! ( "Unsigned value {:#x} does not fit in {} bits" , i, size. bits( ) )
254+ } )
247255 }
248256
249257 #[ inline]
@@ -267,15 +275,23 @@ impl<'tcx, Tag> Scalar<Tag> {
267275 }
268276
269277 #[ inline]
270- pub fn from_int ( i : impl Into < i128 > , size : Size ) -> Self {
278+ pub fn try_from_int ( i : impl Into < i128 > , size : Size ) -> Option < Self > {
271279 let i = i. into ( ) ;
272280 // `into` performed sign extension, we have to truncate
273281 let truncated = truncate ( i as u128 , size) ;
274- assert_eq ! (
275- sign_extend( truncated, size) as i128 , i,
276- "Signed value {:#x} does not fit in {} bits" , i, size. bits( )
277- ) ;
278- Scalar :: Raw { data : truncated, size : size. bytes ( ) as u8 }
282+ if sign_extend ( truncated, size) as i128 == i {
283+ Some ( Scalar :: Raw { data : truncated, size : size. bytes ( ) as u8 } )
284+ } else {
285+ None
286+ }
287+ }
288+
289+ #[ inline]
290+ pub fn from_int ( i : impl Into < i128 > , size : Size ) -> Self {
291+ let i = i. into ( ) ;
292+ Self :: try_from_int ( i, size) . unwrap_or_else ( || {
293+ bug ! ( "Signed value {:#x} does not fit in {} bits" , i, size. bits( ) )
294+ } )
279295 }
280296
281297 #[ inline]
0 commit comments