about summary refs log tree commit diff
path: root/src/test/ui/aligned_enum_cast.rs
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2022-07-05 23:43:30 +0200
committerGitHub <noreply@github.com>2022-07-05 23:43:30 +0200
commit3e802d72bbe3b4f4ec200dd9a6110e530ed4fbb9 (patch)
tree8ead3384987de6799cc312168e6d88b070dd3c04 /src/test/ui/aligned_enum_cast.rs
parent0a7f2c3a025c8bab1e10ccec6208a4c19b057b26 (diff)
parentd5721ce3a0f0d8eb2c46d87440b1977b5aef972c (diff)
downloadrust-3e802d72bbe3b4f4ec200dd9a6110e530ed4fbb9.tar.gz
rust-3e802d72bbe3b4f4ec200dd9a6110e530ed4fbb9.zip
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 https://github.com/rust-lang/rust/issues/92464, which was "fixed" in https://github.com/rust-lang/rust/pull/92932, but it turns out that that fix is wrong and caused https://github.com/rust-lang/rust/issues/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?
Diffstat (limited to 'src/test/ui/aligned_enum_cast.rs')
-rw-r--r--src/test/ui/aligned_enum_cast.rs12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/test/ui/aligned_enum_cast.rs b/src/test/ui/aligned_enum_cast.rs
index 4b5776a6aa8..1ddf127172e 100644
--- a/src/test/ui/aligned_enum_cast.rs
+++ b/src/test/ui/aligned_enum_cast.rs
@@ -11,5 +11,15 @@ enum Aligned {
 fn main() {
     let aligned = Aligned::Zero;
     let fo = aligned as u8;
-    println!("foo {}",fo);
+    println!("foo {}", fo);
+    assert_eq!(fo, 0);
+    println!("{}", tou8(Aligned::Zero));
+    assert_eq!(tou8(Aligned::Zero), 0);
+}
+
+#[inline(never)]
+fn tou8(al: Aligned) -> u8 {
+    // Cast behind a function call so ConstProp does not see it
+    // (so that we can test codegen).
+    al as u8
 }