]> git.lizzy.rs Git - rust.git/commitdiff
Don't optimize pairs
authorAustin Hicks <camlorn@camlorn.net>
Tue, 22 Nov 2016 01:38:47 +0000 (20:38 -0500)
committerAustin Hicks <camlorn@camlorn.net>
Wed, 14 Dec 2016 17:28:22 +0000 (12:28 -0500)
src/librustc/ty/layout.rs

index 87f6d6fc6e1ae88123fe402678222a1a84dbd0bc..6d7625bf15d41d2ac284c553a0c640bf9c99eeeb 100644 (file)
@@ -549,9 +549,14 @@ fn new(dl: &TargetDataLayout, fields: &Vec<&'a Layout>,
             min_size: Size::from_bytes(0),
         };
 
+        // 1-member and 2-member structs don't optimize.
+        // In addition, large bodies of code in trans assume that 2-element structs can become pairs.
+        // It's easier to just short-circuit here.
+        let can_optimize_struct = fields.len() > 2;
+
         let (optimize, sort_ascending) = match (repr, kind) {
-            (attr::ReprAny, StructKind::AlwaysSizedUnivariant) => (true, false),
-            (attr::ReprAny, StructKind::MaybeUnsizedUnivariant) => (true, true),
+            (attr::ReprAny, StructKind::AlwaysSizedUnivariant) => (can_optimize_struct, false),
+            (attr::ReprAny, StructKind::MaybeUnsizedUnivariant) => (can_optimize_struct, true),
             (attr::ReprAny, StructKind::EnumVariant) => {
                 assert!(fields.len() >= 1, "Enum variants must have discriminants.");
                 (true, fields[0].size(dl).bytes() == 1)