]> git.lizzy.rs Git - rust.git/blob - src/test/ui/unsafe/union.rs
Rollup merge of #94577 - RalfJung:simd-miri, r=scottmcm
[rust.git] / src / test / ui / unsafe / union.rs
1 // run-pass
2 // revisions: mir thir
3 // [thir]compile-flags: -Z thir-unsafeck
4
5 #![feature(untagged_unions)]
6
7 union Foo {
8     bar: i8,
9     zst: (),
10     pizza: Pizza,
11 }
12
13 struct Pizza {
14     topping: Option<PizzaTopping>
15 }
16
17 #[allow(dead_code)]
18 enum PizzaTopping {
19     Cheese,
20     Pineapple,
21 }
22
23 struct FooHolder {
24     inner_foo: Foo
25 }
26
27 fn do_nothing(_x: &mut Foo) {}
28
29 pub fn main() {
30     let mut foo = Foo { bar: 5 };
31     do_nothing(&mut foo);
32     foo.bar = 6;
33     unsafe { foo.bar += 1; }
34     assert_eq!(unsafe { foo.bar }, 7);
35     unsafe {
36         let Foo { bar: inner } = foo;
37         assert_eq!(inner, 7);
38     }
39     let foo = if let true = true { foo } else { foo };
40
41     unsafe {
42         match foo {
43             Foo { bar: _a } => {},
44         }
45     }
46     unsafe {
47         match foo {
48             Foo {
49                 pizza: Pizza {
50                     topping: Some(PizzaTopping::Cheese) | Some(PizzaTopping::Pineapple) | None
51                 }
52             } => {},
53         }
54     }
55     // binding to wildcard is okay
56     match foo {
57         Foo { bar: _ } => {},
58     }
59     let Foo { bar: _ } = foo;
60     // MIR unsafeck incorrectly thinks that it is safe to do these
61     unsafe { //[mir]~ WARNING
62         match foo {
63             Foo { zst: () } => {},
64         }
65     }
66     unsafe { //[mir]~ WARNING
67         match foo {
68             Foo { pizza: Pizza { .. } } => {},
69         }
70     }
71     let foo = Foo { bar: 5 };
72     let foo = if let 3 = if let true = true { 3 } else { 4 } { foo } else { foo };
73
74     let (_foo2, _random) = (foo, 42);
75
76     let mut foo_holder = FooHolder { inner_foo: Foo { bar: 5 } };
77     foo_holder.inner_foo.bar = 4;
78     assert_eq!(unsafe { foo_holder.inner_foo.bar }, 4);
79     drop(foo_holder);
80 }