diff options
| author | bors <bors@rust-lang.org> | 2018-06-04 11:29:38 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2018-06-04 11:29:38 +0000 |
| commit | cdc193db993eadab74d9ea439613e8f9d3725ac7 (patch) | |
| tree | 29cc5f53ff8f0c39b8ac246bc47bd139f19d9dbf /src/test | |
| parent | 6eafab06cf76fd1461aabc2c6a4fc0daa516da13 (diff) | |
| parent | eb31ae2e140b682e630a93d2382bd06ffc6089a5 (diff) | |
| download | rust-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.rs | 45 | ||||
| -rw-r--r-- | src/test/run-pass/union/union-const-eval-field.rs | 14 | ||||
| -rw-r--r-- | src/test/ui/const-eval/union_promotion.rs | 22 | ||||
| -rw-r--r-- | src/test/ui/const-eval/union_promotion.stderr | 16 |
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`. |
