// Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. // pretty-expanded FIXME #23616 #![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 cannot infer } 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); }