@@ -15,8 +15,39 @@ fn test_format_flags() {
1515fn test_pointer_formats_data_pointer ( ) {
1616 let b: & [ u8 ] = b"" ;
1717 let s: & str = "" ;
18- assert_eq ! ( format!( "{s:p}" ) , format!( "{:p}" , s. as_ptr( ) ) ) ;
19- assert_eq ! ( format!( "{b:p}" ) , format!( "{:p}" , b. as_ptr( ) ) ) ;
18+ assert_eq ! ( format!( "{s:p}" ) , format!( "{:p}" , s as * const _) ) ;
19+ assert_eq ! ( format!( "{b:p}" ) , format!( "{:p}" , b as * const _) ) ;
20+ }
21+
22+ #[ test]
23+ fn test_fmt_debug_of_raw_pointers ( ) {
24+ use core:: fmt:: Debug ;
25+
26+ fn check_fmt < T : Debug > ( t : T , expected : & str ) {
27+ use std:: sync:: LazyLock ;
28+
29+ use regex:: Regex ;
30+
31+ static ADDR_REGEX : LazyLock < Regex > =
32+ LazyLock :: new ( || Regex :: new ( r"0x[0-9a-fA-F]+" ) . unwrap ( ) ) ;
33+
34+ let formatted = format ! ( "{:?}" , t) ;
35+ let normalized = ADDR_REGEX . replace_all ( & formatted, "$$HEX" ) ;
36+
37+ assert_eq ! ( normalized, expected) ;
38+ }
39+
40+ let plain = & mut 100 ;
41+ check_fmt ( plain as * mut i32 , "$HEX" ) ;
42+ check_fmt ( plain as * const i32 , "$HEX" ) ;
43+
44+ let slice = & mut [ 200 , 300 , 400 ] [ ..] ;
45+ check_fmt ( slice as * mut [ i32 ] , "Pointer { addr: $HEX, metadata: 3 }" ) ;
46+ check_fmt ( slice as * const [ i32 ] , "Pointer { addr: $HEX, metadata: 3 }" ) ;
47+
48+ let vtable = & mut 500 as & mut dyn Debug ;
49+ check_fmt ( vtable as * mut dyn Debug , "Pointer { addr: $HEX, metadata: DynMetadata($HEX) }" ) ;
50+ check_fmt ( vtable as * const dyn Debug , "Pointer { addr: $HEX, metadata: DynMetadata($HEX) }" ) ;
2051}
2152
2253#[ test]
0 commit comments