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 #[allow(unused_tuple_struct_fields)]
43 struct S
<T
:?Sized
>(u32, T
);
46 let mut array
= [0,1,2,3,4];
47 let mut array2
= [5,6,7,8,9];
49 // fat ptr comparison: addr then extra
51 // check ordering for arrays
52 let mut ptrs
: Vec
<*const [u8]> = vec
![
53 &array
[0..0], &array
[0..1], &array
, &array
[1..]
56 let array_addr
= &array
as *const [u8] as *const u8 as usize;
57 let array2_addr
= &array2
as *const [u8] as *const u8 as usize;
58 if array2_addr
< array_addr
{
59 ptrs
.insert(0, &array2
);
63 assert_inorder(&ptrs
);
65 // check ordering for mut arrays
66 let mut ptrs
: Vec
<*mut [u8]> = vec
![
67 &mut array
[0..0], &mut array
[0..1], &mut array
, &mut array
[1..]
70 let array_addr
= &mut array
as *mut [u8] as *mut u8 as usize;
71 let array2_addr
= &mut array2
as *mut [u8] as *mut u8 as usize;
72 if array2_addr
< array_addr
{
73 ptrs
.insert(0, &mut array2
);
75 ptrs
.push(&mut array2
);
77 assert_inorder(&ptrs
);
79 let mut u8_
= (0u8, 1u8);
80 let mut u32_
= (4u32, 5u32);
82 // check ordering for ptrs
83 let buf
: &mut [*const dyn Foo
] = &mut [
88 let u
: [*const (); 2] = unsafe { mem::transmute(*u) }
;
89 let v
: [*const (); 2] = unsafe { mem::transmute(*v) }
;
94 // check ordering for mut ptrs
95 let buf
: &mut [*mut dyn Foo
] = &mut [
97 &mut u32_
, &mut u32_
.0,
100 let u
: [*const (); 2] = unsafe { mem::transmute(*u) }
;
101 let v
: [*const (); 2] = unsafe { mem::transmute(*v) }
;
106 // check ordering for structs containing arrays
115 &ss
.0 as *const S
<[u8]>,
116 &ss
.1 as *const S
<[u8]>,
117 &ss
.2 as *const S
<[u8]>