about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-12-24 10:07:22 +0000
committerbors <bors@rust-lang.org>2017-12-24 10:07:22 +0000
commit4ce6b9a770ea9bbe2747b2cdbf6ffcde7ceb6469 (patch)
tree2842e5a7d92b6f579faee315a05cb52b304e6a52 /src/test
parent11a24d9c3940f60e527c571680d64e80e0889abe (diff)
parentda9791767bf9d4c334e22a1c4718e325279be984 (diff)
Auto merge of #46859 - gereeter:uninhabited-unions, r=eddyb
Only mark unions as uninhabited if all of their fields are uninhabited

Fixes #46845.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass/issue-46845.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/test/run-pass/issue-46845.rs b/src/test/run-pass/issue-46845.rs
new file mode 100644
index 00000000000..235d3982a9c
--- /dev/null
+++ b/src/test/run-pass/issue-46845.rs
@@ -0,0 +1,39 @@
+// Copyright 2017 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// To work around #46855
+// compile-flags: -Z mir-opt-level=0
+// Regression test for the inhabitedness of unions with uninhabited variants, issue #46845
+
+use std::mem;
+
+#[derive(Copy, Clone)]
+enum Never { }
+
+// A single uninhabited variant shouldn't make the whole union uninhabited.
+union Foo {
+    a: u64,
+    _b: Never
+}
+
+// If all the variants are uninhabited, however, the union should be uninhabited.
+union Bar {
+    _a: (Never, u64),
+    _b: (u64, Never)
+}
+
+fn main() {
+    assert_eq!(mem::size_of::<Foo>(), 8);
+    assert_eq!(mem::size_of::<Bar>(), 0);
+
+    let f = [Foo { a: 42 }, Foo { a: 10 }];
+    println!("{}", unsafe { f[0].a });
+    assert_eq!(unsafe { f[1].a }, 10);
+}