1
+ // tests/const_conversion_tests.rs
2
+ #![ feature( const_trait_impl, f16, f128) ]
3
+ #![ feature( ascii_char, ascii_char_variants) ]
4
+
5
+ use std:: convert:: TryFrom ;
6
+ use std:: net:: { Ipv4Addr , IpAddr , SocketAddr } ;
7
+ use std:: str:: FromStr ;
8
+ use std:: num:: NonZero ;
9
+ use std:: ascii:: Char as AsciiChar ;
10
+
11
+ const _: ( ) = {
12
+ // --- From<AsciiChar> / From<char> / TryFrom<u32> for char ---
13
+ let ac = AsciiChar :: LessThanSign ;
14
+ let _: u8 = u8:: from ( ac) ;
15
+ let _: u16 = u16:: from ( ac) ;
16
+ let _: u32 = u32:: from ( ac) ;
17
+ let _: u64 = u64:: from ( ac) ;
18
+ let _: u128 = u128:: from ( ac) ;
19
+ let _: char = char:: from ( ac) ;
20
+
21
+ let c = '🚀' ;
22
+ let _: u32 = u32:: from ( c) ;
23
+ let _: u64 = u64:: from ( c) ;
24
+ let _: u128 = u128:: from ( c) ;
25
+ let _: char = char:: from ( 65u8 ) ;
26
+ let _: char = char:: try_from ( 0x1F680u32 ) . unwrap ( ) ;
27
+
28
+
29
+ let mut st = String :: from ( "world" ) ;
30
+ //~^ ERROR: the trait bound `String: const From<&str>` is not satisfied
31
+
32
+ // --- AsRef / AsMut on primitive refs, arrays, strings ---
33
+ let x = & 5u8 ;
34
+ let _: & u8 = x. as_ref ( ) ;
35
+ //~^ ERROR: the method `as_ref` exists for reference `&u8`, but its trait bounds were not satisfied
36
+ let mut y = 6u8 ;
37
+ let ym = & mut y;
38
+ let _: & mut u8 = ym. as_mut ( ) ;
39
+ //~^ ERROR: the method `as_mut` exists for mutable reference `&mut u8`, but its trait bounds were not satisfied
40
+
41
+ let arr = [ 1u8 , 2 , 3 ] ;
42
+ let _: & [ u8 ] = arr. as_ref ( ) ;
43
+ //~^ ERROR: the trait bound `[u8; 3]: const AsRef<[u8]>` is not satisfied [E0277]
44
+ let mut arr2 = [ 4u8 , 5 , 6 ] ;
45
+ let _: & mut [ u8 ] = arr2. as_mut ( ) ;
46
+ //~^ ERROR: the trait bound `[u8; 3]: const AsMut<[u8]>` is not satisfied [E0277]
47
+
48
+ let s = "hello" ;
49
+ let _: & str = s. as_ref ( ) ;
50
+
51
+ // --- bool → integers, isize ↔ usize ---
52
+ let b = true ;
53
+ let _: u8 = u8:: from ( b) ;
54
+ let _: i8 = i8:: from ( b) ;
55
+ let _: u16 = u16:: from ( b) ;
56
+ let _: i16 = i16:: from ( b) ;
57
+ let _: usize = usize:: from ( b) ;
58
+ let _: isize = isize:: from ( b) ;
59
+
60
+ let _ = usize:: try_from ( 42_isize ) ;
61
+ let _ = isize:: try_from ( 42_usize ) ;
62
+
63
+ // --- NonZero conversions ---
64
+ let nz8 = unsafe { NonZero :: new_unchecked ( 5 ) } ;
65
+ let _ = NonZero :: < u16 > :: from ( nz8) ;
66
+ let _ = u8:: from ( nz8) ;
67
+
68
+ // --- IpAddr / SocketAddr ---
69
+ let v4 = Ipv4Addr :: new ( 127 , 0 , 0 , 1 ) ;
70
+ let _: u32 = u32:: from ( v4) ;
71
+ let _: SocketAddr = SocketAddr :: from ( ( v4, 8080 ) ) ;
72
+
73
+ // --- FromStr for ints ---
74
+ let _: u8 = u8:: from_str ( "123" ) . unwrap ( ) ;
75
+ let _: i16 = i16:: from_str ( "-456" ) . unwrap ( ) ;
76
+
77
+ ( ) ;
78
+ } ;
79
+
80
+ fn main ( ) { }
0 commit comments