2 #![feature(arbitrary_self_types)]
7 fn foo(self: *const Self) -> &'static str;
9 unsafe fn bar(self: *const Self) -> i64;
11 unsafe fn complicated(self: *const *const Self) -> i64 where Self: Sized {
17 fn foo(self: *const Self) -> &'static str {
21 unsafe fn bar(self: *const Self) -> i64 {
27 fn foo(self: *const Self) -> &'static str {
31 unsafe fn bar(self: *const Self) -> i64 {
37 let null_i32 = ptr::null::<i32>() as *const dyn Foo;
38 let null_u32 = ptr::null::<u32>() as *const dyn Foo;
40 assert_eq!("I'm an i32!", null_i32.foo());
41 assert_eq!("I'm a u32!", null_u32.foo());
44 let valid_i32_thin = &valid_i32 as *const i32;
45 assert_eq!("I'm an i32!", valid_i32_thin.foo());
46 assert_eq!(5, unsafe { valid_i32_thin.bar() });
47 assert_eq!(5, unsafe { (&valid_i32_thin as *const *const i32).complicated() });
48 let valid_i32_fat = valid_i32_thin as *const dyn Foo;
49 assert_eq!("I'm an i32!", valid_i32_fat.foo());
50 assert_eq!(5, unsafe { valid_i32_fat.bar() });
52 let valid_u32 = 18u32;
53 let valid_u32_thin = &valid_u32 as *const u32;
54 assert_eq!("I'm a u32!", valid_u32_thin.foo());
55 assert_eq!(18, unsafe { valid_u32_thin.bar() });
56 assert_eq!(18, unsafe { (&valid_u32_thin as *const *const u32).complicated() });
57 let valid_u32_fat = valid_u32_thin as *const dyn Foo;
58 assert_eq!("I'm a u32!", valid_u32_fat.foo());
59 assert_eq!(18, unsafe { valid_u32_fat.bar() });