1 use std::mem::transmute;
3 fn one_line_ref() -> i16 {
7 fn basic_ref() -> i16 {
12 fn basic_ref_mut() -> i16 {
18 fn basic_ref_mut_var() -> i16 {
27 fn tuple_ref_mut() -> (i8, i8) {
36 fn match_ref_mut() -> i8 {
39 let opt = Some(&mut t);
41 Some(&mut (ref mut x, ref mut y)) => *x += *y,
48 fn dangling_pointer() -> *const i32 {
49 let b = Box::new((42, 42)); // make it bigger than the alignment, so that there is some "room" after this pointer
54 let a: *const dyn Send = &1 as &dyn Send;
55 let b: *const dyn Send = &1 as &dyn Send;
63 let a: *const [u8] = unsafe { transmute((1usize, 1usize)) };
64 let b: *const [u8] = unsafe { transmute((1usize, 2usize)) };
65 // confirmed with rustc.
75 assert_eq!(one_line_ref(), 1);
76 assert_eq!(basic_ref(), 1);
77 assert_eq!(basic_ref_mut(), 3);
78 assert_eq!(basic_ref_mut_var(), 3);
79 assert_eq!(tuple_ref_mut(), (10, 22));
80 assert_eq!(match_ref_mut(), 42);
82 // Compare even dangling pointers with NULL, and with others in the same allocation, including
84 assert!(dangling_pointer() != std::ptr::null());
85 assert!(match dangling_pointer() as usize {
89 let dangling = dangling_pointer();
90 assert!(dangling == dangling);
91 assert!(dangling.wrapping_add(1) != dangling);
92 assert!(dangling.wrapping_sub(1) != dangling);
94 // Compare pointer with BIG integers
95 let dangling = dangling as usize;
96 assert!(dangling != usize::MAX);
97 assert!(dangling != usize::MAX - 1);
98 assert!(dangling != usize::MAX - 2);
99 assert!(dangling != usize::MAX - 3); // this is even 4-aligned, but it still cannot be equal because of the extra "room" after this pointer
100 assert_eq!((usize::MAX - 3) % 4, 0); // just to be sure we got this right
102 // Compare pointer with unaligned integers
103 assert!(dangling != 1usize);
104 assert!(dangling != 2usize);
105 assert!(dangling != 3usize);
106 // 4 is a possible choice! So we cannot compare with that.
107 assert!(dangling != 5usize);
108 assert!(dangling != 6usize);
109 assert!(dangling != 7usize);
111 // Using inequality to do the comparison.
112 assert!(dangling > 0);
113 assert!(dangling > 1);
114 assert!(dangling > 2);
115 assert!(dangling > 3);
116 assert!(dangling >= 4);