summaryrefslogtreecommitdiffstats
path: root/tests/rustdoc/inline_cross/auxiliary/dyn_trait.rs
blob: df88530071be76c23de19ad049a1a8e6313a3b55 (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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
// ignore-tidy-linelength

pub type Ty0 = dyn for<'any> FnOnce(&'any str) -> bool;

pub type Ty1<'obj> = dyn std::fmt::Display + 'obj;

pub type Ty2 = dyn for<'a, 'r> Container<'r, Item<'a, 'static> = ()>;

pub type Ty3<'s> = &'s dyn ToString;

pub trait Container<'r> {
    type Item<'a, 'ctx>;
}

// Trait-object types inside of a container type that has lifetime bounds ("wrapped").

pub fn late_bound_wrapped_elided(_: &(dyn Fn() + '_)) {}
pub fn late_bound_wrapped_late0<'f>(_: &mut (dyn Fn() + 'f)) {}
pub fn late_bound_wrapped_defaulted0<'f>(_: &'f mut dyn Fn()) {}
pub type EarlyBoundWrappedDefaulted0<'x> = std::cell::Ref<'x, dyn Trait>;
pub type EarlyBoundWrappedDefaulted1<'x> = &'x dyn Trait;
pub type EarlyBoundWrappedEarly<'x, 'y> = std::cell::Ref<'x, dyn Trait + 'y>;
pub type EarlyBoundWrappedStatic<'x> = std::cell::Ref<'x, dyn Trait + 'static>;
pub fn late_bound_wrapped_defaulted1<'l>(_: std::cell::Ref<'l, dyn Trait>) {}
pub fn late_bound_wrapped_late1<'l, 'm>(_: std::cell::Ref<'l, dyn Trait + 'm>) {}
pub fn late_bound_wrapped_early<'e, 'l>(_: std::cell::Ref<'l, dyn Trait + 'e>) where 'e: {} // `'e` is early-bound
pub fn elided_bound_wrapped_defaulted(_: std::cell::Ref<'_, dyn Trait>) {}
pub type StaticBoundWrappedDefaulted0 = std::cell::Ref<'static, dyn Trait>;
pub type StaticBoundWrappedDefaulted1 = &'static dyn Trait;
pub type AmbiguousBoundWrappedEarly0<'r, 's> = AmbiguousBoundWrapper<'s, 'r, dyn Trait + 's>;
pub type AmbiguousBoundWrappedEarly1<'r, 's> = AmbiguousBoundWrapper<'s, 'r, dyn Trait + 'r>;
pub type AmbiguousBoundWrappedStatic<'q> = AmbiguousBoundWrapper<'q, 'q, dyn Trait + 'static>;

// Trait-object types inside of a container type that doesn't have lifetime bounds ("wrapped").

pub type NoBoundsWrappedDefaulted = Box<dyn Trait>;
pub type NoBoundsWrappedEarly<'e> = Box<dyn Trait + 'e>;
pub fn no_bounds_wrapped_late<'l>(_: Box<dyn Trait + 'l>) {}
pub fn no_bounds_wrapped_elided(_: Box<dyn Trait + '_>) {}

// Trait-object types outside of a container (“bare”).

pub type BareNoBoundsDefaulted = dyn Trait;
pub type BareNoBoundsEarly<'p> = dyn Trait + 'p;
pub type BareEarlyBoundDefaulted0<'u> = dyn EarlyBoundTrait0<'u>;
pub type BareEarlyBoundDefaulted1 = dyn for<'any> EarlyBoundTrait0<'any>;
pub type BareEarlyBoundDefaulted2<'w> = dyn EarlyBoundTrait1<'static, 'w>;
pub type BareEarlyBoundEarly<'i, 'j> = dyn EarlyBoundTrait0<'i> + 'j;
pub type BareEarlyBoundStatic<'i> = dyn EarlyBoundTrait0<'i> + 'static;
pub type BareStaticBoundDefaulted = dyn StaticBoundTrait;
pub type BareHigherRankedBoundDefaulted0 = dyn HigherRankedBoundTrait0;
pub type BareHigherRankedBoundDefaulted1<'r> = dyn HigherRankedBoundTrait1<'r>;
pub type BareAmbiguousBoundEarly0<'m, 'n> = dyn AmbiguousBoundTrait<'m, 'n> + 'm;
pub type BareAmbiguousBoundEarly1<'m, 'n> = dyn AmbiguousBoundTrait<'m, 'n> + 'n;
pub type BareAmbiguousBoundStatic<'o> = dyn AmbiguousBoundTrait<'o, 'o> + 'static;

// Trait and container definitions.

pub trait Trait {} // no bounds
pub trait EarlyBoundTrait0<'b>: 'b {}
pub trait EarlyBoundTrait1<'unused, 'c>: 'c {}
pub trait StaticBoundTrait: 'static {}
pub trait HigherRankedBoundTrait0 where for<'a> Self: 'a {}
pub trait HigherRankedBoundTrait1<'e> where for<'l> Self: 'e + 'l {}
pub trait AmbiguousBoundTrait<'a, 'b>: 'a + 'b {}

pub struct AmbiguousBoundWrapper<'a, 'b, T: ?Sized + 'a + 'b>(&'a T, &'b T);

// Trait objects inside of another trait object, a trait bound or an associated type.

pub trait Inner {}
pub trait Outer<T: ?Sized> {}
pub trait Base {
    type Type<T: ?Sized>;
}
impl Base for () {
    type Type<T: ?Sized> = ();
}

pub type NestedTraitObjects = dyn Outer<dyn Inner>;

pub fn apit_rpit(o: impl Outer<dyn Inner>) -> impl Outer<dyn Inner> {
    o
}

pub type AssocTy = <() as Base>::Type<dyn Inner>;