diff options
| author | Josh Stone <jistone@redhat.com> | 2022-07-30 11:54:15 -0700 |
|---|---|---|
| committer | Josh Stone <jistone@redhat.com> | 2022-07-30 11:54:15 -0700 |
| commit | 1e7e74557285c6307c5cf78c88b0a3356d8b7498 (patch) | |
| tree | 5d2949dce27fc79c5d3e10390f7d4be34e6c0ad3 | |
| parent | 4a1e4ea32af7d192d47f3ade90e984005638bf99 (diff) | |
| download | rust-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.rs | 8 | ||||
| -rw-r--r-- | src/test/ui/layout/zero-sized-array-enum-niche.stderr | 127 |
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 |
