mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 21:16:44 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			38 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			38 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![feature(auto_traits)]
 | |
| #![feature(negative_impls)]
 | |
| 
 | |
| // 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
 | |
|                                           //~^ ERROR 0321
 | |
| // ...and also a direct component.
 | |
| impl !Marker2 for dyn Object + Marker2 {} //~ ERROR E0371
 | |
|                                           //~^ ERROR 0321
 | |
| 
 | |
| // A non-principal trait-object type is orphan even in its crate.
 | |
| impl !Send for dyn Marker2 {} //~ ERROR E0117
 | |
| 
 | |
| // Implementing a marker for a local trait object is forbidden by a special
 | |
| // orphan-like rule.
 | |
| impl !Marker2 for dyn Object {} //~ ERROR E0321
 | |
| impl !Send for dyn Object {} //~ ERROR E0321
 | |
| impl !Send for dyn Object + Marker2 {} //~ ERROR E0321
 | |
| 
 | |
| // Blanket impl that applies to dyn Object is equally problematic.
 | |
| auto trait Marker3 {}
 | |
| impl<T: ?Sized> !Marker3 for T {} //~ ERROR E0321
 | |
| 
 | |
| auto trait Marker4 {}
 | |
| impl<T> !Marker4 for T {} // okay
 | |
| 
 | |
| fn main() {}
 | 
