1bcab3026Sopenharmony_ci/// Asserts that types are equal in alignment.
2bcab3026Sopenharmony_ci///
3bcab3026Sopenharmony_ci/// This is useful when ensuring that pointer arithmetic is done correctly, or
4bcab3026Sopenharmony_ci/// when [FFI] requires a type to have the same alignment as some foreign type.
5bcab3026Sopenharmony_ci///
6bcab3026Sopenharmony_ci/// # Examples
7bcab3026Sopenharmony_ci///
8bcab3026Sopenharmony_ci/// A `usize` has the same alignment as any pointer type:
9bcab3026Sopenharmony_ci///
10bcab3026Sopenharmony_ci/// ```
11bcab3026Sopenharmony_ci/// # #[macro_use] extern crate static_assertions; fn main() {}
12bcab3026Sopenharmony_ci/// assert_eq_align!(usize, *const u8, *mut u8);
13bcab3026Sopenharmony_ci/// ```
14bcab3026Sopenharmony_ci///
15bcab3026Sopenharmony_ci/// The following passes because `[i32; 4]` has the same alignment as `i32`:
16bcab3026Sopenharmony_ci///
17bcab3026Sopenharmony_ci/// ```
18bcab3026Sopenharmony_ci/// # #[macro_use] extern crate static_assertions; fn main() {}
19bcab3026Sopenharmony_ci/// assert_eq_align!([i32; 4], i32);
20bcab3026Sopenharmony_ci/// ```
21bcab3026Sopenharmony_ci///
22bcab3026Sopenharmony_ci/// The following example fails to compile because `i32x4` explicitly has 4
23bcab3026Sopenharmony_ci/// times the alignment as `[i32; 4]`:
24bcab3026Sopenharmony_ci///
25bcab3026Sopenharmony_ci/// ```compile_fail
26bcab3026Sopenharmony_ci/// # #[macro_use] extern crate static_assertions; fn main() {}
27bcab3026Sopenharmony_ci/// # #[allow(non_camel_case_types)]
28bcab3026Sopenharmony_ci/// #[repr(align(16))]
29bcab3026Sopenharmony_ci/// struct i32x4([i32; 4]);
30bcab3026Sopenharmony_ci///
31bcab3026Sopenharmony_ci/// assert_eq_align!(i32x4, [i32; 4]);
32bcab3026Sopenharmony_ci/// ```
33bcab3026Sopenharmony_ci///
34bcab3026Sopenharmony_ci/// [FFI]: https://en.wikipedia.org/wiki/Foreign_function_interface
35bcab3026Sopenharmony_ci#[macro_export]
36bcab3026Sopenharmony_cimacro_rules! assert_eq_align {
37bcab3026Sopenharmony_ci    ($x:ty, $($xs:ty),+ $(,)?) => {
38bcab3026Sopenharmony_ci        const _: fn() = || {
39bcab3026Sopenharmony_ci            // Assigned instance must match the annotated type or else it will
40bcab3026Sopenharmony_ci            // fail to compile
41bcab3026Sopenharmony_ci            use $crate::_core::mem::align_of;
42bcab3026Sopenharmony_ci            $(let _: [(); align_of::<$x>()] = [(); align_of::<$xs>()];)+
43bcab3026Sopenharmony_ci        };
44bcab3026Sopenharmony_ci    };
45bcab3026Sopenharmony_ci}
46