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