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