summaryrefslogtreecommitdiffstats
path: root/src/test/ui/kindck/kindck-copy.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/ui/kindck/kindck-copy.rs')
-rw-r--r--src/test/ui/kindck/kindck-copy.rs71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/test/ui/kindck/kindck-copy.rs b/src/test/ui/kindck/kindck-copy.rs
new file mode 100644
index 000000000..6df98c230
--- /dev/null
+++ b/src/test/ui/kindck/kindck-copy.rs
@@ -0,0 +1,71 @@
+// Test which of the builtin types are considered POD.
+
+use std::rc::Rc;
+
+fn assert_copy<T:Copy>() { }
+
+trait Dummy { }
+
+#[derive(Copy, Clone)]
+struct MyStruct {
+ x: isize,
+ y: isize,
+}
+
+struct MyNoncopyStruct {
+ x: Box<char>,
+}
+
+fn test<'a,T,U:Copy>(_: &'a isize) {
+ // lifetime pointers are ok...
+ assert_copy::<&'static isize>();
+ assert_copy::<&'a isize>();
+ assert_copy::<&'a str>();
+ assert_copy::<&'a [isize]>();
+
+ // ...unless they are mutable
+ assert_copy::<&'static mut isize>(); //~ ERROR : Copy` is not satisfied
+ assert_copy::<&'a mut isize>(); //~ ERROR : Copy` is not satisfied
+
+ // boxes are not ok
+ assert_copy::<Box<isize>>(); //~ ERROR : Copy` is not satisfied
+ assert_copy::<String>(); //~ ERROR : Copy` is not satisfied
+ assert_copy::<Vec<isize> >(); //~ ERROR : Copy` is not satisfied
+ assert_copy::<Box<&'a mut isize>>(); //~ ERROR : Copy` is not satisfied
+
+ // borrowed object types are generally ok
+ assert_copy::<&'a dyn Dummy>();
+ assert_copy::<&'a (dyn Dummy + Send)>();
+ assert_copy::<&'static (dyn Dummy + Send)>();
+
+ // owned object types are not ok
+ assert_copy::<Box<dyn Dummy>>(); //~ ERROR : Copy` is not satisfied
+ assert_copy::<Box<dyn Dummy + Send>>(); //~ ERROR : Copy` is not satisfied
+
+ // mutable object types are not ok
+ assert_copy::<&'a mut (dyn Dummy + Send)>(); //~ ERROR : Copy` is not satisfied
+
+ // unsafe ptrs are ok
+ assert_copy::<*const isize>();
+ assert_copy::<*const &'a mut isize>();
+
+ // regular old ints and such are ok
+ assert_copy::<isize>();
+ assert_copy::<bool>();
+ assert_copy::<()>();
+
+ // tuples are ok
+ assert_copy::<(isize,isize)>();
+
+ // structs of POD are ok
+ assert_copy::<MyStruct>();
+
+ // structs containing non-POD are not ok
+ assert_copy::<MyNoncopyStruct>(); //~ ERROR : Copy` is not satisfied
+
+ // ref counted types are not ok
+ assert_copy::<Rc<isize>>(); //~ ERROR : Copy` is not satisfied
+}
+
+pub fn main() {
+}