1- // run-pass
21// revisions: mir thir
32// [thir]compile-flags: -Z thir-unsafeck
43
@@ -20,61 +19,35 @@ enum PizzaTopping {
2019 Pineapple ,
2120}
2221
23- struct FooHolder {
24- inner_foo : Foo
25- }
26-
2722fn do_nothing ( _x : & mut Foo ) { }
2823
2924pub fn main ( ) {
3025 let mut foo = Foo { bar : 5 } ;
3126 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 ) ;
27+
28+ // This is UB, so this test isn't run
29+ match foo {
30+ Foo { bar : _a } => { } , //~ ERROR access to union field is unsafe
31+ }
32+ match foo { //[mir]~ ERROR access to union field is unsafe
33+ Foo {
34+ pizza : Pizza { //[thir]~ ERROR access to union field is unsafe
35+ topping : Some ( PizzaTopping :: Cheese ) | Some ( PizzaTopping :: Pineapple ) | None
36+ }
37+ } => { } ,
3838 }
39- let foo = if let true = true { foo } else { foo } ;
4039
41- unsafe {
42- match foo {
43- Foo { bar : _a } => { } ,
44- }
40+ // MIR unsafeck incorrectly thinks that no unsafe block is needed to do these
41+ match foo {
42+ Foo { zst : ( ) } => { } , //[thir]~ ERROR access to union field is unsafe
4543 }
46- unsafe {
47- match foo {
48- Foo {
49- pizza : Pizza {
50- topping : Some ( PizzaTopping :: Cheese ) | Some ( PizzaTopping :: Pineapple ) | None
51- }
52- } => { } ,
53- }
44+ match foo {
45+ Foo { pizza : Pizza { .. } } => { } , //[thir]~ ERROR access to union field is unsafe
5446 }
47+
5548 // binding to wildcard is okay
5649 match foo {
5750 Foo { bar : _ } => { } ,
5851 }
5952 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) ;
8053}
0 commit comments