about summary refs log tree commit diff
path: root/tests/ui/impl-trait/lazy_subtyping_of_opaques.rs
blob: 8fd1f35645a8a8bc4db96665c3d58b380e0b3f48 (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
//! This test checks that we allow subtyping predicates that contain opaque types.
//! No hidden types are being constrained in the subtyping predicate, but type and
//! lifetime variables get subtyped in the generic parameter list of the opaque.

//@ check-pass

fn foo() -> impl Default + Copy {
    if false {
        let x = Default::default();
        // add `Subtype(?x, ?y)` obligation
        let y = x;

        // Make a tuple `(?x, ?y)` and equate it with `(impl Default, u32)`.
        // For us to try and prove a `Subtype(impl Default, u32)` obligation,
        // we have to instantiate both `?x` and `?y` without any
        // `select_where_possible` calls inbetween.
        let mut tup = &mut (x, y);
        let assign_tup = &mut (foo(), 1u32);
        tup = assign_tup;
    }
    1u32
}

fn main() {}