1 // Copyright 2018 The Chromium OS Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 //! Macros that assert properties of code at compile time.
6 //!
7 //! A static assertion is particularly appropriate when unsafe code relies on
8 //! two types to have the same size, or on some type to have a particular size.
9 
10 #[doc(hidden)]
11 pub mod mechanism;
12 
13 // Re-export so that these types appear with a more concise name in error
14 // messages.
15 #[doc(hidden)]
16 pub use crate::mechanism::*;
17 
18 /// Macro that fails to compile if a given const expression is not true.
19 ///
20 /// # Example
21 ///
22 /// ```rust
23 /// use assertions::const_assert;
24 ///
25 /// fn main() {
26 ///     const_assert!(std::mem::size_of::<String>() == 24);
27 /// }
28 /// ```
29 ///
30 /// # Example that fails to compile
31 ///
32 /// ```rust,compile_fail
33 /// use assertions::const_assert;
34 ///
35 /// fn main() {
36 ///     // fails to compile:
37 ///     const_assert!(std::mem::size_of::<String>() == 8);
38 /// }
39 /// ```
40 #[macro_export]
41 macro_rules! const_assert {
42     ($e:expr) => {
43         let _: $crate::Assert<[(); $e as bool as usize]>;
44     };
45 }
46