xref: /linux-6.15/rust/kernel/static_assert.rs (revision ef9e3797)
1*ef9e3797SMiguel Ojeda // SPDX-License-Identifier: GPL-2.0
2*ef9e3797SMiguel Ojeda 
3*ef9e3797SMiguel Ojeda //! Static assert.
4*ef9e3797SMiguel Ojeda 
5*ef9e3797SMiguel Ojeda /// Static assert (i.e. compile-time assert).
6*ef9e3797SMiguel Ojeda ///
7*ef9e3797SMiguel Ojeda /// Similar to C11 [`_Static_assert`] and C++11 [`static_assert`].
8*ef9e3797SMiguel Ojeda ///
9*ef9e3797SMiguel Ojeda /// The feature may be added to Rust in the future: see [RFC 2790].
10*ef9e3797SMiguel Ojeda ///
11*ef9e3797SMiguel Ojeda /// [`_Static_assert`]: https://en.cppreference.com/w/c/language/_Static_assert
12*ef9e3797SMiguel Ojeda /// [`static_assert`]: https://en.cppreference.com/w/cpp/language/static_assert
13*ef9e3797SMiguel Ojeda /// [RFC 2790]: https://github.com/rust-lang/rfcs/issues/2790
14*ef9e3797SMiguel Ojeda ///
15*ef9e3797SMiguel Ojeda /// # Examples
16*ef9e3797SMiguel Ojeda ///
17*ef9e3797SMiguel Ojeda /// ```
18*ef9e3797SMiguel Ojeda /// static_assert!(42 > 24);
19*ef9e3797SMiguel Ojeda /// static_assert!(core::mem::size_of::<u8>() == 1);
20*ef9e3797SMiguel Ojeda ///
21*ef9e3797SMiguel Ojeda /// const X: &[u8] = b"bar";
22*ef9e3797SMiguel Ojeda /// static_assert!(X[1] == b'a');
23*ef9e3797SMiguel Ojeda ///
24*ef9e3797SMiguel Ojeda /// const fn f(x: i32) -> i32 {
25*ef9e3797SMiguel Ojeda ///     x + 2
26*ef9e3797SMiguel Ojeda /// }
27*ef9e3797SMiguel Ojeda /// static_assert!(f(40) == 42);
28*ef9e3797SMiguel Ojeda /// ```
29*ef9e3797SMiguel Ojeda #[macro_export]
30*ef9e3797SMiguel Ojeda macro_rules! static_assert {
31*ef9e3797SMiguel Ojeda     ($condition:expr) => {
32*ef9e3797SMiguel Ojeda         const _: () = core::assert!($condition);
33*ef9e3797SMiguel Ojeda     };
34*ef9e3797SMiguel Ojeda }
35