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