summaryrefslogtreecommitdiffstats
path: root/src/test/ui/structs-enums/enum-univariant-repr.rs
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/test/ui/structs-enums/enum-univariant-repr.rs51
1 files changed, 51 insertions, 0 deletions
diff --git a/src/test/ui/structs-enums/enum-univariant-repr.rs b/src/test/ui/structs-enums/enum-univariant-repr.rs
new file mode 100644
index 000000000..1e0f67887
--- /dev/null
+++ b/src/test/ui/structs-enums/enum-univariant-repr.rs
@@ -0,0 +1,51 @@
+// run-pass
+
+use std::mem;
+
+// Univariant C-like enum
+#[repr(i32)]
+enum Univariant {
+ X = 17
+}
+
+#[repr(u16)]
+enum UnivariantWithoutDescr {
+ Y
+}
+
+#[repr(u8)]
+enum UnivariantWithData {
+ Z(u8),
+}
+
+pub fn main() {
+ {
+ assert_eq!(4, mem::size_of::<Univariant>());
+ assert_eq!(17, Univariant::X as i32);
+
+ let enums: &[Univariant] =
+ &[Univariant::X, Univariant::X, Univariant::X];
+ let ints: &[i32] = unsafe { mem::transmute(enums) };
+ // check it has the same memory layout as i32
+ assert_eq!(&[17, 17, 17], ints);
+ }
+
+ {
+ assert_eq!(2, mem::size_of::<UnivariantWithoutDescr>());
+ let descr = UnivariantWithoutDescr::Y as u16;
+
+ let enums: &[UnivariantWithoutDescr] =
+ &[UnivariantWithoutDescr::Y, UnivariantWithoutDescr::Y, UnivariantWithoutDescr::Y];
+ let ints: &[u16] = unsafe { mem::transmute(enums) };
+ // check it has the same memory layout as u16
+ assert_eq!(&[descr, descr, descr], ints);
+ }
+
+ {
+ assert_eq!(2, mem::size_of::<UnivariantWithData>());
+
+ match UnivariantWithData::Z(4) {
+ UnivariantWithData::Z(x) => assert_eq!(x, 4),
+ }
+ }
+}