diff options
| author | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-27 01:33:01 +0300 |
|---|---|---|
| committer | Vadim Petrochenkov <vadim.petrochenkov@gmail.com> | 2019-07-27 18:56:16 +0300 |
| commit | 9be35f82c1abf2ecbab489bca9eca138ea648312 (patch) | |
| tree | 69888506e34af447d9748c0d542de3ba1dd76210 /src/test/ui/panics | |
| parent | ca9faa52f5ada0054b1fa27d97aedf448afb059b (diff) | |
| download | rust-9be35f82c1abf2ecbab489bca9eca138ea648312.tar.gz rust-9be35f82c1abf2ecbab489bca9eca138ea648312.zip | |
tests: Move run-pass tests without naming conflicts to ui
Diffstat (limited to 'src/test/ui/panics')
| -rw-r--r-- | src/test/ui/panics/panic-handler-chain.rs | 29 | ||||
| -rw-r--r-- | src/test/ui/panics/panic-handler-flail-wildly.rs | 55 | ||||
| -rw-r--r-- | src/test/ui/panics/panic-handler-set-twice.rs | 24 | ||||
| -rw-r--r-- | src/test/ui/panics/panic-in-dtor-drops-fields.rs | 37 | ||||
| -rw-r--r-- | src/test/ui/panics/panic-recover-propagate.rs | 26 | ||||
| -rw-r--r-- | src/test/ui/panics/panic-safe.rs | 51 |
6 files changed, 222 insertions, 0 deletions
diff --git a/src/test/ui/panics/panic-handler-chain.rs b/src/test/ui/panics/panic-handler-chain.rs new file mode 100644 index 00000000000..93044b5cb25 --- /dev/null +++ b/src/test/ui/panics/panic-handler-chain.rs @@ -0,0 +1,29 @@ +// run-pass +#![allow(stable_features)] + +// ignore-emscripten no threads support + +#![feature(std_panic)] + +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::panic; +use std::thread; + +static A: AtomicUsize = AtomicUsize::new(0); +static B: AtomicUsize = AtomicUsize::new(0); + +fn main() { + panic::set_hook(Box::new(|_| { A.fetch_add(1, Ordering::SeqCst); })); + let hook = panic::take_hook(); + panic::set_hook(Box::new(move |info| { + B.fetch_add(1, Ordering::SeqCst); + hook(info); + })); + + let _ = thread::spawn(|| { + panic!(); + }).join(); + + assert_eq!(1, A.load(Ordering::SeqCst)); + assert_eq!(1, B.load(Ordering::SeqCst)); +} diff --git a/src/test/ui/panics/panic-handler-flail-wildly.rs b/src/test/ui/panics/panic-handler-flail-wildly.rs new file mode 100644 index 00000000000..6badd203842 --- /dev/null +++ b/src/test/ui/panics/panic-handler-flail-wildly.rs @@ -0,0 +1,55 @@ +// run-pass + +#![allow(stable_features)] +#![allow(unused_must_use)] + +// ignore-emscripten no threads support + +#![feature(std_panic)] + +use std::panic; +use std::thread; + +fn a() { + panic::set_hook(Box::new(|_| println!("hello yes this is a"))); + panic::take_hook(); + panic::set_hook(Box::new(|_| println!("hello yes this is a part 2"))); + panic::take_hook(); +} + +fn b() { + panic::take_hook(); + panic::take_hook(); + panic::take_hook(); + panic::take_hook(); + panic::take_hook(); + panic!(); +} + +fn c() { + panic::set_hook(Box::new(|_| ())); + panic::set_hook(Box::new(|_| ())); + panic::set_hook(Box::new(|_| ())); + panic::set_hook(Box::new(|_| ())); + panic::set_hook(Box::new(|_| ())); + panic::set_hook(Box::new(|_| ())); + panic!(); +} + +fn main() { + for _ in 0..10 { + let mut handles = vec![]; + for _ in 0..10 { + handles.push(thread::spawn(a)); + } + for _ in 0..10 { + handles.push(thread::spawn(b)); + } + for _ in 0..10 { + handles.push(thread::spawn(c)); + } + for handle in handles { + let _ = handle.join(); + } + } +} diff --git a/src/test/ui/panics/panic-handler-set-twice.rs b/src/test/ui/panics/panic-handler-set-twice.rs new file mode 100644 index 00000000000..0312ed221ca --- /dev/null +++ b/src/test/ui/panics/panic-handler-set-twice.rs @@ -0,0 +1,24 @@ +// run-pass +#![allow(unused_variables)] +#![allow(stable_features)] + +#![feature(std_panic)] + +// ignore-emscripten no threads support + +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::panic; +use std::thread; + +static A: AtomicUsize = AtomicUsize::new(0); + +fn main() { + panic::set_hook(Box::new(|_| ())); + panic::set_hook(Box::new(|info| { A.fetch_add(1, Ordering::SeqCst); })); + + let _ = thread::spawn(|| { + panic!(); + }).join(); + + assert_eq!(1, A.load(Ordering::SeqCst)); +} diff --git a/src/test/ui/panics/panic-in-dtor-drops-fields.rs b/src/test/ui/panics/panic-in-dtor-drops-fields.rs new file mode 100644 index 00000000000..caddd942dc0 --- /dev/null +++ b/src/test/ui/panics/panic-in-dtor-drops-fields.rs @@ -0,0 +1,37 @@ +// run-pass +#![allow(dead_code)] +#![allow(non_upper_case_globals)] + +// ignore-emscripten no threads support + +use std::thread; + +static mut dropped: bool = false; + +struct A { + b: B, +} + +struct B { + foo: isize, +} + +impl Drop for A { + fn drop(&mut self) { + panic!() + } +} + +impl Drop for B { + fn drop(&mut self) { + unsafe { dropped = true; } + } +} + +pub fn main() { + let ret = thread::spawn(move|| { + let _a = A { b: B { foo: 3 } }; + }).join(); + assert!(ret.is_err()); + unsafe { assert!(dropped); } +} diff --git a/src/test/ui/panics/panic-recover-propagate.rs b/src/test/ui/panics/panic-recover-propagate.rs new file mode 100644 index 00000000000..7969336ca74 --- /dev/null +++ b/src/test/ui/panics/panic-recover-propagate.rs @@ -0,0 +1,26 @@ +// run-pass +// ignore-emscripten no threads support + +use std::sync::atomic::{AtomicUsize, Ordering}; +use std::panic; +use std::thread; + +static A: AtomicUsize = AtomicUsize::new(0); + +fn main() { + panic::set_hook(Box::new(|_| { + A.fetch_add(1, Ordering::SeqCst); + })); + + let result = thread::spawn(|| { + let result = panic::catch_unwind(|| { + panic!("hi there"); + }); + + panic::resume_unwind(result.unwrap_err()); + }).join(); + + let msg = *result.unwrap_err().downcast::<&'static str>().unwrap(); + assert_eq!("hi there", msg); + assert_eq!(1, A.load(Ordering::SeqCst)); +} diff --git a/src/test/ui/panics/panic-safe.rs b/src/test/ui/panics/panic-safe.rs new file mode 100644 index 00000000000..9867cc56406 --- /dev/null +++ b/src/test/ui/panics/panic-safe.rs @@ -0,0 +1,51 @@ +// run-pass +#![allow(dead_code)] + +use std::panic::{UnwindSafe, AssertUnwindSafe}; +use std::cell::RefCell; +use std::sync::{Mutex, RwLock, Arc}; +use std::rc::Rc; + +struct Foo { a: i32 } + +fn assert<T: UnwindSafe + ?Sized>() {} + +fn main() { + assert::<i32>(); + assert::<&i32>(); + assert::<*mut i32>(); + assert::<*const i32>(); + assert::<usize>(); + assert::<str>(); + assert::<&str>(); + assert::<Foo>(); + assert::<&Foo>(); + assert::<Vec<i32>>(); + assert::<String>(); + assert::<RefCell<i32>>(); + assert::<Box<i32>>(); + assert::<Mutex<i32>>(); + assert::<RwLock<i32>>(); + assert::<&Mutex<i32>>(); + assert::<&RwLock<i32>>(); + assert::<Rc<i32>>(); + assert::<Arc<i32>>(); + assert::<Box<[u8]>>(); + + trait Trait: UnwindSafe {} + assert::<Box<dyn Trait>>(); + + fn bar<T>() { + assert::<Mutex<T>>(); + assert::<RwLock<T>>(); + } + fn baz<T: UnwindSafe>() { + assert::<Box<T>>(); + assert::<Vec<T>>(); + assert::<RefCell<T>>(); + assert::<AssertUnwindSafe<T>>(); + assert::<&AssertUnwindSafe<T>>(); + assert::<Rc<AssertUnwindSafe<T>>>(); + assert::<Arc<AssertUnwindSafe<T>>>(); + } +} |
