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 struct S<T:?Sized>(u32, T);
109 let array = [0,1,2,3,4];
110 let array2 = [5,6,7,8,9];
112 // fat ptr comparison: addr then extra
114 // check ordering for arrays
115 let mut ptrs: Vec<*const [u8]> = vec![
116 &array[0..0], &array[0..1], &array, &array[1..]
119 let array_addr = &array as *const [u8] as *const u8 as usize;
120 let array2_addr = &array2 as *const [u8] as *const u8 as usize;
121 if array2_addr < array_addr {
122 ptrs.insert(0, &array2);
126 assert_inorder(&ptrs, compare_au8);
128 let u8_ = (0u8, 1u8);
129 let u32_ = (4u32, 5u32);
131 // check ordering for ptrs
132 let buf: &mut [*const dyn Foo] = &mut [
137 let u : [*const (); 2] = unsafe { mem::transmute(*u) };
138 let v : [*const (); 2] = unsafe { mem::transmute(*v) };
141 assert_inorder(buf, compare_foo);
143 // check ordering for structs containing arrays
152 &ss.0 as *const S<[u8]>,
153 &ss.1 as *const S<[u8]>,
154 &ss.2 as *const S<[u8]>
157 assert!(simple_eq(&0u8 as *const _, &0u8 as *const _));
158 assert!(!simple_eq(&0u8 as *const _, &1u8 as *const _));
161 // similar to above, but using &raw
163 let array = [0,1,2,3,4];
164 let array2 = [5,6,7,8,9];
166 // fat ptr comparison: addr then extra
168 // check ordering for arrays
169 let mut ptrs: Vec<*const [u8]> = vec![
170 &raw const array[0..0], &raw const array[0..1], &raw const array, &raw const array[1..]
173 let array_addr = &raw const array as *const u8 as usize;
174 let array2_addr = &raw const array2 as *const u8 as usize;
175 if array2_addr < array_addr {
176 ptrs.insert(0, &raw const array2);
178 ptrs.push(&raw const array2);
180 assert_inorder(&ptrs, compare_au8);
182 let u8_ = (0u8, 1u8);
183 let u32_ = (4u32, 5u32);
185 // check ordering for ptrs
186 let buf: &mut [*const dyn Foo] = &mut [
187 &raw const u8_, &raw const u8_.0,
188 &raw const u32_, &raw const u32_.0,
191 let u : [*const (); 2] = unsafe { mem::transmute(*u) };
192 let v : [*const (); 2] = unsafe { mem::transmute(*v) };
195 assert_inorder(buf, compare_foo);
197 // check ordering for structs containing arrays
206 &raw const ss.0 as *const S<[u8]>,
207 &raw const ss.1 as *const S<[u8]>,
208 &raw const ss.2 as *const S<[u8]>