They used to be covered by `optin_builtin_traits` but negative impls are now applicable to all traits, not just auto traits. This also adds docs in the unstable book for the current state of auto traits.
70 lines
1.3 KiB
Rust
70 lines
1.3 KiB
Rust
#![feature(negative_impls)]
|
|
#![allow(order_dependent_trait_objects)]
|
|
|
|
// Check that the issue #33140 hack does not allow unintended things.
|
|
|
|
// OK
|
|
trait Trait0 {}
|
|
|
|
impl Trait0 for dyn Send {}
|
|
impl Trait0 for dyn Send {}
|
|
|
|
// Problem 1: associated types
|
|
trait Trait1 {
|
|
fn my_fn(&self) {}
|
|
}
|
|
|
|
impl Trait1 for dyn Send {}
|
|
impl Trait1 for dyn Send {}
|
|
//~^ ERROR E0119
|
|
|
|
// Problem 2: negative impl
|
|
trait Trait2 {}
|
|
|
|
impl Trait2 for dyn Send {}
|
|
impl !Trait2 for dyn Send {}
|
|
//~^ ERROR E0748
|
|
|
|
// Problem 3: type parameter
|
|
trait Trait3<T: ?Sized> {}
|
|
|
|
impl Trait3<dyn Sync> for dyn Send {}
|
|
impl Trait3<dyn Sync> for dyn Send {}
|
|
//~^ ERROR E0119
|
|
|
|
// Problem 4a: not a trait object - generic
|
|
trait Trait4a {}
|
|
|
|
impl<T: ?Sized> Trait4a for T {}
|
|
impl Trait4a for dyn Send {}
|
|
//~^ ERROR E0119
|
|
|
|
// Problem 4b: not a trait object - misc
|
|
trait Trait4b {}
|
|
|
|
impl Trait4b for () {}
|
|
impl Trait4b for () {}
|
|
//~^ ERROR E0119
|
|
|
|
// Problem 4c: not a principal-less trait object
|
|
trait Trait4c {}
|
|
|
|
impl Trait4c for dyn Trait1 + Send {}
|
|
impl Trait4c for dyn Trait1 + Send {}
|
|
//~^ ERROR E0119
|
|
|
|
// Problem 4d: lifetimes
|
|
trait Trait4d {}
|
|
|
|
impl<'a> Trait4d for dyn Send + 'a {}
|
|
impl<'a> Trait4d for dyn Send + 'a {}
|
|
//~^ ERROR E0119
|
|
|
|
// Problem 5: where-clauses
|
|
trait Trait5 {}
|
|
|
|
impl Trait5 for dyn Send {}
|
|
impl Trait5 for dyn Send where u32: Copy {}
|
|
//~^ ERROR E0119
|
|
|
|
fn main() {}
|