mirror of https://github.com/rust-lang/rust.git
46 lines
1.3 KiB
Rust
46 lines
1.3 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-fail
|
|
//@ [chk_fail_post] run-fail
|
|
//
|
|
//@ [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)]
|
|
//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
|
|
|
|
#[core::contracts::requires(x.baz > 0)]
|
|
#[core::contracts::ensures(|ret| *ret > 100)]
|
|
fn nest(x: Baz) -> i32
|
|
{
|
|
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);
|
|
}
|