mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	 e1d4f2a0c2
			
		
	
	
		e1d4f2a0c2
		
	
	
	
	
		
			
			And introduce two new directives for ui tests: * `run-crash` * `run-fail-or-crash` Normally a `run-fail` ui test like tests that panic shall not be terminated by a signal like `SIGABRT`. So begin having that as a hard requirement. Some of our current tests do terminate by a signal/crash however. Introduce and use `run-crash` for those tests. Note that Windows crashes are not handled by signals but by certain high bits set on the process exit code. Example exit code for crash on Windows: `0xc000001d`. Because of this, we define "crash" on all platforms as "not exit with success and not exit with a regular failure code in the range 1..=127". Some tests behave differently on different targets: * Targets without unwind support will abort (crash) instead of exit with failure code 101 after panicking. As a special case, allow crashes for `run-fail` tests for such targets. * Different sanitizer implementations handle detected memory problems differently. Some abort (crash) the process while others exit with failure code 1. Introduce and use `run-fail-or-crash` for such tests.
		
			
				
	
	
		
			57 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			57 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Check if we can annotate a constant function with contracts.
 | |
| //!
 | |
| //! The contract is only checked at runtime, and it will not fail if evaluated statically.
 | |
| //! This is an existing limitation due to the existing architecture and the lack of constant
 | |
| //! closures.
 | |
| //!
 | |
| //@ revisions: all_pass runtime_fail_pre runtime_fail_post
 | |
| //
 | |
| //@ [all_pass] run-pass
 | |
| //
 | |
| //@ [runtime_fail_pre] run-crash
 | |
| //@ [runtime_fail_post] run-crash
 | |
| //
 | |
| //@ [all_pass] compile-flags: -Zcontract-checks=yes
 | |
| //@ [runtime_fail_pre] compile-flags: -Zcontract-checks=yes
 | |
| //@ [runtime_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]
 | |
| 
 | |
| extern crate core;
 | |
| use core::contracts::*;
 | |
| 
 | |
| #[requires(x < 100)]
 | |
| const fn less_than_100(x: u8) -> u8 {
 | |
|     x
 | |
| }
 | |
| 
 | |
| // This is wrong on purpose.
 | |
| #[ensures(|ret| *ret)]
 | |
| const fn always_true(b: bool) -> bool {
 | |
|     b
 | |
| }
 | |
| 
 | |
| const ZERO: u8 = less_than_100(0);
 | |
| // This is no-op because the contract cannot be checked at compilation time.
 | |
| const TWO_HUNDRED: u8 = less_than_100(200);
 | |
| 
 | |
| /// Example from <https://github.com/rust-lang/rust/issues/136925>.
 | |
| #[ensures(move |ret: &u32| *ret > x)]
 | |
| const fn broken_sum(x: u32, y: u32) -> u32 {
 | |
|     x + y
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     assert_eq!(ZERO, 0);
 | |
|     assert_eq!(TWO_HUNDRED, 200);
 | |
|     assert_eq!(broken_sum(0, 1), 1);
 | |
|     assert_eq!(always_true(true), true);
 | |
| 
 | |
|     #[cfg(runtime_fail_post)]
 | |
|     let _ok = always_true(false);
 | |
| 
 | |
|     // Runtime check should fail.
 | |
|     #[cfg(runtime_fail_pre)]
 | |
|     let _200 = less_than_100(200);
 | |
| }
 |