about summary refs log tree commit diff
path: root/src/test/ui/panics
diff options
context:
space:
mode:
authorVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-07-27 01:33:01 +0300
committerVadim Petrochenkov <vadim.petrochenkov@gmail.com>2019-07-27 18:56:16 +0300
commit9be35f82c1abf2ecbab489bca9eca138ea648312 (patch)
tree69888506e34af447d9748c0d542de3ba1dd76210 /src/test/ui/panics
parentca9faa52f5ada0054b1fa27d97aedf448afb059b (diff)
downloadrust-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.rs29
-rw-r--r--src/test/ui/panics/panic-handler-flail-wildly.rs55
-rw-r--r--src/test/ui/panics/panic-handler-set-twice.rs24
-rw-r--r--src/test/ui/panics/panic-in-dtor-drops-fields.rs37
-rw-r--r--src/test/ui/panics/panic-recover-propagate.rs26
-rw-r--r--src/test/ui/panics/panic-safe.rs51
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>>>();
+    }
+}