]>
Commit | Line | Data |
---|---|---|
3b2f2976 XL |
1 | // Copyright 2017 The Rust Project Developers. See the COPYRIGHT |
2 | // file at the top-level directory of this distribution and at | |
3 | // http://rust-lang.org/COPYRIGHT. | |
4 | // | |
5 | // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or | |
6 | // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license | |
7 | // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your | |
8 | // option. This file may not be copied, modified, or distributed | |
9 | // except according to those terms. | |
10 | ||
11 | // ignore-tidy-linelength | |
12 | // compile-flags: -Z verbose -Z mir-emit-validate=1 -Z span_free_formats | |
13 | ||
14 | // Make sure unsafe fns and fns with an unsafe block only get restricted validation. | |
15 | ||
16 | unsafe fn write_42(x: *mut i32) -> bool { | |
17 | let test_closure = |x: *mut i32| *x = 23; | |
18 | test_closure(x); | |
19 | *x = 42; | |
20 | true | |
21 | } | |
22 | ||
23 | fn test(x: &mut i32) { | |
24 | unsafe { write_42(x) }; | |
25 | } | |
26 | ||
27 | fn main() { | |
28 | test(&mut 0); | |
29 | ||
30 | let test_closure = unsafe { |x: &mut i32| write_42(x) }; | |
31 | test_closure(&mut 0); | |
32 | } | |
33 | ||
34 | // FIXME: Also test code generated inside the closure, make sure it only does restricted validation | |
35 | // because it is entirely inside an unsafe block. Unfortunately, the interesting lines of code also | |
36 | // contain name of the source file, so we cannot test for it. | |
37 | ||
38 | // END RUST SOURCE | |
abe05a73 | 39 | // START rustc.write_42.EraseRegions.after.mir |
3b2f2976 | 40 | // fn write_42(_1: *mut i32) -> bool { |
abe05a73 | 41 | // ... |
3b2f2976 XL |
42 | // bb0: { |
43 | // Validate(Acquire, [_1: *mut i32]); | |
44 | // Validate(Release, [_1: *mut i32]); | |
abe05a73 | 45 | // ... |
3b2f2976 XL |
46 | // return; |
47 | // } | |
48 | // } | |
abe05a73 XL |
49 | // END rustc.write_42.EraseRegions.after.mir |
50 | // START rustc.write_42-{{closure}}.EraseRegions.after.mir | |
3b2f2976 | 51 | // fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () { |
abe05a73 | 52 | // ... |
3b2f2976 | 53 | // bb0: { |
abe05a73 XL |
54 | // Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[317d]::write_42[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(22)], _2: *mut i32]); |
55 | // Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:9) => validate_4[317d]::write_42[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(22)], _2: *mut i32]); | |
56 | // (*_2) = const 23i32; | |
3b2f2976 XL |
57 | // return; |
58 | // } | |
59 | // } | |
abe05a73 XL |
60 | // END rustc.write_42-{{closure}}.EraseRegions.after.mir |
61 | // START rustc.test.EraseRegions.after.mir | |
3b2f2976 | 62 | // fn test(_1: &ReErased mut i32) -> () { |
abe05a73 | 63 | // ... |
3b2f2976 | 64 | // bb0: { |
abe05a73 XL |
65 | // Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:4) => validate_4[317d]::test[0] }, BrAnon(0)) mut i32]); |
66 | // Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(0:4) => validate_4[317d]::test[0] }, BrAnon(0)) mut i32]); | |
67 | // ... | |
68 | // _2 = const write_42(_3) -> bb1; | |
3b2f2976 XL |
69 | // } |
70 | // bb1: { | |
abe05a73 XL |
71 | // Validate(Acquire, [_2: bool]); |
72 | // Validate(Release, [_2: bool]); | |
73 | // ... | |
3b2f2976 XL |
74 | // } |
75 | // } | |
abe05a73 XL |
76 | // END rustc.test.EraseRegions.after.mir |
77 | // START rustc.main-{{closure}}.EraseRegions.after.mir | |
3b2f2976 | 78 | // fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool { |
abe05a73 | 79 | // ... |
3b2f2976 | 80 | // bb0: { |
abe05a73 XL |
81 | // Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrAnon(0)) mut i32]); |
82 | // Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrEnv) [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), index: DefIndex(1:10) => validate_4[317d]::main[0]::{{closure}}[0] }, BrAnon(0)) mut i32]); | |
3b2f2976 | 83 | // StorageLive(_3); |
abe05a73 XL |
84 | // ... |
85 | // _0 = const write_42(_3) -> bb1; | |
3b2f2976 | 86 | // } |
abe05a73 | 87 | // ... |
3b2f2976 | 88 | // } |
abe05a73 | 89 | // END rustc.main-{{closure}}.EraseRegions.after.mir |