@@ -3804,14 +3804,11 @@ mod ptr_try_from_impls {
3804
3804
try_from_both_bounded ! ( isize , i8 ) ;
3805
3805
try_from_unbounded ! ( isize , i16 , i32 , i64 , i128 ) ;
3806
3806
3807
- rev ! ( try_from_unbounded, usize , u16 ) ;
3808
3807
rev ! ( try_from_upper_bounded, usize , u32 , u64 , u128 ) ;
3809
3808
rev ! ( try_from_lower_bounded, usize , i8 , i16 ) ;
3810
3809
rev ! ( try_from_both_bounded, usize , i32 , i64 , i128 ) ;
3811
3810
3812
- rev ! ( try_from_unbounded, isize , u8 ) ;
3813
3811
rev ! ( try_from_upper_bounded, isize , u16 , u32 , u64 , u128 ) ;
3814
- rev ! ( try_from_unbounded, isize , i16 ) ;
3815
3812
rev ! ( try_from_both_bounded, isize , i32 , i64 , i128 ) ;
3816
3813
}
3817
3814
@@ -3830,14 +3827,14 @@ mod ptr_try_from_impls {
3830
3827
try_from_both_bounded ! ( isize , i8 , i16 ) ;
3831
3828
try_from_unbounded ! ( isize , i32 , i64 , i128 ) ;
3832
3829
3833
- rev ! ( try_from_unbounded, usize , u16 , u32 ) ;
3830
+ rev ! ( try_from_unbounded, usize , u32 ) ;
3834
3831
rev ! ( try_from_upper_bounded, usize , u64 , u128 ) ;
3835
3832
rev ! ( try_from_lower_bounded, usize , i8 , i16 , i32 ) ;
3836
3833
rev ! ( try_from_both_bounded, usize , i64 , i128 ) ;
3837
3834
3838
- rev ! ( try_from_unbounded, isize , u8 , u16 ) ;
3835
+ rev ! ( try_from_unbounded, isize , u16 ) ;
3839
3836
rev ! ( try_from_upper_bounded, isize , u32 , u64 , u128 ) ;
3840
- rev ! ( try_from_unbounded, isize , i16 , i32 ) ;
3837
+ rev ! ( try_from_unbounded, isize , i32 ) ;
3841
3838
rev ! ( try_from_both_bounded, isize , i64 , i128 ) ;
3842
3839
}
3843
3840
@@ -3856,14 +3853,14 @@ mod ptr_try_from_impls {
3856
3853
try_from_both_bounded ! ( isize , i8 , i16 , i32 ) ;
3857
3854
try_from_unbounded ! ( isize , i64 , i128 ) ;
3858
3855
3859
- rev ! ( try_from_unbounded, usize , u16 , u32 , u64 ) ;
3856
+ rev ! ( try_from_unbounded, usize , u32 , u64 ) ;
3860
3857
rev ! ( try_from_upper_bounded, usize , u128 ) ;
3861
3858
rev ! ( try_from_lower_bounded, usize , i8 , i16 , i32 , i64 ) ;
3862
3859
rev ! ( try_from_both_bounded, usize , i128 ) ;
3863
3860
3864
- rev ! ( try_from_unbounded, isize , u8 , u16 , u32 ) ;
3861
+ rev ! ( try_from_unbounded, isize , u16 , u32 ) ;
3865
3862
rev ! ( try_from_upper_bounded, isize , u64 , u128 ) ;
3866
- rev ! ( try_from_unbounded, isize , i16 , i32 , i64 ) ;
3863
+ rev ! ( try_from_unbounded, isize , i32 , i64 ) ;
3867
3864
rev ! ( try_from_both_bounded, isize , i128 ) ;
3868
3865
}
3869
3866
@@ -4074,6 +4071,20 @@ impl_from! { u32, i64, #[stable(feature = "lossless_int_conv", since = "1.5.0")]
4074
4071
impl_from ! { u32 , i128 , #[ stable( feature = "i128" , since = "1.26.0" ) ] }
4075
4072
impl_from ! { u64 , i128 , #[ stable( feature = "i128" , since = "1.26.0" ) ] }
4076
4073
4074
+ // The C99 standard defines bounds on INTPTR_MIN, INTPTR_MAX, and UINTPTR_MAX
4075
+ // which imply that pointer-sized integers must be at least 16 bits:
4076
+ // https://port70.net/~nsz/c/c99/n1256.html#7.18.2.4
4077
+ impl_from ! { u16 , usize , #[ stable( feature = "lossless_iusize_conv" , since = "1.26.0" ) ] }
4078
+ impl_from ! { u8 , isize , #[ stable( feature = "lossless_iusize_conv" , since = "1.26.0" ) ] }
4079
+ impl_from ! { i16 , isize , #[ stable( feature = "lossless_iusize_conv" , since = "1.26.0" ) ] }
4080
+
4081
+ // RISC-V defines the possibility of a 128-bit address space (RV128).
4082
+
4083
+ // CHERI proposes 256-bit “capabilities”. Unclear if this would be relevant to usize/isize.
4084
+ // https://www.cl.cam.ac.uk/research/security/ctsrd/pdfs/20171017a-cheri-poster.pdf
4085
+ // http://www.csl.sri.com/users/neumann/2012resolve-cheri.pdf
4086
+
4087
+
4077
4088
// Note: integers can only be represented with full precision in a float if
4078
4089
// they fit in the significand, which is 24 bits in f32 and 53 bits in f64.
4079
4090
// Lossy float conversions are not implemented at this time.
0 commit comments