flux_rs/lib.rs
1#![no_std]
2pub mod bitvec;
3
4pub use attrs::*;
5pub use flux_attrs as attrs;
6
7#[sig(fn(bool[true]) )]
8pub fn assert(_: bool) {}
9
10#[sig (fn() -> _ requires false)]
11pub fn unreachable() -> ! {
12 unreachable!("impossible case")
13}
14
15/// Macro for creating detached specifications.
16///
17/// # Example
18/// ```
19/// flux_rs::macros::detached_spec! {
20/// fn inc(n:i32) -> i32[n+1];
21/// fn watermelon(n:usize) -> usize[n+2];
22/// }
23/// ```
24#[macro_export]
25#[doc(hidden)]
26macro_rules! __private_detached_spec {
27 ($($e:tt)*) => {
28 #[flux_rs::specs {
29 $($e)*
30 }]
31 const _: () = ();
32 };
33}
34
35/// Macro for creating `invariant qualifier`s
36/// # Example
37/// ```
38/// invariant!(res: int, i: int, n: int ; res + i == n);
39/// ```
40#[macro_export]
41#[doc(hidden)]
42macro_rules! __private_invariant {
43 ($($param:ident : $ty:ty),* ; $expr:expr) => {
44 #[flux::defs{
45 invariant qualifier Auto($($param: $ty),*) { $expr }
46 }]
47 const _: () = ();
48 flux_rs::assert($expr);
49 };
50}
51
52pub mod macros {
53 /// Macro for creating detached specifications.
54 ///
55 /// # Example
56 /// ```
57 /// flux_rs::macros::detached_spec! {
58 /// fn inc(n:i32) -> i32[n+1];
59 /// fn watermelon(n:usize) -> usize[n+2];
60 /// }
61 /// ```
62 pub use crate::__private_detached_spec as detached_spec;
63 /// Macro for creating `invariant qualifier`s
64 /// # Example
65 /// ```
66 /// flux_rs::macros::invariant!(res: int, i: int, n: int ; res + i == n);
67 /// ```
68 pub use crate::__private_invariant as invariant;
69}