mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			46 lines
		
	
	
		
			891 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			46 lines
		
	
	
		
			891 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! null pointer optimization preserves type sizes.
 | |
| //!
 | |
| //! Verifies that Option<T> has the same size as T for non-null pointer types,
 | |
| //! and for custom enums that have a niche.
 | |
| 
 | |
| //@ run-pass
 | |
| 
 | |
| // Needs for Nothing variat in Enum
 | |
| #![allow(dead_code)]
 | |
| 
 | |
| use std::mem;
 | |
| 
 | |
| enum E<T> {
 | |
|     Thing(isize, T),
 | |
|     Nothing((), ((), ()), [i8; 0]),
 | |
| }
 | |
| 
 | |
| struct S<T>(isize, T);
 | |
| 
 | |
| // These are macros so we get useful assert messages.
 | |
| 
 | |
| macro_rules! check_option {
 | |
|     ($T:ty) => {
 | |
|         assert_eq!(mem::size_of::<Option<$T>>(), mem::size_of::<$T>());
 | |
|     };
 | |
| }
 | |
| 
 | |
| macro_rules! check_fancy {
 | |
|     ($T:ty) => {
 | |
|         assert_eq!(mem::size_of::<E<$T>>(), mem::size_of::<S<$T>>());
 | |
|     };
 | |
| }
 | |
| 
 | |
| macro_rules! check_type {
 | |
|     ($T:ty) => {{
 | |
|         check_option!($T);
 | |
|         check_fancy!($T);
 | |
|     }};
 | |
| }
 | |
| 
 | |
| pub fn main() {
 | |
|     check_type!(&'static isize);
 | |
|     check_type!(Box<isize>);
 | |
|     check_type!(extern "C" fn());
 | |
| }
 | 
