Skip to content

Commit 9dba107

Browse files
authored
Rollup merge of rust-lang#43650 - RalfJung:mir-validate, r=arielb1
test MIR validation statements in closures r? @nikomatsakis
2 parents 36d143f + 21a707e commit 9dba107

File tree

3 files changed

+71
-11
lines changed

3 files changed

+71
-11
lines changed

src/test/mir-opt/validate_1.rs

+23-5
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
// ignore-tidy-linelength
12-
// compile-flags: -Z verbose -Z mir-emit-validate=1
12+
// compile-flags: -Z verbose -Z mir-emit-validate=1 -Z span_free_formats
1313

1414
struct Test(i32);
1515

@@ -20,16 +20,13 @@ impl Test {
2020

2121
fn main() {
2222
let mut x = 0;
23-
Test(0).foo(&mut x);
23+
Test(0).foo(&mut x); // just making sure we do not panic when there is a tuple struct ctor
2424

2525
// Also test closures
2626
let c = |x: &mut i32| { let y = &*x; *y };
2727
c(&mut x);
2828
}
2929

30-
// FIXME: Also test code generated inside the closure, make sure it has validation. Unfortunately,
31-
// the interesting lines of code also contain name of the source file, so we cannot test for it.
32-
3330
// END RUST SOURCE
3431
// START rustc.node12.EraseRegions.after.mir
3532
// bb0: {
@@ -57,3 +54,24 @@ fn main() {
5754
// }
5855
// }
5956
// END rustc.node23.EraseRegions.after.mir
57+
// START rustc.node50.EraseRegions.after.mir
58+
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(50)], _2: &ReErased mut i32) -> i32 {
59+
// bb0: {
60+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_1/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(50)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_1/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
61+
// StorageLive(_3);
62+
// _3 = _2;
63+
// StorageLive(_4);
64+
// Validate(Suspend(ReScope(Remainder(BlockRemainder { block: NodeId(41), first_statement_index: 0 }))), [(*_3): i32]);
65+
// _4 = &ReErased (*_3);
66+
// Validate(Acquire, [(*_4): i32/ReScope(Remainder(BlockRemainder { block: NodeId(41), first_statement_index: 0 })) (imm)]);
67+
// StorageLive(_5);
68+
// _5 = (*_4);
69+
// _0 = _5;
70+
// StorageDead(_5);
71+
// StorageDead(_4);
72+
// EndRegion(ReScope(Remainder(BlockRemainder { block: NodeId(41), first_statement_index: 0 })));
73+
// StorageDead(_3);
74+
// return;
75+
// }
76+
// }
77+
// END rustc.node50.EraseRegions.after.mir

src/test/mir-opt/validate_4.rs

+24-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
// except according to those terms.
1010

1111
// ignore-tidy-linelength
12-
// compile-flags: -Z verbose -Z mir-emit-validate=1
12+
// compile-flags: -Z verbose -Z mir-emit-validate=1 -Z span_free_formats
1313

1414
// Make sure unsafe fns and fns with an unsafe block only get restricted validation.
1515

@@ -45,6 +45,19 @@ fn main() {
4545
// }
4646
// }
4747
// END rustc.node4.EraseRegions.after.mir
48+
// START rustc.node22.EraseRegions.after.mir
49+
// fn write_42::{{closure}}(_1: &ReErased [closure@NodeId(22)], _2: *mut i32) -> () {
50+
// bb0: {
51+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483659) => validate_4/8cd878b::write_42[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(22)], _2: *mut i32]);
52+
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483659) => validate_4/8cd878b::write_42[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(22)], _2: *mut i32]);
53+
// StorageLive(_3);
54+
// _3 = _2;
55+
// (*_3) = const 23i32;
56+
// StorageDead(_3);
57+
// return;
58+
// }
59+
// }
60+
// END rustc.node22.EraseRegions.after.mir
4861
// START rustc.node31.EraseRegions.after.mir
4962
// fn test(_1: &ReErased mut i32) -> () {
5063
// bb0: {
@@ -58,3 +71,13 @@ fn main() {
5871
// }
5972
// }
6073
// END rustc.node31.EraseRegions.after.mir
74+
// START rustc.node60.EraseRegions.after.mir
75+
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(60)], _2: &ReErased mut i32) -> bool {
76+
// bb0: {
77+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
78+
// Validate(Release, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(60)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483663) => validate_4/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
79+
// StorageLive(_3);
80+
// _0 = const write_42(_4) -> bb1;
81+
// }
82+
// }
83+
// END rustc.node60.EraseRegions.after.mir

src/test/mir-opt/validate_5.rs

+24-5
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
// except according to those terms.
1010

1111
// ignore-tidy-linelength
12-
// compile-flags: -Z verbose -Z mir-emit-validate=2
12+
// compile-flags: -Z verbose -Z mir-emit-validate=2 -Z span_free_formats
1313

14-
// Make sure unsafe fns and fns with an unsafe block only get full validation.
14+
// Make sure unsafe fns and fns with an unsafe block still get full validation.
1515

1616
unsafe fn write_42(x: *mut i32) -> bool {
1717
*x = 42;
@@ -26,12 +26,12 @@ fn main() {
2626
test(&mut 0);
2727

2828
let test_closure = unsafe { |x: &mut i32| write_42(x) };
29+
// Note that validation will fail if this is executed: The closure keeps the lock on
30+
// x, so the write in write_42 fails. This test just checks code generation,
31+
// so the UB doesn't matter.
2932
test_closure(&mut 0);
3033
}
3134

32-
// FIXME: Also test code generated inside the closure, make sure it has validation. Unfortunately,
33-
// the interesting lines of code also contain name of the source file, so we cannot test for it.
34-
3535
// END RUST SOURCE
3636
// START rustc.node17.EraseRegions.after.mir
3737
// fn test(_1: &ReErased mut i32) -> () {
@@ -42,3 +42,22 @@ fn main() {
4242
// }
4343
// }
4444
// END rustc.node17.EraseRegions.after.mir
45+
// START rustc.node46.EraseRegions.after.mir
46+
// fn main::{{closure}}(_1: &ReErased [closure@NodeId(46)], _2: &ReErased mut i32) -> bool {
47+
// bb0: {
48+
// Validate(Acquire, [_1: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483660) => validate_5/8cd878b::main[0]::{{closure}}[0] }, "BrEnv") [closure@NodeId(46)], _2: &ReFree(DefId { krate: CrateNum(0), node: DefIndex(2147483660) => validate_5/8cd878b::main[0]::{{closure}}[0] }, BrAnon(1)) mut i32]);
49+
// StorageLive(_3);
50+
// _3 = _2;
51+
// StorageLive(_4);
52+
// StorageLive(_5);
53+
// Validate(Suspend(ReScope(Misc(NodeId(44)))), [(*_3): i32]);
54+
// _5 = &ReErased mut (*_3);
55+
// Validate(Acquire, [(*_5): i32/ReScope(Misc(NodeId(44)))]);
56+
// _4 = _5 as *mut i32 (Misc);
57+
// StorageDead(_5);
58+
// EndRegion(ReScope(Misc(NodeId(44))));
59+
// Validate(Release, [_0: bool, _4: *mut i32]);
60+
// _0 = const write_42(_4) -> bb1;
61+
// }
62+
// }
63+
// END rustc.node46.EraseRegions.after.mir

0 commit comments

Comments
 (0)