@@ -236,14 +236,22 @@ impl<'tcx, Tag> Scalar<Tag> {
236
236
Scalar :: Raw { data : c as u128 , size : 4 }
237
237
}
238
238
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
+
239
249
#[ inline]
240
250
pub fn from_uint ( i : impl Into < u128 > , size : Size ) -> Self {
241
251
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
+ } )
247
255
}
248
256
249
257
#[ inline]
@@ -267,15 +275,23 @@ impl<'tcx, Tag> Scalar<Tag> {
267
275
}
268
276
269
277
#[ 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 > {
271
279
let i = i. into ( ) ;
272
280
// `into` performed sign extension, we have to truncate
273
281
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
+ } )
279
295
}
280
296
281
297
#[ inline]
0 commit comments