about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLuqman Aden <me@luqman.ca>2023-05-05 16:30:32 -0700
committerLuqman Aden <me@luqman.ca>2023-05-05 16:30:32 -0700
commit8e7714d3bb81e41ed3e812415626acbabd20ff02 (patch)
tree9cab34e21895b9de65f2225125c82b168b67e222
parent012f9a333b4017f5cb3d7917b03132b79a26dc09 (diff)
downloadrust-8e7714d3bb81e41ed3e812415626acbabd20ff02.tar.gz
rust-8e7714d3bb81e41ed3e812415626acbabd20ff02.zip
Reorder to keep duplicate checks in sync.
-rw-r--r--compiler/rustc_abi/src/layout.rs19
1 files changed, 12 insertions, 7 deletions
diff --git a/compiler/rustc_abi/src/layout.rs b/compiler/rustc_abi/src/layout.rs
index e46c171d731..3d97d9b4895 100644
--- a/compiler/rustc_abi/src/layout.rs
+++ b/compiler/rustc_abi/src/layout.rs
@@ -744,12 +744,20 @@ pub trait LayoutCalculator {
         for field in only_variant {
             assert!(field.0.is_sized());
 
-            if !field.0.is_zst() && !common_non_zst_abi_and_align.is_err() {
+            align = align.max(field.align());
+            size = cmp::max(size, field.size());
+
+            if field.0.is_zst() {
+                // Nothing more to do for ZST fields
+                continue;
+            }
+
+            if let Ok(common) = common_non_zst_abi_and_align {
                 // Discard valid range information and allow undef
                 let field_abi = field.abi().to_union();
 
-                if let Ok(Some((common_abi, common_align))) = &mut common_non_zst_abi_and_align {
-                    if *common_abi != field_abi {
+                if let Some((common_abi, common_align)) = common {
+                    if common_abi != field_abi {
                         // Different fields have different ABI: disable opt
                         common_non_zst_abi_and_align = Err(AbiMismatch);
                     } else {
@@ -757,7 +765,7 @@ pub trait LayoutCalculator {
                         // have the same alignment
                         if !matches!(common_abi, Abi::Aggregate { .. }) {
                             assert_eq!(
-                                *common_align,
+                                common_align,
                                 field.align().abi,
                                 "non-Aggregate field with matching ABI but differing alignment"
                             );
@@ -768,9 +776,6 @@ pub trait LayoutCalculator {
                     common_non_zst_abi_and_align = Ok(Some((field_abi, field.align().abi)));
                 }
             }
-
-            align = align.max(field.align());
-            size = cmp::max(size, field.size());
         }
 
         if let Some(pack) = repr.pack {