Skip to content

Commit 98eab09

Browse files
author
Jacob Hughes
committed
Add enum and type alias tests for generic default stability
1 parent 3f1b4b3 commit 98eab09

File tree

3 files changed

+540
-2
lines changed

3 files changed

+540
-2
lines changed

src/test/ui/stability-attribute/auxiliary/unstable_generic_param.rs

+106
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,112 @@ pub const STRUCT4: Struct4 = Struct4 { field: 1 };
7575
#[stable(feature = "stable_test_feature", since = "1.0.0")]
7676
pub const STRUCT5: Struct5 = Struct5 { field: 1 };
7777

78+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
79+
pub enum Enum1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
80+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
81+
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
82+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
83+
None,
84+
}
85+
86+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
87+
pub enum Enum2<T = usize> {
88+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
89+
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
90+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
91+
None,
92+
}
93+
94+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
95+
pub enum Enum3<T = isize, #[unstable(feature = "unstable_default", issue = "none")] E = usize> {
96+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
97+
Ok(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
98+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
99+
Err(#[stable(feature = "stable_test_feature", since = "1.0.0")] E),
100+
}
101+
102+
#[rustc_deprecated(since = "1.1.0", reason = "test")]
103+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
104+
pub enum Enum4<T = usize> {
105+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
106+
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
107+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
108+
None,
109+
}
110+
111+
#[rustc_deprecated(since = "1.1.0", reason = "test")]
112+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
113+
pub enum Enum5<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
114+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
115+
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
116+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
117+
None,
118+
}
119+
120+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
121+
pub enum Enum6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> {
122+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
123+
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
124+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
125+
None,
126+
}
127+
128+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
129+
pub const ENUM1: Enum1 = Enum1::Some(1);
130+
131+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
132+
pub const ENUM2: Enum2 = Enum2::Some(1);
133+
134+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
135+
pub const ENUM3: Enum3 = Enum3::Ok(1);
136+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
137+
pub const ENUM3B: Enum3 = Enum3::Err(1);
138+
139+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
140+
pub const ENUM4: Enum4 = Enum4::Some(1);
141+
142+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
143+
pub const ENUM5: Enum5 = Enum5::Some(1);
144+
145+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
146+
pub type Alias1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> = Option<T>;
147+
148+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
149+
pub type Alias2<T = usize> = Option<T>;
150+
151+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
152+
pub type Alias3<T = isize, #[unstable(feature = "unstable_default", issue = "none")] E = usize> =
153+
Result<T, E>;
154+
155+
#[rustc_deprecated(since = "1.1.0", reason = "test")]
156+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
157+
pub type Alias4<T = usize> = Option<T>;
158+
159+
#[rustc_deprecated(since = "1.1.0", reason = "test")]
160+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
161+
pub type Alias5<#[unstable(feature = "unstable_default", issue = "none")] T = usize> = Option<T>;
162+
163+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
164+
pub type Alias6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> = Option<T>;
165+
166+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
167+
pub const ALIAS1: Alias1 = Alias1::Some(1);
168+
169+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
170+
pub const ALIAS2: Alias2 = Alias2::Some(1);
171+
172+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
173+
pub const ALIAS3: Alias3 = Alias3::Ok(1);
174+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
175+
pub const ALIAS3B: Alias3 = Alias3::Err(1);
176+
177+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
178+
pub const ALIAS4: Alias4 = Alias4::Some(1);
179+
180+
#[stable(feature = "stable_test_feature", since = "1.0.0")]
181+
pub const ALIAS5: Alias5 = Alias5::Some(1);
182+
183+
78184
#[stable(feature = "stable_test_feature", since = "1.0.0")]
79185
pub trait Alloc {}
80186

src/test/ui/stability-attribute/generics-default-stability.rs

+144
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,150 @@ fn main() {
110110
let _: Struct6<isize> = Struct6 { field: 1 }; // ok
111111
let _: Struct6<isize> = Struct6 { field: 0 }; // ok
112112

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+
113257
let _: Box1<isize, System> = Box1::new(1); //~ ERROR use of unstable library feature 'box_alloc_param'
114258
let _: Box1<isize> = Box1::new(1); // ok
115259

0 commit comments

Comments
 (0)