| //@ run-pass |
| #![allow(dead_code)] |
| #![allow(unused_variables)] |
| // Tests that binary operators allow subtyping on both the LHS and RHS, |
| // and as such do not introduce unnecessarily strict lifetime constraints. |
| |
| use std::ops::Add; |
| |
| struct Foo; |
| |
| impl<'a> Add<&'a Foo> for &'a Foo { |
| type Output = (); |
| fn add(self, rhs: &'a Foo) {} |
| } |
| |
| fn try_to_add(input: &Foo) { |
| let local = Foo; |
| |
| // Manual reborrow worked even with invariant trait search. |
| &*input + &local; |
| |
| // Direct use of the reference on the LHS requires additional |
| // subtyping before searching (invariantly) for `LHS: Add<RHS>`. |
| input + &local; |
| } |
| |
| fn main() { |
| } |