Apply packed and align restrictions to unions.

This commit is contained in:
Cameron Hart 2017-07-24 07:54:48 +10:00
parent 200c4d0410
commit 5cccd6a9ee
3 changed files with 65 additions and 10 deletions

View file

@ -28,14 +28,31 @@ enum D { D }
struct E(i32);
#[repr(packed, align(8))]
struct F(i32); //~ ERROR struct has conflicting packed and align representation hints
struct F(i32); //~ ERROR type has conflicting packed and align representation hints
#[repr(packed)]
#[repr(align(8))]
struct G(i32); //~ ERROR struct has conflicting packed and align representation hints
struct G(i32); //~ ERROR type has conflicting packed and align representation hints
#[repr(align(8))]
#[repr(packed)]
struct H(i32); //~ ERROR struct has conflicting packed and align representation hints
struct H(i32); //~ ERROR type has conflicting packed and align representation hints
#[repr(packed, align(8))]
union X { //~ ERROR type has conflicting packed and align representation hints
i: i32
}
#[repr(packed)]
#[repr(align(8))]
union Y { //~ ERROR type has conflicting packed and align representation hints
i: i32
}
#[repr(align(8))]
#[repr(packed)]
union Z { //~ ERROR type has conflicting packed and align representation hints
i: i32
}
fn main() {}

View file

@ -9,17 +9,53 @@
// except according to those terms.
#![feature(attr_literals)]
#![feature(repr_align)]
#![feature(untagged_unions)]
#![allow(dead_code)]
#[repr(align(16))]
struct A(i32);
struct SA(i32);
struct B(A);
struct SB(SA);
#[repr(align(16))]
union UA {
i: i32
}
union UB {
a: UA
}
#[repr(packed)]
struct C(A); //~ ERROR: packed struct cannot transitively contain a `[repr(align)]` struct
struct SC(SA); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
#[repr(packed)]
struct D(B); //~ ERROR: packed struct cannot transitively contain a `[repr(align)]` struct
struct SD(SB); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
#[repr(packed)]
struct SE(UA); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
#[repr(packed)]
struct SF(UB); //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
#[repr(packed)]
union UC { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
a: UA
}
#[repr(packed)]
union UD { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
n: UB
}
#[repr(packed)]
union UE { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
a: SA
}
#[repr(packed)]
union UF { //~ ERROR: packed type cannot transitively contain a `[repr(align)]` type
n: SB
}
fn main() {}