From 97228f5e7b0d6a0dc5c97fa73fa7ab096e4eb58d Mon Sep 17 00:00:00 2001 From: Eduard-Mihai Burtescu Date: Tue, 26 Dec 2017 01:40:48 +0200 Subject: [PATCH] rustc: don't use union layouts for tagged union enums. --- src/librustc/ty/layout.rs | 8 ++++---- src/test/codegen/align-struct.rs | 5 +++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/librustc/ty/layout.rs b/src/librustc/ty/layout.rs index bf76f6e7d1d..017b16e4126 100644 --- a/src/librustc/ty/layout.rs +++ b/src/librustc/ty/layout.rs @@ -1655,10 +1655,10 @@ impl<'a, 'tcx> LayoutDetails { discr, variants }, - // FIXME(eddyb): using `FieldPlacement::Arbitrary` here results - // in lost optimizations, specifically around allocations, see - // `test/codegen/{alloc-optimisation,vec-optimizes-away}.rs`. - fields: FieldPlacement::Union(1), + fields: FieldPlacement::Arbitrary { + offsets: vec![Size::from_bytes(0)], + memory_index: vec![0] + }, abi, align, size diff --git a/src/test/codegen/align-struct.rs b/src/test/codegen/align-struct.rs index 3b720dc30d3..ab9f5dda3a1 100644 --- a/src/test/codegen/align-struct.rs +++ b/src/test/codegen/align-struct.rs @@ -32,13 +32,14 @@ pub enum Enum4 { A(i32), B(i32), } -// CHECK: %Enum4 = type { [2 x i32] } +// CHECK: %Enum4 = type { [0 x i32], i32, [1 x i32] } +// CHECK: %"Enum4::A" = type { [1 x i32], i32, [0 x i32] } pub enum Enum64 { A(Align64), B(i32), } -// CHECK: %Enum64 = type { [16 x i64] } +// CHECK: %Enum64 = type { [0 x i32], i32, [31 x i32] } // CHECK: %"Enum64::A" = type { [8 x i64], %Align64, [0 x i64] } // CHECK-LABEL: @align64