summaryrefslogtreecommitdiffstats
path: root/src/test/ui/nll/relate_tys/var-appears-twice.rs
blob: 77129f4468f047a3f89be10302a52bfa42c838e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// Test that the NLL `relate_tys` code correctly deduces that a
// function returning always its first argument can be upcast to one
// that returns either first or second argument.

use std::cell::Cell;

type DoubleCell<A> = Cell<(A, A)>;
type DoublePair<A> = (A, A);

fn make_cell<'b>(x: &'b u32) -> Cell<(&'static u32, &'b u32)> {
    panic!()
}

fn main() {
    let a: &'static u32 = &22;
    let b = 44;

    // Here we get an error because `DoubleCell<_>` requires the same type
    // on both parts of the `Cell`, and we can't have that.
    let x: DoubleCell<_> = make_cell(&b); //~ ERROR

    // Here we do not get an error because `DoublePair<_>` permits
    // variance on the lifetimes involved.
    let y: DoublePair<_> = make_cell(&b).get();
}