// run-pass // Check that trait objects without a principal codegen properly. use std::sync::atomic::{AtomicUsize, Ordering}; use std::mem; // Array is to make sure the size is not exactly pointer-size, so // we can be sure we are measuring the right size in the // `size_of_val` test. struct SetOnDrop<'a>(&'a AtomicUsize, #[allow(unused_tuple_struct_fields)] [u8; 64]); impl<'a> Drop for SetOnDrop<'a> { fn drop(&mut self) { self.0.store(self.0.load(Ordering::Relaxed) + 1, Ordering::Relaxed); } } trait TypeEq {} impl TypeEq for T {} fn assert_types_eq() where U: TypeEq {} fn main() { // Check that different ways of writing the same type are equal. assert_types_eq::(); assert_types_eq::(); assert_types_eq::(); // Check that codegen works. // // Using `AtomicUsize` here because `Cell` is not `Sync`, and // so can't be made into a `Box`. let c = AtomicUsize::new(0); { let d: Box = Box::new(SetOnDrop(&c, [0; 64])); assert_eq!(mem::size_of_val(&*d), mem::size_of::()); assert_eq!(mem::align_of_val(&*d), mem::align_of::()); assert_eq!(c.load(Ordering::Relaxed), 0); } assert_eq!(c.load(Ordering::Relaxed), 1); }