mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-30 20:44:34 +00:00 
			
		
		
		
	 1ad218f3af
			
		
	
	
		1ad218f3af
		
	
	
	
	
		
			
			As our implementation of MCP411 nears completion and we begin to solicit testing, it's no longer reasonable to expect testers to type or remember `BikeshedIntrinsicFrom`. The name degrades the ease-of-reading of documentation, and the overall experience of using compiler safe transmute. Tentatively, we'll instead adopt `TransmuteFrom`. This name seems to be the one most likely to be stabilized, after discussion on Zulip [1]. We may want to revisit the ordering of `Src` and `Dst` before stabilization, at which point we'd likely consider `TransmuteInto` or `Transmute`. [1] https://rust-lang.zulipchat.com/#narrow/stream/216762-project-safe-transmute/topic/What.20should.20.60BikeshedIntrinsicFrom.60.20be.20named.3F
		
			
				
	
	
		
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ check-pass
 | |
| //! An array must inherit the alignment of its inner type.
 | |
| 
 | |
| #![crate_type = "lib"]
 | |
| #![feature(transmutability)]
 | |
| #![allow(dead_code, incomplete_features, non_camel_case_types)]
 | |
| 
 | |
| mod assert {
 | |
|     use std::mem::{Assume, TransmuteFrom};
 | |
| 
 | |
|     pub fn is_maybe_transmutable<Src, Dst>()
 | |
|     where
 | |
|         Dst: TransmuteFrom<Src, {
 | |
|             Assume::ALIGNMENT
 | |
|                 .and(Assume::LIFETIMES)
 | |
|                 .and(Assume::SAFETY)
 | |
|                 .and(Assume::VALIDITY)
 | |
|         }>
 | |
|     {}
 | |
| }
 | |
| 
 | |
| #[derive(Clone, Copy)] #[repr(u8)] enum Ox00 { V = 0x00 }
 | |
| #[derive(Clone, Copy)] #[repr(u8)] enum Ox01 { V = 0x01 }
 | |
| #[derive(Clone, Copy)] #[repr(u8)] enum OxFF { V = 0xFF }
 | |
| 
 | |
| #[repr(C)]
 | |
| union Uninit {
 | |
|     a: (),
 | |
|     b: OxFF,
 | |
| }
 | |
| 
 | |
| #[repr(C, align(2))] struct align_2(Ox00);
 | |
| 
 | |
| fn len_0() {
 | |
|     #[repr(C)] struct ImplicitlyPadded([align_2; 0], Ox01);
 | |
|     #[repr(C)] struct ExplicitlyPadded(Ox01, Uninit);
 | |
| 
 | |
|     #[repr(C)] struct Struct();
 | |
|     assert::is_maybe_transmutable::<ImplicitlyPadded, ExplicitlyPadded>();
 | |
|     assert::is_maybe_transmutable::<ExplicitlyPadded, ImplicitlyPadded>();
 | |
| }
 | |
| 
 | |
| fn len_1() {
 | |
|     #[repr(C)] struct ImplicitlyPadded([align_2; 1], Ox01);
 | |
|     #[repr(C)] struct ExplicitlyPadded(Ox00, Uninit, Ox01, Uninit);
 | |
| 
 | |
|     #[repr(C)] struct Struct();
 | |
|     assert::is_maybe_transmutable::<ImplicitlyPadded, ExplicitlyPadded>();
 | |
|     assert::is_maybe_transmutable::<ExplicitlyPadded, ImplicitlyPadded>();
 | |
| }
 | |
| 
 | |
| fn len_2() {
 | |
|     #[repr(C)] struct ImplicitlyPadded([align_2; 2], Ox01);
 | |
|     #[repr(C)] struct ExplicitlyPadded(Ox00, Uninit, Ox00, Uninit, Ox01, Uninit);
 | |
| 
 | |
|     #[repr(C)] struct Struct();
 | |
|     assert::is_maybe_transmutable::<ImplicitlyPadded, ExplicitlyPadded>();
 | |
|     assert::is_maybe_transmutable::<ExplicitlyPadded, ImplicitlyPadded>();
 | |
| }
 |