|  | //@ run-pass | 
|  |  | 
|  | use std::fmt; | 
|  | use std::mem; | 
|  |  | 
|  | #[repr(packed)] | 
|  | #[derive(Copy, Clone)] | 
|  | struct Foo1 { | 
|  | bar: u8, | 
|  | baz: u64 | 
|  | } | 
|  |  | 
|  | impl PartialEq for Foo1 { | 
|  | fn eq(&self, other: &Foo1) -> bool { | 
|  | self.bar == other.bar && self.baz == other.baz | 
|  | } | 
|  | } | 
|  |  | 
|  | impl fmt::Debug for Foo1 { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | let bar = self.bar; | 
|  | let baz = self.baz; | 
|  |  | 
|  | f.debug_struct("Foo1") | 
|  | .field("bar", &bar) | 
|  | .field("baz", &baz) | 
|  | .finish() | 
|  | } | 
|  | } | 
|  |  | 
|  | #[repr(packed(2))] | 
|  | #[derive(Copy, Clone)] | 
|  | struct Foo2 { | 
|  | bar: u8, | 
|  | baz: u64 | 
|  | } | 
|  |  | 
|  | impl PartialEq for Foo2 { | 
|  | fn eq(&self, other: &Foo2) -> bool { | 
|  | self.bar == other.bar && self.baz == other.baz | 
|  | } | 
|  | } | 
|  |  | 
|  | impl fmt::Debug for Foo2 { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | let bar = self.bar; | 
|  | let baz = self.baz; | 
|  |  | 
|  | f.debug_struct("Foo2") | 
|  | .field("bar", &bar) | 
|  | .field("baz", &baz) | 
|  | .finish() | 
|  | } | 
|  | } | 
|  |  | 
|  | #[repr(C, packed(4))] | 
|  | #[derive(Copy, Clone)] | 
|  | struct Foo4C { | 
|  | bar: u8, | 
|  | baz: u64 | 
|  | } | 
|  |  | 
|  | impl PartialEq for Foo4C { | 
|  | fn eq(&self, other: &Foo4C) -> bool { | 
|  | self.bar == other.bar && self.baz == other.baz | 
|  | } | 
|  | } | 
|  |  | 
|  | impl fmt::Debug for Foo4C { | 
|  | fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { | 
|  | let bar = self.bar; | 
|  | let baz = self.baz; | 
|  |  | 
|  | f.debug_struct("Foo4C") | 
|  | .field("bar", &bar) | 
|  | .field("baz", &baz) | 
|  | .finish() | 
|  | } | 
|  | } | 
|  |  | 
|  | pub fn main() { | 
|  | let foo1s = [Foo1 { bar: 1, baz: 2 }; 10]; | 
|  |  | 
|  | assert_eq!(mem::align_of::<[Foo1; 10]>(), 1); | 
|  | assert_eq!(mem::size_of::<[Foo1; 10]>(), 90); | 
|  |  | 
|  | for i in 0..10 { | 
|  | assert_eq!(foo1s[i], Foo1 { bar: 1, baz: 2}); | 
|  | } | 
|  |  | 
|  | for &foo in &foo1s { | 
|  | assert_eq!(foo, Foo1 { bar: 1, baz: 2 }); | 
|  | } | 
|  |  | 
|  | let foo2s = [Foo2 { bar: 1, baz: 2 }; 10]; | 
|  |  | 
|  | assert_eq!(mem::align_of::<[Foo2; 10]>(), 2); | 
|  | assert_eq!(mem::size_of::<[Foo2; 10]>(), 100); | 
|  |  | 
|  | for i in 0..10 { | 
|  | assert_eq!(foo2s[i], Foo2 { bar: 1, baz: 2}); | 
|  | } | 
|  |  | 
|  | for &foo in &foo2s { | 
|  | assert_eq!(foo, Foo2 { bar: 1, baz: 2 }); | 
|  | } | 
|  |  | 
|  | let foo4s = [Foo4C { bar: 1, baz: 2 }; 10]; | 
|  |  | 
|  | assert_eq!(mem::align_of::<[Foo4C; 10]>(), 4); | 
|  | assert_eq!(mem::size_of::<[Foo4C; 10]>(), 120); | 
|  |  | 
|  | for i in 0..10 { | 
|  | assert_eq!(foo4s[i], Foo4C { bar: 1, baz: 2}); | 
|  | } | 
|  |  | 
|  | for &foo in &foo4s { | 
|  | assert_eq!(foo, Foo4C { bar: 1, baz: 2 }); | 
|  | } | 
|  | } |