about summary refs log tree commit diff
path: root/tests/ui/privacy/generic_struct_field_projection.rs
blob: c5bb1233c27b9d2fe4df797450505e8ddde5dc06 (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
26
27
28
29
30
31
32
33
34
35
36
37
38
//! To determine all the types that need to be private when looking at `Struct`, we
//! used to invoke `predicates_of` to also look at types in `where` bounds.
//! Unfortunately this also computes the inferred outlives bounds, which means for
//! every field we check that if it is of type `&'a T` then `T: 'a` and if it is of
//! struct type, we check that the struct satisfies its lifetime parameters by looking
//! at its inferred outlives bounds. This means we end up with a `<Foo as Trait>::Assoc: 'a`
//! in the outlives bounds of `Struct`. While this is trivially provable, privacy
//! only sees `Foo` and `Trait` and determines that `Foo` is private and then errors.
//! So now we invoke `explicit_predicates_of` to make sure we only care about user-written
//! predicates.

//@ check-pass

mod baz {
    struct Foo;

    pub trait Trait {
        type Assoc;
    }

    impl Trait for Foo {
        type Assoc = ();
    }

    pub struct Bar<'a, T: Trait> {
        source: &'a T::Assoc,
    }

    pub struct Baz<'a> {
        mode: Bar<'a, Foo>,
    }
}

pub struct Struct<'a> {
    lexer: baz::Baz<'a>,
}

fn main() {}