1bcab3026Sopenharmony_ci#![no_std] 2bcab3026Sopenharmony_ci#![deny(unsafe_code)] 3bcab3026Sopenharmony_ci 4bcab3026Sopenharmony_ci#[macro_use] 5bcab3026Sopenharmony_ciextern crate static_assertions; 6bcab3026Sopenharmony_ci 7bcab3026Sopenharmony_ciassert_eq_size!(u8, u8, (u8,), [u8; 1]); 8bcab3026Sopenharmony_ci 9bcab3026Sopenharmony_cimod assoc_type { 10bcab3026Sopenharmony_ci trait Trait { 11bcab3026Sopenharmony_ci type AssocItem: ?Sized; 12bcab3026Sopenharmony_ci } 13bcab3026Sopenharmony_ci 14bcab3026Sopenharmony_ci impl<T: ?Sized> Trait for T { 15bcab3026Sopenharmony_ci type AssocItem = Self; 16bcab3026Sopenharmony_ci } 17bcab3026Sopenharmony_ci 18bcab3026Sopenharmony_ci #[allow(dead_code)] 19bcab3026Sopenharmony_ci struct Value; 20bcab3026Sopenharmony_ci 21bcab3026Sopenharmony_ci assert_eq_size!(<Value as Trait>::AssocItem, Value); 22bcab3026Sopenharmony_ci 23bcab3026Sopenharmony_ci // TODO: Is this possible? 24bcab3026Sopenharmony_ci // pub fn test<T: Trait>() { 25bcab3026Sopenharmony_ci // assert_eq_size!(<T as Trait>::AssocItem, T); 26bcab3026Sopenharmony_ci // } 27bcab3026Sopenharmony_ci} 28bcab3026Sopenharmony_ci 29bcab3026Sopenharmony_ci// Placed in separate module so that DropCounter's fields are private 30bcab3026Sopenharmony_cimod dc { 31bcab3026Sopenharmony_ci /// A type that acts like somewhat of a reference counter. 32bcab3026Sopenharmony_ci pub struct DropCounter<'a> { 33bcab3026Sopenharmony_ci count: &'a mut i32 34bcab3026Sopenharmony_ci } 35bcab3026Sopenharmony_ci 36bcab3026Sopenharmony_ci impl<'a> DropCounter<'a> { 37bcab3026Sopenharmony_ci pub fn new(count: &'a mut i32) -> DropCounter<'a> { 38bcab3026Sopenharmony_ci *count += 1; 39bcab3026Sopenharmony_ci DropCounter { count } 40bcab3026Sopenharmony_ci } 41bcab3026Sopenharmony_ci 42bcab3026Sopenharmony_ci pub fn count(&self) -> i32 { 43bcab3026Sopenharmony_ci *self.count 44bcab3026Sopenharmony_ci } 45bcab3026Sopenharmony_ci } 46bcab3026Sopenharmony_ci 47bcab3026Sopenharmony_ci impl<'a> Drop for DropCounter<'a> { 48bcab3026Sopenharmony_ci fn drop(&mut self) { 49bcab3026Sopenharmony_ci *self.count -= 1 50bcab3026Sopenharmony_ci } 51bcab3026Sopenharmony_ci } 52bcab3026Sopenharmony_ci} 53bcab3026Sopenharmony_ciuse dc::*; 54bcab3026Sopenharmony_ci 55bcab3026Sopenharmony_ci/// A type that panics on drop. 56bcab3026Sopenharmony_ci#[allow(dead_code)] 57bcab3026Sopenharmony_cistruct PanicDrop<T>(T); 58bcab3026Sopenharmony_ci 59bcab3026Sopenharmony_ciimpl<T> Drop for PanicDrop<T> { 60bcab3026Sopenharmony_ci fn drop(&mut self) { 61bcab3026Sopenharmony_ci panic!("Dropped!"); 62bcab3026Sopenharmony_ci } 63bcab3026Sopenharmony_ci} 64bcab3026Sopenharmony_ci 65bcab3026Sopenharmony_ci#[test] 66bcab3026Sopenharmony_cifn test_eq_size() { 67bcab3026Sopenharmony_ci assert_eq_size!([u8; 2], u16); 68bcab3026Sopenharmony_ci assert_eq_size!([u8; 2], u16, (u8, u8)); 69bcab3026Sopenharmony_ci assert_eq_size!([u8; 4], u32, (u16, u8, u8), (u16, u16)); 70bcab3026Sopenharmony_ci 71bcab3026Sopenharmony_ci assert_eq_size_val!([0u8; 2], 0u16); 72bcab3026Sopenharmony_ci assert_eq_size_val!([0u8; 2], 0u16, (0u8, 0u8)); 73bcab3026Sopenharmony_ci assert_eq_size_val!([0u8; 4], 0u32, (0u16, 0u8, 0u8), (0u16, 0u16)); 74bcab3026Sopenharmony_ci 75bcab3026Sopenharmony_ci #[deny(unused_unsafe)] 76bcab3026Sopenharmony_ci { 77bcab3026Sopenharmony_ci assert_eq_size!(u8, u8); 78bcab3026Sopenharmony_ci assert_eq_size_val!(0u8, 0u8); 79bcab3026Sopenharmony_ci } 80bcab3026Sopenharmony_ci 81bcab3026Sopenharmony_ci let x = &mut 0; 82bcab3026Sopenharmony_ci assert_eq_size_ptr!(x, &0); 83bcab3026Sopenharmony_ci *x = 20; 84bcab3026Sopenharmony_ci assert_eq_size_ptr!(x, &0); 85bcab3026Sopenharmony_ci 86bcab3026Sopenharmony_ci // Should fail to compile (un-comment to test manually): 87bcab3026Sopenharmony_ci // assert_eq_size!(u8, u16); 88bcab3026Sopenharmony_ci // assert_eq_size_val!(0u8, 0u16); 89bcab3026Sopenharmony_ci} 90bcab3026Sopenharmony_ci 91bcab3026Sopenharmony_ci#[test] 92bcab3026Sopenharmony_cifn test_eq_size_no_drop() { 93bcab3026Sopenharmony_ci assert_eq_size!(u32, PanicDrop<u32>); 94bcab3026Sopenharmony_ci assert_eq_size!(PanicDrop<u32>, u32); 95bcab3026Sopenharmony_ci assert_eq_size!(PanicDrop<u32>, PanicDrop<u32>); 96bcab3026Sopenharmony_ci} 97bcab3026Sopenharmony_ci 98bcab3026Sopenharmony_ci#[test] 99bcab3026Sopenharmony_cifn test_eq_size_drop_count() { 100bcab3026Sopenharmony_ci let mut count = 0; 101bcab3026Sopenharmony_ci { 102bcab3026Sopenharmony_ci let dc = DropCounter::new(&mut count); 103bcab3026Sopenharmony_ci assert_eq!(dc.count(), 1); 104bcab3026Sopenharmony_ci assert_eq_size_val!(dc, 0usize); 105bcab3026Sopenharmony_ci assert_eq!(dc.count(), 1); 106bcab3026Sopenharmony_ci assert_eq_size_val!(dc, 0usize, dc); 107bcab3026Sopenharmony_ci assert_eq!(dc.count(), 1); 108bcab3026Sopenharmony_ci } 109bcab3026Sopenharmony_ci assert_eq!(count, 0); 110bcab3026Sopenharmony_ci 111bcab3026Sopenharmony_ci assert_eq_size_val!(DropCounter::new(&mut count), 0usize); 112bcab3026Sopenharmony_ci assert_eq!(count, 0); 113bcab3026Sopenharmony_ci} 114