#![allow(dead_code)] // Get is covariant in T trait Get { fn get(&self) -> T; } struct Cloner { t: T } impl Get for Cloner { 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); }