1 /// This should not be opaque; we can see the attributes and can pack the 2 /// struct. 3 struct AlignedToOne { 4 int i; 5 } __attribute__ ((packed,aligned(1))); 6 7 /// This should be opaque because although we can see the attributes, Rust before 8 /// 1.33 doesn't have `#[repr(packed(N))]`. 9 struct AlignedToTwo { 10 int i; 11 } __attribute__ ((packed,aligned(2))); 12 13 #pragma pack(1) 14 15 /// This should not be opaque because although `libclang` doesn't give us the 16 /// `#pragma pack(1)`, we can detect that alignment is 1 and add 17 /// `#[repr(packed)]` to the struct ourselves. 18 struct PackedToOne { 19 int x; 20 int y; 21 }; 22 23 #pragma pack() 24 25 #pragma pack(2) 26 27 /// In this case, even if we can detect the weird alignment triggered by 28 /// `#pragma pack(2)`, we can't do anything about it because Rust before 1.33 29 /// doesn't have `#[repr(packed(N))]`. Therefore, we must make it opaque. 30 struct PackedToTwo { 31 int x; 32 int y; 33 }; 34 35 #pragma pack() 36