| /// Asserts that types are equal in alignment. |
| /// |
| /// This is useful when ensuring that pointer arithmetic is done correctly, or |
| /// when [FFI] requires a type to have the same alignment as some foreign type. |
| /// |
| /// # Examples |
| /// |
| /// A `usize` has the same alignment as any pointer type: |
| /// |
| /// ``` |
| /// # #[macro_use] extern crate static_assertions; fn main() {} |
| /// assert_eq_align!(usize, *const u8, *mut u8); |
| /// ``` |
| /// |
| /// The following passes because `[i32; 4]` has the same alignment as `i32`: |
| /// |
| /// ``` |
| /// # #[macro_use] extern crate static_assertions; fn main() {} |
| /// assert_eq_align!([i32; 4], i32); |
| /// ``` |
| /// |
| /// The following example fails to compile because `i32x4` explicitly has 4 |
| /// times the alignment as `[i32; 4]`: |
| /// |
| /// ```compile_fail |
| /// # #[macro_use] extern crate static_assertions; fn main() {} |
| /// # #[allow(non_camel_case_types)] |
| /// #[repr(align(16))] |
| /// struct i32x4([i32; 4]); |
| /// |
| /// assert_eq_align!(i32x4, [i32; 4]); |
| /// ``` |
| /// |
| /// [FFI]: https://en.wikipedia.org/wiki/Foreign_function_interface |
| #[macro_export] |
| macro_rules! assert_eq_align { |
| ($x:ty, $($xs:ty),+ $(,)?) => { |
| const _: fn() = || { |
| // Assigned instance must match the annotated type or else it will |
| // fail to compile |
| use $crate::_core::mem::align_of; |
| $(let _: [(); align_of::<$x>()] = [(); align_of::<$xs>()];)+ |
| }; |
| }; |
| } |