mirror of
https://github.com/rust-lang/rust.git
synced 2025-12-01 16:18:42 +00:00
Contract variables can be declared in the `requires` clause and can be referenced both in `requires` and `ensures`, subject to usual borrow checking rules. This allows any setup common to both the `requires` and `ensures` clauses to only be done once.
45 lines
1.2 KiB
Rust
45 lines
1.2 KiB
Rust
//@ revisions: unchk_pass unchk_fail_pre unchk_fail_post chk_pass chk_fail_pre chk_fail_post
|
|
//
|
|
//@ [unchk_pass] run-pass
|
|
//@ [unchk_fail_pre] run-pass
|
|
//@ [unchk_fail_post] run-pass
|
|
//@ [chk_pass] run-pass
|
|
//
|
|
//@ [chk_fail_pre] run-crash
|
|
//@ [chk_fail_post] run-crash
|
|
//
|
|
//@ [unchk_pass] compile-flags: -Zcontract-checks=no
|
|
//@ [unchk_fail_pre] compile-flags: -Zcontract-checks=no
|
|
//@ [unchk_fail_post] compile-flags: -Zcontract-checks=no
|
|
//
|
|
//@ [chk_pass] compile-flags: -Zcontract-checks=yes
|
|
//@ [chk_fail_pre] compile-flags: -Zcontract-checks=yes
|
|
//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
|
|
|
|
#![feature(contracts_internals)]
|
|
|
|
fn nest(x: Baz) -> i32
|
|
contract_requires { x.baz > 0 }
|
|
contract_ensures { |ret| *ret > 100 }
|
|
{
|
|
loop {
|
|
return x.baz + 50;
|
|
}
|
|
}
|
|
|
|
struct Baz { baz: i32 }
|
|
|
|
const BAZ_PASS_PRE_POST: Baz = Baz { baz: 100 };
|
|
#[cfg(any(unchk_fail_post, chk_fail_post))]
|
|
const BAZ_FAIL_POST: Baz = Baz { baz: 10 };
|
|
#[cfg(any(unchk_fail_pre, chk_fail_pre))]
|
|
const BAZ_FAIL_PRE: Baz = Baz { baz: -10 };
|
|
|
|
fn main() {
|
|
assert_eq!(nest(BAZ_PASS_PRE_POST), 150);
|
|
#[cfg(any(unchk_fail_pre, chk_fail_pre))]
|
|
nest(BAZ_FAIL_PRE);
|
|
#[cfg(any(unchk_fail_post, chk_fail_post))]
|
|
nest(BAZ_FAIL_POST);
|
|
}
|