mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			37 lines
		
	
	
		
			724 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			724 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // run-pass
 | |
| // check that derive on a packed struct does not call field
 | |
| // methods with a misaligned field.
 | |
| 
 | |
| use std::mem;
 | |
| 
 | |
| #[derive(Copy, Clone)]
 | |
| struct Aligned(usize);
 | |
| 
 | |
| #[inline(never)]
 | |
| fn check_align(ptr: *const Aligned) {
 | |
|     assert_eq!(ptr as usize % mem::align_of::<Aligned>(),
 | |
|                0);
 | |
| }
 | |
| 
 | |
| impl PartialEq for Aligned {
 | |
|     fn eq(&self, other: &Self) -> bool {
 | |
|         check_align(self);
 | |
|         check_align(other);
 | |
|         self.0 == other.0
 | |
|     }
 | |
| }
 | |
| 
 | |
| #[repr(packed)]
 | |
| #[derive(Copy, Clone, PartialEq)]
 | |
| struct Packed(Aligned, Aligned);
 | |
| 
 | |
| #[derive(PartialEq)]
 | |
| #[repr(C)]
 | |
| struct Dealigned<T>(u8, T);
 | |
| 
 | |
| fn main() {
 | |
|     let d1 = Dealigned(0, Packed(Aligned(1), Aligned(2)));
 | |
|     let ck = d1 == d1;
 | |
|     assert!(ck);
 | |
| }
 | 
