Fix having multiple reprs on the same type.
This bug has applied to master for an indefinite period of time and is orthogonal to univariant layout optimization.
This commit is contained in:
parent
74f5c61d28
commit
cf5f80c68d
3 changed files with 124 additions and 54 deletions
44
src/test/run-pass/multiple-reprs.rs
Normal file
44
src/test/run-pass/multiple-reprs.rs
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
// Copyright 2012 The Rust Project Developers. See the COPYRIGHT
|
||||
// file at the top-level directory of this distribution and at
|
||||
// http://rust-lang.org/COPYRIGHT.
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
|
||||
use std::mem::size_of;
|
||||
|
||||
// The two enums that follow are designed so that bugs trigger layout optimization.
|
||||
// Specifically, if either of the following reprs used here is not detected by the compiler,
|
||||
// then the sizes will be wrong.
|
||||
|
||||
#[repr(C, u8)]
|
||||
enum E1 {
|
||||
A(u8, u16, u8),
|
||||
B(u8, u16, u8)
|
||||
}
|
||||
|
||||
#[repr(u8, C)]
|
||||
enum E2 {
|
||||
A(u8, u16, u8),
|
||||
B(u8, u16, u8)
|
||||
}
|
||||
|
||||
// From pr 37429
|
||||
pub const SIZEOF_QUERY: usize = 21;
|
||||
|
||||
#[repr(C,packed)]
|
||||
pub struct p0f_api_query {
|
||||
pub magic: u32,
|
||||
pub addr_type: u8,
|
||||
pub addr: [u8; 16],
|
||||
|
||||
}
|
||||
pub fn main() {
|
||||
assert_eq!(size_of::<E1>(), 6);
|
||||
assert_eq!(size_of::<E2>(), 6);
|
||||
assert_eq!(size_of::<p0f_api_query>(), 21);
|
||||
}
|
||||
|
|
@ -26,7 +26,7 @@ enum e2 {
|
|||
a(u32), b
|
||||
}
|
||||
|
||||
#[repr(u8)]
|
||||
#[repr(C, u8)]
|
||||
enum e3 {
|
||||
a([u16; 0], u8), b
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue