| 1 | //! Unstable module containing the unstable contracts lang items and attribute macros. |
| 2 | |
| 3 | pub use crate::macros::builtin::{contracts_ensures as ensures, contracts_requires as requires}; |
| 4 | |
| 5 | /// Emitted by rustc as a desugaring of `#[ensures(PRED)] fn foo() -> R { ... [return R;] ... }` |
| 6 | /// into: `fn foo() { let _check = build_check_ensures(|ret| PRED) ... [return _check(R);] ... }` |
| 7 | /// (including the implicit return of the tail expression, if any). |
| 8 | #[unstable (feature = "contracts_internals" , issue = "128044" /* compiler-team#759 */)] |
| 9 | #[lang = "contract_build_check_ensures" ] |
| 10 | #[track_caller ] |
| 11 | pub fn build_check_ensures<Ret, C>(cond: C) -> impl (Fn(Ret) -> Ret) + Copy |
| 12 | where |
| 13 | C: for<'a> dynFn(&'a Ret) -> bool + Copy + 'static, |
| 14 | { |
| 15 | #[track_caller ] |
| 16 | move |ret: Ret| { |
| 17 | crate::intrinsics::contract_check_ensures(&ret, cond); |
| 18 | ret |
| 19 | } |
| 20 | } |
| 21 | |