]> git.proxmox.com Git - rustc.git/blame - src/test/ui/stability-attribute/generics-default-stability.rs
New upstream version 1.61.0+dfsg1
[rustc.git] / src / test / ui / stability-attribute / generics-default-stability.rs
CommitLineData
1b1a35ee
XL
1// aux-build:unstable_generic_param.rs
2#![feature(unstable_default6)]
3
4extern crate unstable_generic_param;
5
6use unstable_generic_param::*;
7
8struct R;
9
10impl Trait1 for S {
11 fn foo() -> () { () } // ok
12}
13
14struct S;
15
1b1a35ee
XL
16impl Trait3<usize> for S {
17 fn foo() -> usize { 0 } // ok
18}
19
20fn 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);
ee023bcb 220 //~^ use of deprecated tuple variant `unstable_generic_param::Enum4::Some`: test [deprecated]
1b1a35ee
XL
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);
ee023bcb 226 //~^ use of deprecated tuple variant `unstable_generic_param::Enum4::Some`: test [deprecated]
1b1a35ee
XL
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'
ee023bcb 231 //~^ use of deprecated tuple variant `unstable_generic_param::Enum5::Some`: test [deprecated]
1b1a35ee
XL
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'
ee023bcb 238 //~^ use of deprecated tuple variant `unstable_generic_param::Enum5::Some`: test [deprecated]
1b1a35ee
XL
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}