mirror of
https://github.com/rust-lang/rust.git
synced 2025-10-08 13:20:11 +00:00

Invert the order that we pass the arguments to the `contract_check_ensures` function to avoid the warning when the tail of the function is unreachable. Note that the call itself is also unreachable, but we have already handled that case by ignoring unreachable call for contract calls.
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);
|
|
}
|