diff options
| author | John Wrenn <john_wrenn@brown.edu> | 2019-05-09 17:08:55 -0400 |
|---|---|---|
| committer | John Wrenn <john_wrenn@brown.edu> | 2019-06-21 11:00:10 -0400 |
| commit | ac98342e846e79985f0c4969a2d546dee24a70d1 (patch) | |
| tree | 8c2ff20debabdd8f9c9f7476f1b2d3868192f6cd /src/test | |
| parent | 38cd9489f75f4a4387296ee304e2287f7c32c211 (diff) | |
| download | rust-ac98342e846e79985f0c4969a2d546dee24a70d1.tar.gz rust-ac98342e846e79985f0c4969a2d546dee24a70d1.zip | |
Implement arbitrary_enum_discriminant
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.rs | 9 | ||||
| -rw-r--r-- | src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.stderr | 14 | ||||
| -rw-r--r-- | src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs | 56 | ||||
| -rw-r--r-- | src/test/ui/enum-discriminant/discriminant_value-wrapper.rs (renamed from src/test/run-pass/discriminant_value-wrapper.rs) | 1 | ||||
| -rw-r--r-- | src/test/ui/enum-discriminant/discriminant_value.rs (renamed from src/test/run-pass/discriminant_value.rs) | 18 | ||||
| -rw-r--r-- | src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.rs | 10 | ||||
| -rw-r--r-- | src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.stderr | 36 | ||||
| -rw-r--r-- | src/test/ui/parser/issue-17383.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/parser/issue-17383.stderr | 10 | ||||
| -rw-r--r-- | src/test/ui/parser/tag-variant-disr-non-nullary.rs | 2 | ||||
| -rw-r--r-- | src/test/ui/parser/tag-variant-disr-non-nullary.stderr | 20 |
11 files changed, 164 insertions, 14 deletions
diff --git a/src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.rs b/src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.rs new file mode 100644 index 00000000000..4da7b5ab24b --- /dev/null +++ b/src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.rs @@ -0,0 +1,9 @@ +#![crate_type="lib"] +#![feature(arbitrary_enum_discriminant)] + +enum Enum { +//~^ ERROR `#[repr(inttype)]` must be specified + Unit = 1, + Tuple() = 2, + Struct{} = 3, +} diff --git a/src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.stderr b/src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.stderr new file mode 100644 index 00000000000..2db5372da0c --- /dev/null +++ b/src/test/ui/enum-discriminant/arbitrary_enum_discriminant-no-repr.stderr @@ -0,0 +1,14 @@ +error[E0732]: `#[repr(inttype)]` must be specified + --> $DIR/arbitrary_enum_discriminant-no-repr.rs:4:1 + | +LL | / enum Enum { +LL | | +LL | | Unit = 1, +LL | | Tuple() = 2, +LL | | Struct{} = 3, +LL | | } + | |_^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0732`. diff --git a/src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs b/src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs new file mode 100644 index 00000000000..f2270602d87 --- /dev/null +++ b/src/test/ui/enum-discriminant/arbitrary_enum_discriminant.rs @@ -0,0 +1,56 @@ +// run-pass +#![feature(arbitrary_enum_discriminant, const_raw_ptr_deref, test)] + +extern crate test; + +use test::black_box; + +#[allow(dead_code)] +#[repr(u8)] +enum Enum { + Unit = 3, + Tuple(u16) = 2, + Struct { + a: u8, + b: u16, + } = 1, +} + +impl Enum { + const unsafe fn tag(&self) -> u8 { + *(self as *const Self as *const u8) + } +} + +#[allow(dead_code)] +#[repr(u8)] +enum FieldlessEnum { + Unit = 3, + Tuple() = 2, + Struct {} = 1, +} + +fn main() { + const UNIT: Enum = Enum::Unit; + const TUPLE: Enum = Enum::Tuple(5); + const STRUCT: Enum = Enum::Struct{a: 7, b: 11}; + + // Ensure discriminants are correct during runtime execution + assert_eq!(3, unsafe { black_box(UNIT).tag() }); + assert_eq!(2, unsafe { black_box(TUPLE).tag() }); + assert_eq!(1, unsafe { black_box(STRUCT).tag() }); + + // Ensure discriminants are correct during CTFE + const UNIT_TAG: u8 = unsafe { UNIT.tag() }; + const TUPLE_TAG: u8 = unsafe { TUPLE.tag() }; + const STRUCT_TAG: u8 = unsafe { STRUCT.tag() }; + + assert_eq!(3, UNIT_TAG); + assert_eq!(2, TUPLE_TAG); + assert_eq!(1, STRUCT_TAG); + + // Ensure `as` conversions are correct + assert_eq!(3, FieldlessEnum::Unit as u8); + assert_eq!(2, FieldlessEnum::Tuple() as u8); + assert_eq!(1, FieldlessEnum::Struct{} as u8); +} diff --git a/src/test/run-pass/discriminant_value-wrapper.rs b/src/test/ui/enum-discriminant/discriminant_value-wrapper.rs index 1fb0d1edddf..daef2de87a9 100644 --- a/src/test/run-pass/discriminant_value-wrapper.rs +++ b/src/test/ui/enum-discriminant/discriminant_value-wrapper.rs @@ -1,3 +1,4 @@ +// run-pass use std::mem; enum ADT { diff --git a/src/test/run-pass/discriminant_value.rs b/src/test/ui/enum-discriminant/discriminant_value.rs index 162ab27cdff..b7000015c71 100644 --- a/src/test/run-pass/discriminant_value.rs +++ b/src/test/ui/enum-discriminant/discriminant_value.rs @@ -1,5 +1,6 @@ +// run-pass #![allow(stable_features)] -#![feature(core, core_intrinsics)] +#![feature(arbitrary_enum_discriminant, core, core_intrinsics)] extern crate core; use core::intrinsics::discriminant_value; @@ -38,6 +39,17 @@ enum NullablePointer { static CONST : u32 = 0xBEEF; +#[allow(dead_code)] +#[repr(isize)] +enum Mixed { + Unit = 3, + Tuple(u16) = 2, + Struct { + a: u8, + b: u16, + } = 1, +} + pub fn main() { unsafe { @@ -64,5 +76,9 @@ pub fn main() { assert_eq!(discriminant_value(&10), 0); assert_eq!(discriminant_value(&"test"), 0); + + assert_eq!(3, discriminant_value(&Mixed::Unit)); + assert_eq!(2, discriminant_value(&Mixed::Tuple(5))); + assert_eq!(1, discriminant_value(&Mixed::Struct{a: 7, b: 11})); } } diff --git a/src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.rs b/src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.rs new file mode 100644 index 00000000000..3e90af4d36a --- /dev/null +++ b/src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.rs @@ -0,0 +1,10 @@ +#![crate_type="lib"] + +enum Enum { + Unit = 1, + //~^ ERROR custom discriminant values are not allowed in enums with tuple or struct variants + Tuple() = 2, + //~^ ERROR discriminants on non-unit variants are experimental + Struct{} = 3, + //~^ ERROR discriminants on non-unit variants are experimental +} diff --git a/src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.stderr b/src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.stderr new file mode 100644 index 00000000000..f50ed2c184d --- /dev/null +++ b/src/test/ui/enum-discriminant/feature-gate-arbitrary_enum_discriminant.stderr @@ -0,0 +1,36 @@ +error[E0658]: discriminants on non-unit variants are experimental + --> $DIR/feature-gate-arbitrary_enum_discriminant.rs:6:13 + | +LL | Tuple() = 2, + | ^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/60553 + = help: add #![feature(arbitrary_enum_discriminant)] to the crate attributes to enable + +error[E0658]: discriminants on non-unit variants are experimental + --> $DIR/feature-gate-arbitrary_enum_discriminant.rs:8:14 + | +LL | Struct{} = 3, + | ^ + | + = note: for more information, see https://github.com/rust-lang/rust/issues/60553 + = help: add #![feature(arbitrary_enum_discriminant)] to the crate attributes to enable + +error[E0658]: custom discriminant values are not allowed in enums with tuple or struct variants + --> $DIR/feature-gate-arbitrary_enum_discriminant.rs:4:10 + | +LL | Unit = 1, + | ^ disallowed custom discriminant +LL | +LL | Tuple() = 2, + | ----------- tuple variant defined here +LL | +LL | Struct{} = 3, + | ------------ struct variant defined here + | + = note: for more information, see https://github.com/rust-lang/rust/issues/60553 + = help: add #![feature(arbitrary_enum_discriminant)] to the crate attributes to enable + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/parser/issue-17383.rs b/src/test/ui/parser/issue-17383.rs index f95005cd914..7bf0e64f2c0 100644 --- a/src/test/ui/parser/issue-17383.rs +++ b/src/test/ui/parser/issue-17383.rs @@ -1,6 +1,6 @@ enum X { A = 3, - //~^ ERROR custom discriminant values are not allowed in enums with fields + //~^ ERROR custom discriminant values are not allowed in enums with tuple or struct variants B(usize) } diff --git a/src/test/ui/parser/issue-17383.stderr b/src/test/ui/parser/issue-17383.stderr index 37abd0ff5e1..486c4055807 100644 --- a/src/test/ui/parser/issue-17383.stderr +++ b/src/test/ui/parser/issue-17383.stderr @@ -1,11 +1,15 @@ -error: custom discriminant values are not allowed in enums with fields +error[E0658]: custom discriminant values are not allowed in enums with tuple or struct variants --> $DIR/issue-17383.rs:2:9 | LL | A = 3, - | ^ invalid custom discriminant + | ^ disallowed custom discriminant LL | LL | B(usize) - | -------- variant with a field defined here + | -------- tuple variant defined here + | + = note: for more information, see https://github.com/rust-lang/rust/issues/60553 + = help: add #![feature(arbitrary_enum_discriminant)] to the crate attributes to enable error: aborting due to previous error +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/parser/tag-variant-disr-non-nullary.rs b/src/test/ui/parser/tag-variant-disr-non-nullary.rs index 305edc4ad5a..a9cfdd549c7 100644 --- a/src/test/ui/parser/tag-variant-disr-non-nullary.rs +++ b/src/test/ui/parser/tag-variant-disr-non-nullary.rs @@ -1,6 +1,6 @@ enum Color { Red = 0xff0000, - //~^ ERROR custom discriminant values are not allowed in enums with fields + //~^ ERROR custom discriminant values are not allowed in enums with tuple or struct variants Green = 0x00ff00, Blue = 0x0000ff, Black = 0x000000, diff --git a/src/test/ui/parser/tag-variant-disr-non-nullary.stderr b/src/test/ui/parser/tag-variant-disr-non-nullary.stderr index 2d3b2839531..13b46c6e8b3 100644 --- a/src/test/ui/parser/tag-variant-disr-non-nullary.stderr +++ b/src/test/ui/parser/tag-variant-disr-non-nullary.stderr @@ -1,21 +1,25 @@ -error: custom discriminant values are not allowed in enums with fields +error[E0658]: custom discriminant values are not allowed in enums with tuple or struct variants --> $DIR/tag-variant-disr-non-nullary.rs:2:11 | LL | Red = 0xff0000, - | ^^^^^^^^ invalid custom discriminant + | ^^^^^^^^ disallowed custom discriminant LL | LL | Green = 0x00ff00, - | ^^^^^^^^ invalid custom discriminant + | ^^^^^^^^ disallowed custom discriminant LL | Blue = 0x0000ff, - | ^^^^^^^^ invalid custom discriminant + | ^^^^^^^^ disallowed custom discriminant LL | Black = 0x000000, - | ^^^^^^^^ invalid custom discriminant + | ^^^^^^^^ disallowed custom discriminant LL | White = 0xffffff, - | ^^^^^^^^ invalid custom discriminant + | ^^^^^^^^ disallowed custom discriminant LL | Other(usize), - | ------------ variant with a field defined here + | ------------ tuple variant defined here LL | Other2(usize, usize), - | -------------------- variant with fields defined here + | -------------------- tuple variant defined here + | + = note: for more information, see https://github.com/rust-lang/rust/issues/60553 + = help: add #![feature(arbitrary_enum_discriminant)] to the crate attributes to enable error: aborting due to previous error +For more information about this error, try `rustc --explain E0658`. |
