Skip to content

Commit

Permalink
Add enum and type alias tests for generic default stability
Browse files Browse the repository at this point in the history
  • Loading branch information
Jacob Hughes committed Sep 23, 2020
1 parent 3f1b4b3 commit 98eab09
Show file tree
Hide file tree
Showing 3 changed files with 540 additions and 2 deletions.
106 changes: 106 additions & 0 deletions src/test/ui/stability-attribute/auxiliary/unstable_generic_param.rs
Original file line number Diff line number Diff line change
Expand Up @@ -75,6 +75,112 @@ pub const STRUCT4: Struct4 = Struct4 { field: 1 };
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const STRUCT5: Struct5 = Struct5 { field: 1 };

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum2<T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum3<T = isize, #[unstable(feature = "unstable_default", issue = "none")] E = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Ok(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Err(#[stable(feature = "stable_test_feature", since = "1.0.0")] E),
}

#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum4<T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}

#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum5<#[unstable(feature = "unstable_default", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub enum Enum6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> {
#[stable(feature = "stable_test_feature", since = "1.0.0")]
Some(#[stable(feature = "stable_test_feature", since = "1.0.0")] T),
#[stable(feature = "stable_test_feature", since = "1.0.0")]
None,
}

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM1: Enum1 = Enum1::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM2: Enum2 = Enum2::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM3: Enum3 = Enum3::Ok(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM3B: Enum3 = Enum3::Err(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM4: Enum4 = Enum4::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ENUM5: Enum5 = Enum5::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias1<#[unstable(feature = "unstable_default", issue = "none")] T = usize> = Option<T>;

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias2<T = usize> = Option<T>;

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias3<T = isize, #[unstable(feature = "unstable_default", issue = "none")] E = usize> =
Result<T, E>;

#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias4<T = usize> = Option<T>;

#[rustc_deprecated(since = "1.1.0", reason = "test")]
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias5<#[unstable(feature = "unstable_default", issue = "none")] T = usize> = Option<T>;

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub type Alias6<#[unstable(feature = "unstable_default6", issue = "none")] T = usize> = Option<T>;

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS1: Alias1 = Alias1::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS2: Alias2 = Alias2::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS3: Alias3 = Alias3::Ok(1);
#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS3B: Alias3 = Alias3::Err(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS4: Alias4 = Alias4::Some(1);

#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub const ALIAS5: Alias5 = Alias5::Some(1);


#[stable(feature = "stable_test_feature", since = "1.0.0")]
pub trait Alloc {}

Expand Down
144 changes: 144 additions & 0 deletions src/test/ui/stability-attribute/generics-default-stability.rs
Original file line number Diff line number Diff line change
Expand Up @@ -110,6 +110,150 @@ fn main() {
let _: Struct6<isize> = Struct6 { field: 1 }; // ok
let _: Struct6<isize> = Struct6 { field: 0 }; // ok

let _: Alias1<isize> = Alias1::Some(1); //~ ERROR use of unstable library feature 'unstable_default'

let _ = ALIAS1; // ok
let _: Alias1 = ALIAS1; // ok
let _: Alias1<usize> = ALIAS1; //~ ERROR use of unstable library feature 'unstable_default'
let _: Alias1<isize> = Alias1::Some(0); //~ ERROR use of unstable library feature 'unstable_default'

// Instability is not enforced for generic type parameters used in public fields.
// Note how the unstable type default `usize` leaks,
// and can be used without the 'unstable_default' feature.
let _ = Alias1::Some(1);
let _ = Alias1::Some(());
let _ = Alias1::Some(1isize);
let _: Alias1 = Alias1::Some(1);
let _: usize = ALIAS1.unwrap();
let _ = ALIAS1.unwrap() + 1;
let _ = ALIAS1.unwrap() + 1usize;

let _ = Alias2::Some(1); // ok
let _: Alias2 = Alias2::Some(1); // ok
let _: Alias2<usize> = Alias2::Some(1); // ok

let _ = ALIAS2;
let _: Alias2 = ALIAS2; // ok
let _: Alias2<usize> = ALIAS2; // ok
let _: Alias2<isize> = Alias2::Some(0); // ok
let _ = ALIAS2.unwrap(); // ok
let _: usize = ALIAS2.unwrap(); // ok
let _ = ALIAS2.unwrap() + 1; // ok
let _ = ALIAS2.unwrap() + 1usize; // ok

let _ = ALIAS3;
let _: Alias3 = ALIAS3; // ok
let _: Alias3<isize, usize> = ALIAS3; //~ ERROR use of unstable library feature 'unstable_default'
let _: Alias3<isize> = ALIAS3; // ok
let _: Alias3<isize, isize> = Alias3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
let _: Alias3<usize, usize> = Alias3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
let _ = ALIAS3.unwrap(); // ok
let _: isize = ALIAS3.unwrap(); // ok
let _ = ALIAS3.unwrap() + 1; // ok
// Note the aforementioned leak.
let _: usize = ALIAS3B.unwrap_err(); // ok
let _: Alias3<usize> = Alias3::Err(0); // ok
let _ = ALIAS3B.unwrap_err() + 1; // ok
let _ = ALIAS3B.unwrap_err() + 1usize; // ok

let _ = ALIAS4;
let _: Alias4<isize> = Alias4::Some(1);
//~^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _ = ALIAS4;
let _: Alias4 = ALIAS4; //~ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _: Alias4<usize> = ALIAS4; //~ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
let _: Alias4<isize> = Alias4::Some(0);
//~^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias4`: test [deprecated]

let _ = ALIAS5;
let _: Alias5<isize> = Alias5::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _ = ALIAS5;
let _: Alias5 = ALIAS5; //~ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _: Alias5<usize> = ALIAS5; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
let _: Alias5<isize> = Alias5::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]
//~^^ use of deprecated type alias `unstable_generic_param::Alias5`: test [deprecated]

let _: Alias6<isize> = Alias6::Some(1); // ok
let _: Alias6<isize> = Alias6::Some(0); // ok

let _: Enum1<isize> = Enum1::Some(1); //~ ERROR use of unstable library feature 'unstable_default'

let _ = ENUM1; // ok
let _: Enum1 = ENUM1; // ok
let _: Enum1<usize> = ENUM1; //~ ERROR use of unstable library feature 'unstable_default'
let _: Enum1<isize> = Enum1::Some(0); //~ ERROR use of unstable library feature 'unstable_default'

// Instability is not enforced for generic type parameters used in public fields.
// Note how the unstable type default `usize` leaks,
// and can be used without the 'unstable_default' feature.
let _ = Enum1::Some(1);
let _ = Enum1::Some(());
let _ = Enum1::Some(1isize);
let _: Enum1 = Enum1::Some(1);
if let Enum1::Some(x) = ENUM1 {let _: usize = x;}
if let Enum1::Some(x) = ENUM1 {let _ = x + 1;}
if let Enum1::Some(x) = ENUM1 {let _ = x + 1usize;}

let _ = Enum2::Some(1); // ok
let _: Enum2 = Enum2::Some(1); // ok
let _: Enum2<usize> = Enum2::Some(1); // ok

let _ = ENUM2;
let _: Enum2 = ENUM2; // ok
let _: Enum2<usize> = ENUM2; // ok
let _: Enum2<isize> = Enum2::Some(0); // ok
if let Enum2::Some(x) = ENUM2 {let _ = x;} // ok
if let Enum2::Some(x) = ENUM2 {let _: usize = x;} // ok
if let Enum2::Some(x) = ENUM2 {let _ = x + 1;} // ok
if let Enum2::Some(x) = ENUM2 {let _ = x + 1usize;} // ok

let _ = ENUM3;
let _: Enum3 = ENUM3; // ok
let _: Enum3<isize, usize> = ENUM3; //~ ERROR use of unstable library feature 'unstable_default'
let _: Enum3<isize> = ENUM3; // ok
let _: Enum3<isize, isize> = Enum3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
let _: Enum3<usize, usize> = Enum3::Ok(0); //~ ERROR use of unstable library feature 'unstable_default'
if let Enum3::Ok(x) = ENUM3 {let _ = x;} // ok
if let Enum3::Ok(x) = ENUM3 {let _: isize = x;} // ok
if let Enum3::Ok(x) = ENUM3 {let _ = x + 1;} // ok
// Note the aforementioned leak.
if let Enum3::Err(x) = ENUM3B {let _: usize = x;} // ok
let _: Enum3<usize> = Enum3::Err(0); // ok
if let Enum3::Err(x) = ENUM3B {let _ = x + 1;} // ok
if let Enum3::Err(x) = ENUM3B {let _ = x + 1usize;} // ok

let _ = ENUM4;
let _: Enum4<isize> = Enum4::Some(1);
//~^ use of deprecated variant `unstable_generic_param::Enum4::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _ = ENUM4;
let _: Enum4 = ENUM4; //~ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _: Enum4<usize> = ENUM4; //~ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]
let _: Enum4<isize> = Enum4::Some(0);
//~^ use of deprecated variant `unstable_generic_param::Enum4::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum4`: test [deprecated]

let _ = ENUM5;
let _: Enum5<isize> = Enum5::Some(1); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated variant `unstable_generic_param::Enum5::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _ = ENUM5;
let _: Enum5 = ENUM5; //~ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _: Enum5<usize> = ENUM5; //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]
let _: Enum5<isize> = Enum5::Some(0); //~ ERROR use of unstable library feature 'unstable_default'
//~^ use of deprecated variant `unstable_generic_param::Enum5::Some`: test [deprecated]
//~^^ use of deprecated enum `unstable_generic_param::Enum5`: test [deprecated]

let _: Enum6<isize> = Enum6::Some(1); // ok
let _: Enum6<isize> = Enum6::Some(0); // ok

let _: Box1<isize, System> = Box1::new(1); //~ ERROR use of unstable library feature 'box_alloc_param'
let _: Box1<isize> = Box1::new(1); // ok

Expand Down
Loading

0 comments on commit 98eab09

Please sign in to comment.