// Copyright 2012 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // Test which of the builtin types are considered POD. use std::marker::MarkerTrait; use std::rc::Rc; fn assert_copy() { } trait Dummy : MarkerTrait { } #[derive(Copy, Clone)] struct MyStruct { x: isize, y: isize, } struct MyNoncopyStruct { x: Box, } 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 `core::marker::Copy` is not implemented assert_copy::<&'a mut isize>(); //~ ERROR `core::marker::Copy` is not implemented // ~ pointers are not ok assert_copy::>(); //~ ERROR `core::marker::Copy` is not implemented assert_copy::(); //~ ERROR `core::marker::Copy` is not implemented assert_copy:: >(); //~ ERROR `core::marker::Copy` is not implemented assert_copy::>(); //~ ERROR `core::marker::Copy` is not implemented // borrowed object types are generally ok assert_copy::<&'a Dummy>(); assert_copy::<&'a (Dummy+Copy)>(); assert_copy::<&'static (Dummy+Copy)>(); // owned object types are not ok assert_copy::>(); //~ ERROR `core::marker::Copy` is not implemented assert_copy::>(); //~ ERROR `core::marker::Copy` is not implemented // mutable object types are not ok assert_copy::<&'a mut (Dummy+Copy)>(); //~ ERROR `core::marker::Copy` is not implemented // unsafe ptrs are ok assert_copy::<*const isize>(); assert_copy::<*const &'a mut isize>(); // regular old ints and such are ok assert_copy::(); assert_copy::(); assert_copy::<()>(); // tuples are ok assert_copy::<(isize,isize)>(); // structs of POD are ok assert_copy::(); // structs containing non-POD are not ok assert_copy::(); //~ ERROR `core::marker::Copy` is not implemented // ref counted types are not ok assert_copy::>(); //~ ERROR `core::marker::Copy` is not implemented } pub fn main() { }