#[cfg(not(verus_keep_ghost))]
macro_rules! verified_kernel_function {
(
$(#[doc = $doc:expr])*
$(#[must_use])?
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
$body:block
) => {
$(#[doc = $doc])*
#[must_use]
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility fn $name($($arguments)*) -> $result $body
};
(
$(#[doc = $doc:expr])*
$(#[must_use])?
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
$body:block
) => {
$(#[doc = $doc])*
#[must_use]
$visibility fn $name($($arguments)*) -> $result $body
};
}
#[cfg(not(verus_keep_ghost))]
macro_rules! verified_loop_function {
(
$(#[doc = $doc:expr])*
$(#[must_use])?
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
before { $($before:tt)* }
while ($condition:expr) invariant($($invariant:tt)*) $loop_body:block
$(proof_after { $($proof_after:tt)* })?
after { $($after:tt)* }
) => {
$(#[doc = $doc])*
#[must_use]
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility fn $name($($arguments)*) -> $result {
$($before)*
while $condition $loop_body
$($after)*
}
};
(
$(#[doc = $doc:expr])*
$(#[must_use])?
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
before { $($before:tt)* }
while ($condition:expr) invariant($($invariant:tt)*) $loop_body:block
$(proof_after { $($proof_after:tt)* })?
after { $($after:tt)* }
) => {
$(#[doc = $doc])*
#[must_use]
$visibility fn $name($($arguments)*) -> $result {
$($before)*
while $condition $loop_body
$($after)*
}
};
}
#[cfg(verus_keep_ghost)]
macro_rules! verified_loop_function {
(
$(#[doc = $doc:expr])*
$(#[must_use])?
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
before { $($before:tt)* }
while ($condition:expr) invariant($($invariant:tt)*) $loop_body:block
$(proof_after { $($proof_after:tt)* })?
after { $($after:tt)* }
) => {
verus! {
$(#[doc = $doc])*
#[must_use]
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility fn $name($($arguments)*) -> ($result_name: $result)
$(requires $($precondition)*)?
ensures $($postcondition)*
{
$($before)*
while $condition
invariant $($invariant)*
$loop_body
$(proof { $($proof_after)* })?
$($after)*
}
}
};
(
$(#[doc = $doc:expr])*
$(#[must_use])?
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
before { $($before:tt)* }
while ($condition:expr) invariant($($invariant:tt)*) $loop_body:block
$(proof_after { $($proof_after:tt)* })?
after { $($after:tt)* }
) => {
verus! {
$(#[doc = $doc])*
#[must_use]
$visibility fn $name($($arguments)*) -> ($result_name: $result)
$(requires $($precondition)*)?
ensures $($postcondition)*
{
$($before)*
while $condition
invariant $($invariant)*
$loop_body
$(proof { $($proof_after)* })?
$($after)*
}
}
};
}
#[cfg(verus_keep_ghost)]
macro_rules! verified_kernel_function {
(
$(#[doc = $doc:expr])*
$(#[must_use])?
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
$body:block
) => {
verus! {
$(#[doc = $doc])*
#[must_use]
#[cfg_attr(verus_keep_ghost, verifier::external_body)]
$visibility fn $name($($arguments)*) -> ($result_name: $result)
$(requires $($precondition)*)?
ensures $($postcondition)*
$body
}
};
(
$(#[doc = $doc:expr])*
$(#[must_use])?
$visibility:vis fn $name:ident($($arguments:tt)*) -> $result:ty;
$(requires($($precondition:tt)*);)?
ensures($result_name:ident => $($postcondition:tt)*);
$body:block
) => {
verus! {
$(#[doc = $doc])*
#[must_use]
$visibility fn $name($($arguments)*) -> ($result_name: $result)
$(requires $($precondition)*)?
ensures $($postcondition)*
$body
}
};
}