2 // check raw fat pointer ops
6 fn assert_inorder
<T
: PartialEq
+ PartialOrd
>(a
: &[T
]) {
11 assert
!(a
[i
] <= a
[j
]);
12 assert
!(!(a
[i
] == a
[j
]));
13 assert
!(a
[i
] != a
[j
]);
14 assert
!(!(a
[i
] >= a
[j
]));
15 assert
!(!(a
[i
] > a
[j
]));
17 assert
!(!(a
[i
] < a
[j
]));
18 assert
!(a
[i
] <= a
[j
]);
19 assert
!(a
[i
] == a
[j
]);
20 assert
!(!(a
[i
] != a
[j
]));
21 assert
!(a
[i
] >= a
[j
]);
22 assert
!(!(a
[i
] > a
[j
]));
24 assert
!(!(a
[i
] < a
[j
]));
25 assert
!(!(a
[i
] <= a
[j
]));
26 assert
!(!(a
[i
] == a
[j
]));
27 assert
!(a
[i
] != a
[j
]);
28 assert
!(a
[i
] >= a
[j
]);
35 trait Foo { fn foo(&self) -> usize; }
37 fn foo(&self) -> usize {
42 struct S
<T
:?Sized
>(u32, T
);
45 let mut array
= [0,1,2,3,4];
46 let mut array2
= [5,6,7,8,9];
48 // fat ptr comparison: addr then extra
50 // check ordering for arrays
51 let mut ptrs
: Vec
<*const [u8]> = vec
![
52 &array
[0..0], &array
[0..1], &array
, &array
[1..]
55 let array_addr
= &array
as *const [u8] as *const u8 as usize;
56 let array2_addr
= &array2
as *const [u8] as *const u8 as usize;
57 if array2_addr
< array_addr
{
58 ptrs
.insert(0, &array2
);
62 assert_inorder(&ptrs
);
64 // check ordering for mut arrays
65 let mut ptrs
: Vec
<*mut [u8]> = vec
![
66 &mut array
[0..0], &mut array
[0..1], &mut array
, &mut array
[1..]
69 let array_addr
= &mut array
as *mut [u8] as *mut u8 as usize;
70 let array2_addr
= &mut array2
as *mut [u8] as *mut u8 as usize;
71 if array2_addr
< array_addr
{
72 ptrs
.insert(0, &mut array2
);
74 ptrs
.push(&mut array2
);
76 assert_inorder(&ptrs
);
78 let mut u8_
= (0u8, 1u8);
79 let mut u32_
= (4u32, 5u32);
81 // check ordering for ptrs
82 let buf
: &mut [*const dyn Foo
] = &mut [
87 let u
: [*const (); 2] = unsafe { mem::transmute(*u) }
;
88 let v
: [*const (); 2] = unsafe { mem::transmute(*v) }
;
93 // check ordering for mut ptrs
94 let buf
: &mut [*mut dyn Foo
] = &mut [
96 &mut u32_
, &mut u32_
.0,
99 let u
: [*const (); 2] = unsafe { mem::transmute(*u) }
;
100 let v
: [*const (); 2] = unsafe { mem::transmute(*v) }
;
105 // check ordering for structs containing arrays
114 &ss
.0 as *const S
<[u8]>,
115 &ss
.1 as *const S
<[u8]>,
116 &ss
.2 as *const S
<[u8]>