diff --git a/src/lib.rs b/src/lib.rs index 2e80e4a..abc62f5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,3 +48,18 @@ macro_rules! assert_eq_size_val { } } } + +/// Asserts at compile-time that the constant expression evaluates to `true`. +#[macro_export] +macro_rules! const_assert { + ($cond:expr) => { + // Causes overflow if condition is false + let _ = [(); 0 - (!($cond) as usize)]; + }; + ($($xs:expr),+) => { + const_assert!($($xs)&&+); + }; + ($($xs:expr);+ $(;)*) => { + const_assert!($($xs),+); + }; +} diff --git a/tests/const.rs b/tests/const.rs new file mode 100644 index 0000000..ceb8045 --- /dev/null +++ b/tests/const.rs @@ -0,0 +1,12 @@ +#![no_std] + +#[macro_use] +extern crate static_assertions; + +#[test] +fn const_assert() { + const FIVE: usize = 5; + + const_assert!(FIVE * 2 == 10); + const_assert!(FIVE > 2); +}