]> git.lizzy.rs Git - rust.git/blob - tests/ui/unsized/unsized2.rs
Move /src/test to /tests
[rust.git] / tests / ui / unsized / unsized2.rs
1 // run-pass
2
3 #![allow(unconditional_recursion)]
4 #![allow(dead_code)]
5 #![allow(unused_variables)]
6 #![allow(unused_imports)]
7
8 // Test sized-ness checking in substitution.
9
10 use std::marker;
11
12 // Unbounded.
13 fn f1<X: ?Sized>(x: &X) {
14     f1::<X>(x);
15 }
16 fn f2<X>(x: &X) {
17     f1::<X>(x);
18     f2::<X>(x);
19 }
20
21 // Bounded.
22 trait T { fn dummy(&self) { } }
23 fn f3<X: T+?Sized>(x: &X) {
24     f3::<X>(x);
25 }
26 fn f4<X: T>(x: &X) {
27     f3::<X>(x);
28     f4::<X>(x);
29 }
30
31 // Self type.
32 trait T2 {
33     fn f() -> Box<Self>;
34 }
35 struct S;
36 impl T2 for S {
37     fn f() -> Box<S> {
38         Box::new(S)
39     }
40 }
41 fn f5<X: ?Sized+T2>(x: &X) {
42     let _: Box<X> = T2::f();
43 }
44 fn f6<X: T2>(x: &X) {
45     let _: Box<X> = T2::f();
46 }
47
48 trait T3 {
49     fn f() -> Box<Self>;
50 }
51 impl T3 for S {
52     fn f() -> Box<S> {
53         Box::new(S)
54     }
55 }
56 fn f7<X: ?Sized+T3>(x: &X) {
57     // This is valid, but the unsized bound on X is irrelevant because any type
58     // which implements T3 must have statically known size.
59     let _: Box<X> = T3::f();
60 }
61
62 trait T4<X> {
63     fn dummy(&self) { }
64     fn m1(&self, x: &dyn T4<X>, y: X);
65     fn m2(&self, x: &dyn T5<X>, y: X);
66 }
67 trait T5<X: ?Sized> {
68     fn dummy(&self) { }
69     // not an error (for now)
70     fn m1(&self, x: &dyn T4<X>);
71     fn m2(&self, x: &dyn T5<X>);
72 }
73
74 trait T6<X: T> {
75     fn dummy(&self) { }
76     fn m1(&self, x: &dyn T4<X>);
77     fn m2(&self, x: &dyn T5<X>);
78 }
79 trait T7<X: ?Sized+T> {
80     fn dummy(&self) { }
81     // not an error (for now)
82     fn m1(&self, x: &dyn T4<X>);
83     fn m2(&self, x: &dyn T5<X>);
84 }
85
86 // The last field in a struct may be unsized
87 struct S2<X: ?Sized> {
88     f: X,
89 }
90 struct S3<X: ?Sized> {
91     f1: isize,
92     f2: X,
93 }
94
95 pub fn main() {
96 }