about summary refs log tree commit diff
path: root/src/test
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2018-06-04 11:29:38 +0000
committerbors <bors@rust-lang.org>2018-06-04 11:29:38 +0000
commitcdc193db993eadab74d9ea439613e8f9d3725ac7 (patch)
tree29cc5f53ff8f0c39b8ac246bc47bd139f19d9dbf /src/test
parent6eafab06cf76fd1461aabc2c6a4fc0daa516da13 (diff)
parenteb31ae2e140b682e630a93d2382bd06ffc6089a5 (diff)
downloadrust-cdc193db993eadab74d9ea439613e8f9d3725ac7.tar.gz
rust-cdc193db993eadab74d9ea439613e8f9d3725ac7.zip
Auto merge of #51328 - oli-obk:no_union_promotion, r=eddyb
Do not promote union field accesses

r? @eddyb

technically a breaking change, but the code errored on the previous stable and produces UB + a warning on the current stable. I don't think we need a crater run in that case.
Diffstat (limited to 'src/test')
-rw-r--r--src/test/run-pass/ctfe/union-ice.rs45
-rw-r--r--src/test/run-pass/union/union-const-eval-field.rs14
-rw-r--r--src/test/ui/const-eval/union_promotion.rs22
-rw-r--r--src/test/ui/const-eval/union_promotion.stderr16
4 files changed, 49 insertions, 48 deletions
diff --git a/src/test/run-pass/ctfe/union-ice.rs b/src/test/run-pass/ctfe/union-ice.rs
deleted file mode 100644
index f83f49f298b..00000000000
--- a/src/test/run-pass/ctfe/union-ice.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-// Copyright 2018 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.
-
-#![feature(const_fn)]
-
-type Field1 = i32;
-type Field2 = f32;
-type Field3 = i64;
-
-union DummyUnion {
-    field1: Field1,
-    field2: Field2,
-    field3: Field3,
-}
-
-const FLOAT1_AS_I32: i32 = 1065353216;
-const UNION: DummyUnion = DummyUnion { field1: FLOAT1_AS_I32 };
-
-const fn read_field1() -> Field1 {
-    const FIELD1: Field1 = unsafe { UNION.field1 };
-    FIELD1
-}
-
-const fn read_field2() -> Field2 {
-    const FIELD2: Field2 = unsafe { UNION.field2 };
-    FIELD2
-}
-
-const fn read_field3() -> Field3 {
-    const FIELD3: Field3 = unsafe { UNION.field3 };
-    FIELD3
-}
-
-fn main() {
-    assert_eq!(read_field1(), FLOAT1_AS_I32);
-    assert_eq!(read_field2(), 1.0);
-    assert_eq!(read_field3(), unsafe { UNION.field3 });
-}
diff --git a/src/test/run-pass/union/union-const-eval-field.rs b/src/test/run-pass/union/union-const-eval-field.rs
index f83f49f298b..a380b01dcc1 100644
--- a/src/test/run-pass/union/union-const-eval-field.rs
+++ b/src/test/run-pass/union/union-const-eval-field.rs
@@ -10,7 +10,7 @@
 
 #![feature(const_fn)]
 
-type Field1 = i32;
+type Field1 = (i32, u32);
 type Field2 = f32;
 type Field3 = i64;
 
@@ -21,7 +21,7 @@ union DummyUnion {
 }
 
 const FLOAT1_AS_I32: i32 = 1065353216;
-const UNION: DummyUnion = DummyUnion { field1: FLOAT1_AS_I32 };
+const UNION: DummyUnion = DummyUnion { field1: (FLOAT1_AS_I32, 0) };
 
 const fn read_field1() -> Field1 {
     const FIELD1: Field1 = unsafe { UNION.field1 };
@@ -39,7 +39,15 @@ const fn read_field3() -> Field3 {
 }
 
 fn main() {
-    assert_eq!(read_field1(), FLOAT1_AS_I32);
+    let foo = FLOAT1_AS_I32;
+    assert_eq!(read_field1().0, foo);
+    assert_eq!(read_field1().0, FLOAT1_AS_I32);
+
+    let foo = 1.0;
+    assert_eq!(read_field2(), foo);
     assert_eq!(read_field2(), 1.0);
+
     assert_eq!(read_field3(), unsafe { UNION.field3 });
+    let foo = unsafe { UNION.field3 };
+    assert_eq!(read_field3(), foo);
 }
diff --git a/src/test/ui/const-eval/union_promotion.rs b/src/test/ui/const-eval/union_promotion.rs
new file mode 100644
index 00000000000..714d7a4fc8b
--- /dev/null
+++ b/src/test/ui/const-eval/union_promotion.rs
@@ -0,0 +1,22 @@
+// Copyright 2018 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.
+
+#![allow(const_err)]
+
+union Foo {
+    a: &'static u32,
+    b: usize,
+}
+
+fn main() {
+    let x: &'static bool = &unsafe { //~ borrowed value does not live long enough
+        Foo { a: &1 }.b == Foo { a: &2 }.b
+    };
+}
diff --git a/src/test/ui/const-eval/union_promotion.stderr b/src/test/ui/const-eval/union_promotion.stderr
new file mode 100644
index 00000000000..b4aa91f2de7
--- /dev/null
+++ b/src/test/ui/const-eval/union_promotion.stderr
@@ -0,0 +1,16 @@
+error[E0597]: borrowed value does not live long enough
+  --> $DIR/union_promotion.rs:19:29
+   |
+LL |       let x: &'static bool = &unsafe { //~ borrowed value does not live long enough
+   |  _____________________________^
+LL | |         Foo { a: &1 }.b == Foo { a: &2 }.b
+LL | |     };
+   | |_____^ temporary value does not live long enough
+LL |   }
+   |   - temporary value only lives until here
+   |
+   = note: borrowed value must be valid for the static lifetime...
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0597`.