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