]> git.lizzy.rs Git - rust.git/blob - tests/ui/stability-attribute/generics-default-stability.rs
Rollup merge of #107091 - clubby789:infer-ftl-missing-dollar, r=compiler-errors
[rust.git] / tests / ui / stability-attribute / generics-default-stability.rs
1 // aux-build:unstable_generic_param.rs
2 #![feature(unstable_default6)]
3
4 extern crate unstable_generic_param;
5
6 use unstable_generic_param::*;
7
8 struct R;
9
10 impl Trait1 for S {
11     fn foo() -> () { () } // ok
12 }
13
14 struct S;
15
16 impl Trait3<usize> for S {
17     fn foo() -> usize { 0 } // ok
18 }
19
20 fn main() {
21     let _ = S;
22
23     let _: Struct1<isize> = Struct1 { field: 1 }; //~ ERROR use of unstable library feature 'unstable_default'
24
25     let _ = STRUCT1; // ok
26     let _: Struct1 = STRUCT1; // ok
27     let _: Struct1<usize> = STRUCT1; //~ ERROR use of unstable library feature 'unstable_default'
28     let _: Struct1<isize> = Struct1 { field: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
29
30     // Instability is not enforced for generic type parameters used in public fields.
31     // Note how the unstable type default `usize` leaks,
32     // and can be used without the 'unstable_default' feature.
33     let _ = STRUCT1.field;
34     let _ = Struct1 { field: 1 };
35     let _ = Struct1 { field: () };
36     let _ = Struct1 { field: 1isize };
37     let _: Struct1 = Struct1 { field: 1 };
38     let _: usize = STRUCT1.field;
39     let _ = STRUCT1.field + 1;
40     let _ = STRUCT1.field + 1usize;
41
42     let _ = Struct2 { field: 1 }; // ok
43     let _: Struct2 = Struct2 { field: 1 }; // ok
44     let _: Struct2<usize> = Struct2 { field: 1 }; // ok
45
46     let _ = STRUCT2;
47     let _: Struct2 = STRUCT2; // ok
48     let _: Struct2<usize> = STRUCT2; // ok
49     let _: Struct2<isize> = Struct2 { field: 0 }; // ok
50     let _ = STRUCT2.field; // ok
51     let _: usize = STRUCT2.field; // ok
52     let _ = STRUCT2.field + 1; // ok
53     let _ = STRUCT2.field + 1usize; // ok
54
55     let _ = STRUCT3;
56     let _: Struct3 = STRUCT3; // ok
57     let _: Struct3<isize, usize> = STRUCT3; //~ ERROR use of unstable library feature 'unstable_default'
58     let _: Struct3<isize> = STRUCT3; // ok
59     let _: Struct3<isize, isize> = Struct3 { field1: 0, field2: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
60     let _: Struct3<usize, usize> = Struct3 { field1: 0, field2: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
61     let _ = STRUCT3.field1; // ok
62     let _: isize = STRUCT3.field1; // ok
63     let _ = STRUCT3.field1 + 1; // ok
64     // Note the aforementioned leak.
65     let _: usize = STRUCT3.field2; // ok
66     let _: Struct3<usize> = Struct3 { field1: 0, field2: 0 }; // ok
67     let _ = STRUCT3.field2 + 1; // ok
68     let _ = STRUCT3.field2 + 1usize; // ok
69
70     let _ = STRUCT4;
71     let _: Struct4<isize> = Struct4 { field: 1 };
72     //~^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
73     //~^^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
74     //~^^^ use of deprecated field `unstable_generic_param::Struct4::field`: test [deprecated]
75     let _ = STRUCT4;
76     let _: Struct4 = STRUCT4; //~ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
77     let _: Struct4<usize> = STRUCT4; //~ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
78     let _: Struct4<isize> = Struct4 { field: 0 };
79     //~^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
80     //~^^ use of deprecated struct `unstable_generic_param::Struct4`: test [deprecated]
81     //~^^^ use of deprecated field `unstable_generic_param::Struct4::field`: test [deprecated]
82
83     let _ = STRUCT5;
84     let _: Struct5<isize> = Struct5 { field: 1 }; //~ ERROR use of unstable library feature 'unstable_default'
85     //~^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
86     //~^^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
87     //~^^^ use of deprecated field `unstable_generic_param::Struct5::field`: test [deprecated]
88     let _ = STRUCT5;
89     let _: Struct5 = STRUCT5; //~ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
90     let _: Struct5<usize> = STRUCT5; //~ ERROR use of unstable library feature 'unstable_default'
91     //~^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
92     let _: Struct5<isize> = Struct5 { field: 0 }; //~ ERROR use of unstable library feature 'unstable_default'
93     //~^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
94     //~^^ use of deprecated struct `unstable_generic_param::Struct5`: test [deprecated]
95     //~^^^ use of deprecated field `unstable_generic_param::Struct5::field`: test [deprecated]
96
97     let _: Struct6<isize> = Struct6 { field: 1 }; // ok
98     let _: Struct6<isize> = Struct6 { field: 0 }; // ok
99
100     let _: Alias1<isize> = Alias1::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
101
102     let _ = ALIAS1; // ok
103     let _: Alias1 = ALIAS1; // ok
104     let _: Alias1<usize> = ALIAS1; //~ ERROR use of unstable library feature 'unstable_default'
105     let _: Alias1<isize> = Alias1::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
106
107     // Instability is not enforced for generic type parameters used in public fields.
108     // Note how the unstable type default `usize` leaks,
109     // and can be used without the 'unstable_default' feature.
110     let _ = Alias1::Some(1);
111     let _ = Alias1::Some(());
112     let _ = Alias1::Some(1isize);
113     let _: Alias1 = Alias1::Some(1);
114     let _: usize = ALIAS1.unwrap();
115     let _ = ALIAS1.unwrap() + 1;
116     let _ = ALIAS1.unwrap() + 1usize;
117
118     let _ = Alias2::Some(1); // ok
119     let _: Alias2 = Alias2::Some(1); // ok
120     let _: Alias2<usize> = Alias2::Some(1); // ok
121
122     let _ = ALIAS2;
123     let _: Alias2 = ALIAS2; // ok
124     let _: Alias2<usize> = ALIAS2; // ok
125     let _: Alias2<isize> = Alias2::Some(0); // ok
126     let _ = ALIAS2.unwrap(); // ok
127     let _: usize = ALIAS2.unwrap(); // ok
128     let _ = ALIAS2.unwrap() + 1; // ok
129     let _ = ALIAS2.unwrap() + 1usize; // ok
130
131     let _ = ALIAS3;
132     let _: Alias3 = ALIAS3; // ok
133     let _: Alias3<isize, usize> = ALIAS3; //~ ERROR use of unstable library feature 'unstable_default'
134     let _: Alias3<isize> = ALIAS3; // ok
135     let _: Alias3<isize, isize> = Alias3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
136     let _: Alias3<usize, usize> = Alias3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
137     let _ = ALIAS3.unwrap(); // ok
138     let _: isize = ALIAS3.unwrap(); // ok
139     let _ = ALIAS3.unwrap() + 1; // ok
140     // Note the aforementioned leak.
141     let _: usize = ALIAS3B.unwrap_err(); // ok
142     let _: Alias3<usize> = Alias3::Err(0); // ok
143     let _ = ALIAS3B.unwrap_err() + 1; // ok
144     let _ = ALIAS3B.unwrap_err() + 1usize; // ok
145
146     let _ = ALIAS4;
147     let _: Alias4<isize> = Alias4::Some(1);
148     //~^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
149     //~^^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
150     let _ = ALIAS4;
151     let _: Alias4 = ALIAS4; //~ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
152     let _: Alias4<usize> = ALIAS4; //~ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
153     let _: Alias4<isize> = Alias4::Some(0);
154     //~^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
155     //~^^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
156
157     let _ = ALIAS5;
158     let _: Alias5<isize> = Alias5::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
159     //~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
160     //~^^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
161     let _ = ALIAS5;
162     let _: Alias5 = ALIAS5; //~ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
163     let _: Alias5<usize> = ALIAS5; //~ ERROR use of unstable library feature 'unstable_default'
164     //~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
165     let _: Alias5<isize> = Alias5::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
166     //~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
167     //~^^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
168
169     let _: Alias6<isize> = Alias6::Some(1); // ok
170     let _: Alias6<isize> = Alias6::Some(0); // ok
171
172     let _: Enum1<isize> = Enum1::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
173
174     let _ = ENUM1; // ok
175     let _: Enum1 = ENUM1; // ok
176     let _: Enum1<usize> = ENUM1; //~ ERROR use of unstable library feature 'unstable_default'
177     let _: Enum1<isize> = Enum1::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
178
179     // Instability is not enforced for generic type parameters used in public fields.
180     // Note how the unstable type default `usize` leaks,
181     // and can be used without the 'unstable_default' feature.
182     let _ = Enum1::Some(1);
183     let _ = Enum1::Some(());
184     let _ = Enum1::Some(1isize);
185     let _: Enum1 = Enum1::Some(1);
186     if let Enum1::Some(x) = ENUM1 {let _: usize = x;}
187     if let Enum1::Some(x) = ENUM1 {let _ = x + 1;}
188     if let Enum1::Some(x) = ENUM1 {let _ = x + 1usize;}
189
190     let _ = Enum2::Some(1); // ok
191     let _: Enum2 = Enum2::Some(1); // ok
192     let _: Enum2<usize> = Enum2::Some(1); // ok
193
194     let _ = ENUM2;
195     let _: Enum2 = ENUM2; // ok
196     let _: Enum2<usize> = ENUM2; // ok
197     let _: Enum2<isize> = Enum2::Some(0); // ok
198     if let Enum2::Some(x) = ENUM2 {let _ = x;} // ok
199     if let Enum2::Some(x) = ENUM2 {let _: usize = x;} // ok
200     if let Enum2::Some(x) = ENUM2 {let _ = x + 1;} // ok
201     if let Enum2::Some(x) = ENUM2 {let _ = x + 1usize;} // ok
202
203     let _ = ENUM3;
204     let _: Enum3 = ENUM3; // ok
205     let _: Enum3<isize, usize> = ENUM3; //~ ERROR use of unstable library feature 'unstable_default'
206     let _: Enum3<isize> = ENUM3; // ok
207     let _: Enum3<isize, isize> = Enum3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
208     let _: Enum3<usize, usize> = Enum3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
209     if let Enum3::Ok(x) = ENUM3 {let _ = x;} // ok
210     if let Enum3::Ok(x) = ENUM3 {let _: isize = x;} // ok
211     if let Enum3::Ok(x) = ENUM3 {let _ = x + 1;} // ok
212     // Note the aforementioned leak.
213     if let Enum3::Err(x) = ENUM3B {let _: usize = x;} // ok
214     let _: Enum3<usize> = Enum3::Err(0); // ok
215     if let Enum3::Err(x) = ENUM3B {let _ = x + 1;} // ok
216     if let Enum3::Err(x) = ENUM3B {let _ = x + 1usize;} // ok
217
218     let _ = ENUM4;
219     let _: Enum4<isize> = Enum4::Some(1);
220     //~^ use of deprecated tuple variant `unstable_generic_param::Enum4::Some`: test [deprecated]
221     //~^^ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
222     let _ = ENUM4;
223     let _: Enum4 = ENUM4; //~ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
224     let _: Enum4<usize> = ENUM4; //~ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
225     let _: Enum4<isize> = Enum4::Some(0);
226     //~^ use of deprecated tuple variant `unstable_generic_param::Enum4::Some`: test [deprecated]
227     //~^^ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
228
229     let _ = ENUM5;
230     let _: Enum5<isize> = Enum5::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
231     //~^ use of deprecated tuple variant `unstable_generic_param::Enum5::Some`: test [deprecated]
232     //~^^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
233     let _ = ENUM5;
234     let _: Enum5 = ENUM5; //~ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
235     let _: Enum5<usize> = ENUM5; //~ ERROR use of unstable library feature 'unstable_default'
236     //~^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
237     let _: Enum5<isize> = Enum5::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
238     //~^ use of deprecated tuple variant `unstable_generic_param::Enum5::Some`: test [deprecated]
239     //~^^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
240
241     let _: Enum6<isize> = Enum6::Some(1); // ok
242     let _: Enum6<isize> = Enum6::Some(0); // ok
243
244     let _: Box1<isize, System> = Box1::new(1); //~ ERROR use of unstable library feature 'box_alloc_param'
245     let _: Box1<isize> = Box1::new(1); // ok
246
247     let _: Box2<isize, System> = Box2::new(1); // ok
248     let _: Box2<isize> = Box2::new(1); // ok
249
250     let _: Box3<isize> = Box3::new(1); // ok
251 }