mirror of https://github.com/rust-lang/rust
40 lines
1.0 KiB
Rust
40 lines
1.0 KiB
Rust
// This test is for #29859, we need to ensure auto traits,
|
|
// (also known previously as default traits), do not have
|
|
// supertraits. Since the compiler synthesizes these
|
|
// instances on demand, we are essentially enabling
|
|
// users to write axioms if we view trait selection,
|
|
// as a proof system.
|
|
//
|
|
// For example the below test allows us to add the rule:
|
|
// forall (T : Type), T : Copy
|
|
//
|
|
// Providing a copy instance for *any* type, which
|
|
// is most definitely unsound. Imagine copying a
|
|
// type that contains a mutable reference, enabling
|
|
// mutable aliasing.
|
|
//
|
|
// You can imagine an even more dangerous test,
|
|
// which currently compiles on nightly.
|
|
//
|
|
// fn main() {
|
|
// let mut i = 10;
|
|
// let (a, b) = copy(&mut i);
|
|
// println!("{:?} {:?}", a, b);
|
|
// }
|
|
|
|
#![feature(auto_traits)]
|
|
#![feature(negative_impls)]
|
|
|
|
auto trait Magic: Copy {} //~ ERROR E0568
|
|
impl<T:Magic> Magic for T {}
|
|
|
|
fn copy<T: Magic>(x: T) -> (T, T) { (x, x) }
|
|
|
|
#[derive(Debug)]
|
|
struct NoClone;
|
|
|
|
fn main() {
|
|
let (a, b) = copy(NoClone);
|
|
println!("{:?} {:?}", a, b);
|
|
}
|