2020-11-22 19:54:31 -08:00
|
|
|
#![feature(auto_traits)]
|
2020-01-09 05:56:38 -05:00
|
|
|
#![feature(negative_impls)]
|
2019-01-05 16:19:34 +02:00
|
|
|
|
|
|
|
// Test for issue #56934 - that it is impossible to redundantly
|
|
|
|
// implement an auto-trait for a trait object type that contains it.
|
|
|
|
|
|
|
|
// Negative impl variant.
|
|
|
|
|
|
|
|
auto trait Marker1 {}
|
|
|
|
auto trait Marker2 {}
|
|
|
|
|
|
|
|
trait Object: Marker1 {}
|
|
|
|
|
|
|
|
// A supertrait marker is illegal...
|
|
|
|
impl !Marker1 for dyn Object + Marker2 { } //~ ERROR E0371
|
|
|
|
// ...and also a direct component.
|
|
|
|
impl !Marker2 for dyn Object + Marker2 { } //~ ERROR E0371
|
|
|
|
|
|
|
|
// But implementing a marker if it is not present is OK.
|
|
|
|
impl !Marker2 for dyn Object {} // OK
|
|
|
|
|
|
|
|
// A non-principal trait-object type is orphan even in its crate.
|
|
|
|
impl !Send for dyn Marker2 {} //~ ERROR E0117
|
|
|
|
|
|
|
|
// And impl'ing a remote marker for a local trait object is forbidden
|
|
|
|
// by one of these special orphan-like rules.
|
|
|
|
impl !Send for dyn Object {} //~ ERROR E0321
|
|
|
|
impl !Send for dyn Object + Marker2 {} //~ ERROR E0321
|
|
|
|
|
|
|
|
fn main() { }
|