mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			768 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			768 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| #![allow(dead_code)]
 | |
| 
 | |
| // Get<T> is covariant in T
 | |
| trait Get<T> {
 | |
|     fn get(&self) -> T;
 | |
| }
 | |
| 
 | |
| struct Cloner<T:Clone> {
 | |
|     t: T
 | |
| }
 | |
| 
 | |
| impl<T:Clone> Get<T> for Cloner<T> {
 | |
|     fn get(&self) -> T {
 | |
|         self.t.clone()
 | |
|     }
 | |
| }
 | |
| 
 | |
| fn get<'a, G>(get: &G) -> i32
 | |
|     where G : Get<&'a i32>
 | |
| {
 | |
|     // This fails to type-check because, without variance, we can't
 | |
|     // use `G : Get<&'a i32>` as evidence that `G : Get<&'b i32>`,
 | |
|     // even if `'a : 'b`.
 | |
|     pick(get, &22) //~ ERROR explicit lifetime required in the type of `get` [E0621]
 | |
| }
 | |
| 
 | |
| fn pick<'b, G>(get: &'b G, if_odd: &'b i32) -> i32
 | |
|     where G : Get<&'b i32>
 | |
| {
 | |
|     let v = *get.get();
 | |
|     if v % 2 != 0 { v } else { *if_odd }
 | |
| }
 | |
| 
 | |
| fn main() {
 | |
|     let x = Cloner { t: &23 };
 | |
|     let y = get(&x);
 | |
|     assert_eq!(y, 23);
 | |
| }
 | 
