2 // check raw fat pointer ops in mir
3 // FIXME: please improve this when we get monomorphization support
4 #![feature(raw_ref_op)]
8 #[derive(Debug, PartialEq, Eq)]
9 struct ComparisonResults {
18 const LT: ComparisonResults = ComparisonResults {
27 const EQ: ComparisonResults = ComparisonResults {
36 const GT: ComparisonResults = ComparisonResults {
45 fn compare_su8(a: *const S<[u8]>, b: *const S<[u8]>) -> ComparisonResults {
56 fn compare_au8(a: *const [u8], b: *const [u8]) -> ComparisonResults {
67 fn compare_foo<'a>(a: *const (dyn Foo+'a), b: *const (dyn Foo+'a)) -> ComparisonResults {
78 fn simple_eq<'a>(a: *const (dyn Foo+'a), b: *const (dyn Foo+'a)) -> bool {
83 fn assert_inorder<T: Copy>(a: &[T],
84 compare: fn(T, T) -> ComparisonResults) {
87 let cres = compare(a[i], a[j]);
99 trait Foo { fn foo(&self) -> usize; }
101 fn foo(&self) -> usize {
106 #[allow(unused_tuple_struct_fields)]
107 struct S<T:?Sized>(u32, T);
110 let array = [0,1,2,3,4];
111 let array2 = [5,6,7,8,9];
113 // fat ptr comparison: addr then extra
115 // check ordering for arrays
116 let mut ptrs: Vec<*const [u8]> = vec![
117 &array[0..0], &array[0..1], &array, &array[1..]
120 let array_addr = &array as *const [u8] as *const u8 as usize;
121 let array2_addr = &array2 as *const [u8] as *const u8 as usize;
122 if array2_addr < array_addr {
123 ptrs.insert(0, &array2);
127 assert_inorder(&ptrs, compare_au8);
129 let u8_ = (0u8, 1u8);
130 let u32_ = (4u32, 5u32);
132 // check ordering for ptrs
133 let buf: &mut [*const dyn Foo] = &mut [
138 let u : [*const (); 2] = unsafe { mem::transmute(*u) };
139 let v : [*const (); 2] = unsafe { mem::transmute(*v) };
142 assert_inorder(buf, compare_foo);
144 // check ordering for structs containing arrays
153 &ss.0 as *const S<[u8]>,
154 &ss.1 as *const S<[u8]>,
155 &ss.2 as *const S<[u8]>
158 assert!(simple_eq(&0u8 as *const _, &0u8 as *const _));
159 assert!(!simple_eq(&0u8 as *const _, &1u8 as *const _));
162 // similar to above, but using &raw
164 let array = [0,1,2,3,4];
165 let array2 = [5,6,7,8,9];
167 // fat ptr comparison: addr then extra
169 // check ordering for arrays
170 let mut ptrs: Vec<*const [u8]> = vec![
171 &raw const array[0..0], &raw const array[0..1], &raw const array, &raw const array[1..]
174 let array_addr = &raw const array as *const u8 as usize;
175 let array2_addr = &raw const array2 as *const u8 as usize;
176 if array2_addr < array_addr {
177 ptrs.insert(0, &raw const array2);
179 ptrs.push(&raw const array2);
181 assert_inorder(&ptrs, compare_au8);
183 let u8_ = (0u8, 1u8);
184 let u32_ = (4u32, 5u32);
186 // check ordering for ptrs
187 let buf: &mut [*const dyn Foo] = &mut [
188 &raw const u8_, &raw const u8_.0,
189 &raw const u32_, &raw const u32_.0,
192 let u : [*const (); 2] = unsafe { mem::transmute(*u) };
193 let v : [*const (); 2] = unsafe { mem::transmute(*v) };
196 assert_inorder(buf, compare_foo);
198 // check ordering for structs containing arrays
207 &raw const ss.0 as *const S<[u8]>,
208 &raw const ss.1 as *const S<[u8]>,
209 &raw const ss.2 as *const S<[u8]>