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