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