@@ -15,8 +15,39 @@ fn test_format_flags() {
15
15
fn test_pointer_formats_data_pointer ( ) {
16
16
let b: & [ u8 ] = b"" ;
17
17
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) }" ) ;
20
51
}
21
52
22
53
#[ test]
0 commit comments