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]>