mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			120 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // run-pass
 | |
| // check raw fat pointer ops
 | |
| 
 | |
| use std::mem;
 | |
| 
 | |
| fn assert_inorder<T: PartialEq + PartialOrd>(a: &[T]) {
 | |
|     for i in 0..a.len() {
 | |
|         for j in 0..a.len() {
 | |
|             if i < j {
 | |
|                 assert!(a[i] < a[j]);
 | |
|                 assert!(a[i] <= a[j]);
 | |
|                 assert!(!(a[i] == a[j]));
 | |
|                 assert!(a[i] != a[j]);
 | |
|                 assert!(!(a[i] >= a[j]));
 | |
|                 assert!(!(a[i] > a[j]));
 | |
|             } else if i == j {
 | |
|                 assert!(!(a[i] < a[j]));
 | |
|                 assert!(a[i] <= a[j]);
 | |
|                 assert!(a[i] == a[j]);
 | |
|                 assert!(!(a[i] != a[j]));
 | |
|                 assert!(a[i] >= a[j]);
 | |
|                 assert!(!(a[i] > a[j]));
 | |
|             } else {
 | |
|                 assert!(!(a[i] < a[j]));
 | |
|                 assert!(!(a[i] <= a[j]));
 | |
|                 assert!(!(a[i] == a[j]));
 | |
|                 assert!(a[i] != a[j]);
 | |
|                 assert!(a[i] >= a[j]);
 | |
|                 assert!(a[i] > a[j]);
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 | |
| 
 | |
| trait Foo { fn foo(&self) -> usize; }
 | |
| impl<T> Foo for T {
 | |
|     fn foo(&self) -> usize {
 | |
|         mem::size_of::<T>()
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[allow(unused_tuple_struct_fields)]
 | |
| struct S<T:?Sized>(u32, T);
 | |
| 
 | |
| fn main() {
 | |
|     let mut array = [0,1,2,3,4];
 | |
|     let mut array2 = [5,6,7,8,9];
 | |
| 
 | |
|     // fat ptr comparison: addr then extra
 | |
| 
 | |
|     // check ordering for arrays
 | |
|     let mut ptrs: Vec<*const [u8]> = vec![
 | |
|         &array[0..0], &array[0..1], &array, &array[1..]
 | |
|     ];
 | |
| 
 | |
|     let array_addr = &array as *const [u8] as *const u8 as usize;
 | |
|     let array2_addr = &array2 as *const [u8] as *const u8 as usize;
 | |
|     if array2_addr < array_addr {
 | |
|         ptrs.insert(0, &array2);
 | |
|     } else {
 | |
|         ptrs.push(&array2);
 | |
|     }
 | |
|     assert_inorder(&ptrs);
 | |
| 
 | |
|     // check ordering for mut arrays
 | |
|     let mut ptrs: Vec<*mut [u8]> = vec![
 | |
|         &mut array[0..0], &mut array[0..1], &mut array, &mut array[1..]
 | |
|     ];
 | |
| 
 | |
|     let array_addr = &mut array as *mut [u8] as *mut u8 as usize;
 | |
|     let array2_addr = &mut array2 as *mut [u8] as *mut u8 as usize;
 | |
|     if array2_addr < array_addr {
 | |
|         ptrs.insert(0, &mut array2);
 | |
|     } else {
 | |
|         ptrs.push(&mut array2);
 | |
|     }
 | |
|     assert_inorder(&ptrs);
 | |
| 
 | |
|     let mut u8_ = (0u8, 1u8);
 | |
|     let mut u32_ = (4u32, 5u32);
 | |
| 
 | |
|     // check ordering for ptrs
 | |
|     let buf: &mut [*const dyn Foo] = &mut [
 | |
|         &u8_, &u8_.0,
 | |
|         &u32_, &u32_.0,
 | |
|     ];
 | |
|     buf.sort_by(|u,v| {
 | |
|         let u : [*const (); 2] = unsafe { mem::transmute(*u) };
 | |
|         let v : [*const (); 2] = unsafe { mem::transmute(*v) };
 | |
|         u.cmp(&v)
 | |
|     });
 | |
|     assert_inorder(buf);
 | |
| 
 | |
|     // check ordering for mut ptrs
 | |
|     let buf: &mut [*mut dyn Foo] = &mut [
 | |
|         &mut u8_, &mut u8_.0,
 | |
|         &mut u32_, &mut u32_.0,
 | |
|     ];
 | |
|     buf.sort_by(|u,v| {
 | |
|         let u : [*const (); 2] = unsafe { mem::transmute(*u) };
 | |
|         let v : [*const (); 2] = unsafe { mem::transmute(*v) };
 | |
|         u.cmp(&v)
 | |
|     });
 | |
|     assert_inorder(buf);
 | |
| 
 | |
|     // check ordering for structs containing arrays
 | |
|     let ss: (S<[u8; 2]>,
 | |
|              S<[u8; 3]>,
 | |
|              S<[u8; 2]>) = (
 | |
|         S(7, [8, 9]),
 | |
|         S(10, [11, 12, 13]),
 | |
|         S(4, [5, 6])
 | |
|     );
 | |
|     assert_inorder(&[
 | |
|         &ss.0 as *const S<[u8]>,
 | |
|         &ss.1 as *const S<[u8]>,
 | |
|         &ss.2 as *const S<[u8]>
 | |
|     ]);
 | |
| }
 | 
