]> git.lizzy.rs Git - rust.git/commitdiff
rustc: don't use union layouts for tagged union enums.
authorEduard-Mihai Burtescu <edy.burt@gmail.com>
Mon, 25 Dec 2017 23:40:48 +0000 (01:40 +0200)
committerEduard-Mihai Burtescu <edy.burt@gmail.com>
Tue, 26 Dec 2017 20:36:20 +0000 (22:36 +0200)
src/librustc/ty/layout.rs
src/test/codegen/align-struct.rs

index bf76f6e7d1dd589794525902c58790324604b3a3..017b16e4126659dd2f4f7b8cfd1f2c2de07f57d0 100644 (file)
@@ -1655,10 +1655,10 @@ enum StructKind {
                         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
index 3b720dc30d3f5310ae6750bef378ffa24d289502..ab9f5dda3a1b729b0d986dcc7c5c26dfd0c3eefa 100644 (file)
@@ -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