-
Notifications
You must be signed in to change notification settings - Fork 12.8k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Rollup merge of #96814 - RalfJung:enum-repr-align, r=oli-obk
Fix repr(align) enum handling `enum`, for better or worse, supports `repr(align)`. That has already caused a bug in #92464, which was "fixed" in #92932, but it turns out that that fix is wrong and caused #96185. So this reverts #92932 (which fixes #96185), and attempts another strategy for fixing #92464: special-case enums when doing a cast, re-using the code to load the discriminant rather than assuming that the enum has scalar layout. This works fine for the interpreter. However, #92464 contained another testcase that was previously not in the test suite -- and after adding it, it ICEs again. This is not surprising; codegen needs the same patch that I did in the interpreter. Probably this has to happen [around here](https://github.com/rust-lang/rust/blob/d32ce37a171663048a4c4a536803434e40f52bd6/compiler/rustc_codegen_ssa/src/mir/rvalue.rs#L276). Unfortunately I don't know how to do that -- the interpreter can load a discriminant from an operand, but codegen can only do that from a place. `@oli-obk` `@eddyb` `@bjorn3` any idea?
- Loading branch information
Showing
4 changed files
with
205 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// normalize-stderr-test "pref: Align\([1-8] bytes\)" -> "pref: $$PREF_ALIGN" | ||
#![crate_type = "lib"] | ||
#![feature(rustc_attrs)] | ||
|
||
// This cannot use `Scalar` abi since there is padding. | ||
#[rustc_layout(debug)] | ||
#[repr(align(8))] | ||
pub enum Aligned1 { //~ ERROR: layout_of | ||
Zero = 0, | ||
One = 1, | ||
} | ||
|
||
// This should use `Scalar` abi. | ||
#[rustc_layout(debug)] | ||
#[repr(align(1))] | ||
pub enum Aligned2 { //~ ERROR: layout_of | ||
Zero = 0, | ||
One = 1, | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,172 @@ | ||
error: layout_of(Aligned1) = Layout { | ||
fields: Arbitrary { | ||
offsets: [ | ||
Size(0 bytes), | ||
], | ||
memory_index: [ | ||
0, | ||
], | ||
}, | ||
variants: Multiple { | ||
tag: Initialized { | ||
value: Int( | ||
I8, | ||
false, | ||
), | ||
valid_range: 0..=1, | ||
}, | ||
tag_encoding: Direct, | ||
tag_field: 0, | ||
variants: [ | ||
Layout { | ||
fields: Arbitrary { | ||
offsets: [], | ||
memory_index: [], | ||
}, | ||
variants: Single { | ||
index: 0, | ||
}, | ||
abi: Aggregate { | ||
sized: true, | ||
}, | ||
largest_niche: None, | ||
align: AbiAndPrefAlign { | ||
abi: Align(8 bytes), | ||
pref: $PREF_ALIGN, | ||
}, | ||
size: Size(8 bytes), | ||
}, | ||
Layout { | ||
fields: Arbitrary { | ||
offsets: [], | ||
memory_index: [], | ||
}, | ||
variants: Single { | ||
index: 1, | ||
}, | ||
abi: Aggregate { | ||
sized: true, | ||
}, | ||
largest_niche: None, | ||
align: AbiAndPrefAlign { | ||
abi: Align(8 bytes), | ||
pref: $PREF_ALIGN, | ||
}, | ||
size: Size(8 bytes), | ||
}, | ||
], | ||
}, | ||
abi: Aggregate { | ||
sized: true, | ||
}, | ||
largest_niche: Some( | ||
Niche { | ||
offset: Size(0 bytes), | ||
value: Int( | ||
I8, | ||
false, | ||
), | ||
valid_range: 0..=1, | ||
}, | ||
), | ||
align: AbiAndPrefAlign { | ||
abi: Align(8 bytes), | ||
pref: $PREF_ALIGN, | ||
}, | ||
size: Size(8 bytes), | ||
} | ||
--> $DIR/issue-96185-overaligned-enum.rs:8:1 | ||
| | ||
LL | pub enum Aligned1 { | ||
| ^^^^^^^^^^^^^^^^^ | ||
|
||
error: layout_of(Aligned2) = Layout { | ||
fields: Arbitrary { | ||
offsets: [ | ||
Size(0 bytes), | ||
], | ||
memory_index: [ | ||
0, | ||
], | ||
}, | ||
variants: Multiple { | ||
tag: Initialized { | ||
value: Int( | ||
I8, | ||
false, | ||
), | ||
valid_range: 0..=1, | ||
}, | ||
tag_encoding: Direct, | ||
tag_field: 0, | ||
variants: [ | ||
Layout { | ||
fields: Arbitrary { | ||
offsets: [], | ||
memory_index: [], | ||
}, | ||
variants: Single { | ||
index: 0, | ||
}, | ||
abi: Aggregate { | ||
sized: true, | ||
}, | ||
largest_niche: None, | ||
align: AbiAndPrefAlign { | ||
abi: Align(1 bytes), | ||
pref: $PREF_ALIGN, | ||
}, | ||
size: Size(1 bytes), | ||
}, | ||
Layout { | ||
fields: Arbitrary { | ||
offsets: [], | ||
memory_index: [], | ||
}, | ||
variants: Single { | ||
index: 1, | ||
}, | ||
abi: Aggregate { | ||
sized: true, | ||
}, | ||
largest_niche: None, | ||
align: AbiAndPrefAlign { | ||
abi: Align(1 bytes), | ||
pref: $PREF_ALIGN, | ||
}, | ||
size: Size(1 bytes), | ||
}, | ||
], | ||
}, | ||
abi: Scalar( | ||
Initialized { | ||
value: Int( | ||
I8, | ||
false, | ||
), | ||
valid_range: 0..=1, | ||
}, | ||
), | ||
largest_niche: Some( | ||
Niche { | ||
offset: Size(0 bytes), | ||
value: Int( | ||
I8, | ||
false, | ||
), | ||
valid_range: 0..=1, | ||
}, | ||
), | ||
align: AbiAndPrefAlign { | ||
abi: Align(1 bytes), | ||
pref: $PREF_ALIGN, | ||
}, | ||
size: Size(1 bytes), | ||
} | ||
--> $DIR/issue-96185-overaligned-enum.rs:16:1 | ||
| | ||
LL | pub enum Aligned2 { | ||
| ^^^^^^^^^^^^^^^^^ | ||
|
||
error: aborting due to 2 previous errors | ||
|