about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJosh Stone <jistone@redhat.com>2022-07-30 11:54:15 -0700
committerJosh Stone <jistone@redhat.com>2022-07-30 11:54:15 -0700
commit1e7e74557285c6307c5cf78c88b0a3356d8b7498 (patch)
tree5d2949dce27fc79c5d3e10390f7d4be34e6c0ad3
parent4a1e4ea32af7d192d47f3ade90e984005638bf99 (diff)
downloadrust-1e7e74557285c6307c5cf78c88b0a3356d8b7498.tar.gz
rust-1e7e74557285c6307c5cf78c88b0a3356d8b7498.zip
Test another enum niche with multiple ZST alignments
-rw-r--r--src/test/ui/layout/zero-sized-array-enum-niche.rs8
-rw-r--r--src/test/ui/layout/zero-sized-array-enum-niche.stderr127
2 files changed, 132 insertions, 3 deletions
diff --git a/src/test/ui/layout/zero-sized-array-enum-niche.rs b/src/test/ui/layout/zero-sized-array-enum-niche.rs
index c03077faed5..23bbbfbfc58 100644
--- a/src/test/ui/layout/zero-sized-array-enum-niche.rs
+++ b/src/test/ui/layout/zero-sized-array-enum-niche.rs
@@ -15,6 +15,14 @@ type AlignedResult = Result<[u32; 0], bool>; //~ ERROR: layout_of
 // It was also using the bool niche for the enum tag, which is fine, but
 // after the fix, layout decides to use a direct tagged repr instead.
 
+// Here's another case with multiple ZST alignments, where we should
+// get the maximal alignment and matching size.
+#[rustc_layout(debug)]
+enum MultipleAlignments { //~ ERROR: layout_of
+    Align2([u16; 0]),
+    Align4([u32; 0]),
+    Niche(bool),
+}
 
 // Tagged repr is clever enough to grow tags to fill any padding, e.g.:
 // 1.   `T_FF` (one byte of Tag, one byte of padding, two bytes of align=2 Field)
diff --git a/src/test/ui/layout/zero-sized-array-enum-niche.stderr b/src/test/ui/layout/zero-sized-array-enum-niche.stderr
index 9fae1974db8..0dbecbe412b 100644
--- a/src/test/ui/layout/zero-sized-array-enum-niche.stderr
+++ b/src/test/ui/layout/zero-sized-array-enum-niche.stderr
@@ -97,6 +97,127 @@ error: layout_of(std::result::Result<[u32; 0], bool>) = Layout {
 LL | type AlignedResult = Result<[u32; 0], bool>;
    | ^^^^^^^^^^^^^^^^^^
 
+error: layout_of(MultipleAlignments) = Layout {
+           fields: Arbitrary {
+               offsets: [
+                   Size(0 bytes),
+               ],
+               memory_index: [
+                   0,
+               ],
+           },
+           variants: Multiple {
+               tag: Initialized {
+                   value: Int(
+                       I8,
+                       false,
+                   ),
+                   valid_range: 0..=2,
+               },
+               tag_encoding: Direct,
+               tag_field: 0,
+               variants: [
+                   Layout {
+                       fields: Arbitrary {
+                           offsets: [
+                               Size(2 bytes),
+                           ],
+                           memory_index: [
+                               0,
+                           ],
+                       },
+                       variants: Single {
+                           index: 0,
+                       },
+                       abi: Aggregate {
+                           sized: true,
+                       },
+                       largest_niche: None,
+                       align: AbiAndPrefAlign {
+                           abi: Align(2 bytes),
+                           pref: $PREF_ALIGN,
+                       },
+                       size: Size(2 bytes),
+                   },
+                   Layout {
+                       fields: Arbitrary {
+                           offsets: [
+                               Size(4 bytes),
+                           ],
+                           memory_index: [
+                               0,
+                           ],
+                       },
+                       variants: Single {
+                           index: 1,
+                       },
+                       abi: Aggregate {
+                           sized: true,
+                       },
+                       largest_niche: None,
+                       align: AbiAndPrefAlign {
+                           abi: Align(4 bytes),
+                           pref: $PREF_ALIGN,
+                       },
+                       size: Size(4 bytes),
+                   },
+                   Layout {
+                       fields: Arbitrary {
+                           offsets: [
+                               Size(1 bytes),
+                           ],
+                           memory_index: [
+                               0,
+                           ],
+                       },
+                       variants: Single {
+                           index: 2,
+                       },
+                       abi: Aggregate {
+                           sized: true,
+                       },
+                       largest_niche: Some(
+                           Niche {
+                               offset: Size(1 bytes),
+                               value: Int(
+                                   I8,
+                                   false,
+                               ),
+                               valid_range: 0..=1,
+                           },
+                       ),
+                       align: AbiAndPrefAlign {
+                           abi: Align(1 bytes),
+                           pref: $PREF_ALIGN,
+                       },
+                       size: Size(2 bytes),
+                   },
+               ],
+           },
+           abi: Aggregate {
+               sized: true,
+           },
+           largest_niche: Some(
+               Niche {
+                   offset: Size(0 bytes),
+                   value: Int(
+                       I8,
+                       false,
+                   ),
+                   valid_range: 0..=2,
+               },
+           ),
+           align: AbiAndPrefAlign {
+               abi: Align(4 bytes),
+               pref: $PREF_ALIGN,
+           },
+           size: Size(4 bytes),
+       }
+  --> $DIR/zero-sized-array-enum-niche.rs:21:1
+   |
+LL | enum MultipleAlignments {
+   | ^^^^^^^^^^^^^^^^^^^^^^^
+
 error: layout_of(std::result::Result<[u32; 0], Packed<std::num::NonZeroU16>>) = Layout {
            fields: Arbitrary {
                offsets: [
@@ -191,7 +312,7 @@ error: layout_of(std::result::Result<[u32; 0], Packed<std::num::NonZeroU16>>) =
            },
            size: Size(4 bytes),
        }
-  --> $DIR/zero-sized-array-enum-niche.rs:29:1
+  --> $DIR/zero-sized-array-enum-niche.rs:37:1
    |
 LL | type NicheLosesToTagged = Result<[u32; 0], Packed<std::num::NonZeroU16>>;
    | ^^^^^^^^^^^^^^^^^^^^^^^
@@ -294,10 +415,10 @@ error: layout_of(std::result::Result<[u32; 0], Packed<U16IsZero>>) = Layout {
            },
            size: Size(4 bytes),
        }
-  --> $DIR/zero-sized-array-enum-niche.rs:36:1
+  --> $DIR/zero-sized-array-enum-niche.rs:44:1
    |
 LL | type NicheWinsOverTagged = Result<[u32; 0], Packed<U16IsZero>>;
    | ^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 3 previous errors
+error: aborting due to 4 previous errors