Skip to content

Commit 3ddb987

Browse files
committed
Regression tests for flowgraph construction bug on ExprWhile.
1 parent 373b0fc commit 3ddb987

File tree

7 files changed

+444
-1
lines changed

7 files changed

+444
-1
lines changed

src/test/run-make/graphviz-flowgraph/Makefile

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22

33
FILES=f00.rs f01.rs f02.rs f03.rs f04.rs f05.rs f06.rs f07.rs \
44
f08.rs f09.rs f10.rs f11.rs f12.rs f13.rs f14.rs f15.rs \
5-
f16.rs f17.rs f18.rs f19.rs f20.rs f21.rs f22.rs
5+
f16.rs f17.rs f18.rs f19.rs f20.rs f21.rs f22.rs f23.rs \
6+
f24.rs f25.rs
67

78

89
# all: $(patsubst %.rs,$(TMPDIR)/%.dot,$(FILES)) $(patsubst %.rs,$(TMPDIR)/%.pp,$(FILES))
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
digraph block {
2+
N0[label="entry"];
3+
N1[label="exit"];
4+
N2[label="expr 23"];
5+
N3[label="local mut x"];
6+
N4[label="expr 23"];
7+
N5[label="local mut y"];
8+
N6[label="expr 23"];
9+
N7[label="local mut z"];
10+
N8[label="(dummy_node)"];
11+
N9[label="expr x"];
12+
N10[label="expr 0"];
13+
N11[label="expr x > 0"];
14+
N12[label="expr while x > 0 {\l x -= 1;\l while y > 0 {\l y -= 1;\l while z > 0 { z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
15+
N13[label="expr 1"];
16+
N14[label="expr x"];
17+
N15[label="expr x -= 1"];
18+
N16[label="(dummy_node)"];
19+
N17[label="expr y"];
20+
N18[label="expr 0"];
21+
N19[label="expr y > 0"];
22+
N20[label="expr while y > 0 {\l y -= 1;\l while z > 0 { z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l}\l"];
23+
N21[label="expr 1"];
24+
N22[label="expr y"];
25+
N23[label="expr y -= 1"];
26+
N24[label="(dummy_node)"];
27+
N25[label="expr z"];
28+
N26[label="expr 0"];
29+
N27[label="expr z > 0"];
30+
N28[label="expr while z > 0 { z -= 1; }"];
31+
N29[label="expr 1"];
32+
N30[label="expr z"];
33+
N31[label="expr z -= 1"];
34+
N32[label="block { z -= 1; }"];
35+
N33[label="expr x"];
36+
N34[label="expr 10"];
37+
N35[label="expr x > 10"];
38+
N36[label="expr return"];
39+
N37[label="(dummy_node)"];
40+
N38[label="expr \"unreachable\""];
41+
N39[label="block { return; \"unreachable\"; }"];
42+
N40[label="expr if x > 10 { return; \"unreachable\"; }"];
43+
N41[label="block { y -= 1; while z > 0 { z -= 1; } if x > 10 { return; \"unreachable\"; } }"];
44+
N42[label="block {\l x -= 1;\l while y > 0 {\l y -= 1;\l while z > 0 { z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
45+
N43[label="block {\l let mut x = 23;\l let mut y = 23;\l let mut z = 23;\l while x > 0 {\l x -= 1;\l while y > 0 {\l y -= 1;\l while z > 0 { z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l }\l}\l"];
46+
N0 -> N2;
47+
N2 -> N3;
48+
N3 -> N4;
49+
N4 -> N5;
50+
N5 -> N6;
51+
N6 -> N7;
52+
N7 -> N8;
53+
N8 -> N9;
54+
N9 -> N10;
55+
N10 -> N11;
56+
N11 -> N12;
57+
N11 -> N13;
58+
N13 -> N14;
59+
N14 -> N15;
60+
N15 -> N16;
61+
N16 -> N17;
62+
N17 -> N18;
63+
N18 -> N19;
64+
N19 -> N20;
65+
N19 -> N21;
66+
N21 -> N22;
67+
N22 -> N23;
68+
N23 -> N24;
69+
N24 -> N25;
70+
N25 -> N26;
71+
N26 -> N27;
72+
N27 -> N28;
73+
N27 -> N29;
74+
N29 -> N30;
75+
N30 -> N31;
76+
N31 -> N32;
77+
N32 -> N24;
78+
N28 -> N33;
79+
N33 -> N34;
80+
N34 -> N35;
81+
N35 -> N36;
82+
N36 -> N1[label="exiting scope_0 expr while y > 0 {\l y -= 1;\l while z > 0 { z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l}\l,\lexiting scope_1 expr while x > 0 {\l x -= 1;\l while y > 0 {\l y -= 1;\l while z > 0 { z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
83+
N37 -> N38;
84+
N38 -> N39;
85+
N35 -> N40;
86+
N39 -> N40;
87+
N40 -> N41;
88+
N41 -> N16;
89+
N20 -> N42;
90+
N42 -> N8;
91+
N12 -> N43;
92+
N43 -> N1;
93+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
// Copyright 2014 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+
#[allow(unreachable_code)]
12+
pub fn expr_while_23() {
13+
let mut x = 23;
14+
let mut y = 23;
15+
let mut z = 23;
16+
17+
while x > 0 {
18+
x -= 1;
19+
20+
while y > 0 {
21+
y -= 1;
22+
23+
while z > 0 { z -= 1; }
24+
25+
if x > 10 {
26+
return;
27+
"unreachable";
28+
}
29+
}
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
digraph block {
2+
N0[label="entry"];
3+
N1[label="exit"];
4+
N2[label="expr 24"];
5+
N3[label="local mut x"];
6+
N4[label="expr 24"];
7+
N5[label="local mut y"];
8+
N6[label="expr 24"];
9+
N7[label="local mut z"];
10+
N8[label="(dummy_node)"];
11+
N9[label="expr loop {\l if x == 0 { break ; \"unreachable\"; }\l x -= 1;\l loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
12+
N10[label="expr x"];
13+
N11[label="expr 0"];
14+
N12[label="expr x == 0"];
15+
N13[label="expr break"];
16+
N14[label="(dummy_node)"];
17+
N15[label="expr \"unreachable\""];
18+
N16[label="block { break ; \"unreachable\"; }"];
19+
N17[label="expr if x == 0 { break ; \"unreachable\"; }"];
20+
N18[label="expr 1"];
21+
N19[label="expr x"];
22+
N20[label="expr x -= 1"];
23+
N21[label="(dummy_node)"];
24+
N22[label="expr loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l}\l"];
25+
N23[label="expr y"];
26+
N24[label="expr 0"];
27+
N25[label="expr y == 0"];
28+
N26[label="expr break"];
29+
N27[label="(dummy_node)"];
30+
N28[label="expr \"unreachable\""];
31+
N29[label="block { break ; \"unreachable\"; }"];
32+
N30[label="expr if y == 0 { break ; \"unreachable\"; }"];
33+
N31[label="expr 1"];
34+
N32[label="expr y"];
35+
N33[label="expr y -= 1"];
36+
N34[label="(dummy_node)"];
37+
N35[label="expr loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }"];
38+
N36[label="expr z"];
39+
N37[label="expr 0"];
40+
N38[label="expr z == 0"];
41+
N39[label="expr break"];
42+
N40[label="(dummy_node)"];
43+
N41[label="expr \"unreachable\""];
44+
N42[label="block { break ; \"unreachable\"; }"];
45+
N43[label="expr if z == 0 { break ; \"unreachable\"; }"];
46+
N44[label="expr 1"];
47+
N45[label="expr z"];
48+
N46[label="expr z -= 1"];
49+
N47[label="block { if z == 0 { break ; \"unreachable\"; } z -= 1; }"];
50+
N48[label="expr x"];
51+
N49[label="expr 10"];
52+
N50[label="expr x > 10"];
53+
N51[label="expr return"];
54+
N52[label="(dummy_node)"];
55+
N53[label="expr \"unreachable\""];
56+
N54[label="block { return; \"unreachable\"; }"];
57+
N55[label="expr if x > 10 { return; \"unreachable\"; }"];
58+
N56[label="block {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l}\l"];
59+
N57[label="block {\l if x == 0 { break ; \"unreachable\"; }\l x -= 1;\l loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
60+
N58[label="block {\l let mut x = 24;\l let mut y = 24;\l let mut z = 24;\l loop {\l if x == 0 { break ; \"unreachable\"; }\l x -= 1;\l loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l }\l}\l"];
61+
N0 -> N2;
62+
N2 -> N3;
63+
N3 -> N4;
64+
N4 -> N5;
65+
N5 -> N6;
66+
N6 -> N7;
67+
N7 -> N8;
68+
N8 -> N10;
69+
N10 -> N11;
70+
N11 -> N12;
71+
N12 -> N13;
72+
N13 -> N9[label="exiting scope_0 expr break,\lexiting scope_1 stmt break ;,\lexiting scope_2 block { break ; \"unreachable\"; },\lexiting scope_3 expr if x == 0 { break ; \"unreachable\"; },\lexiting scope_4 stmt if x == 0 { break ; \"unreachable\"; },\lexiting scope_5 block {\l if x == 0 { break ; \"unreachable\"; }\l x -= 1;\l loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
73+
N14 -> N15;
74+
N15 -> N16;
75+
N12 -> N17;
76+
N16 -> N17;
77+
N17 -> N18;
78+
N18 -> N19;
79+
N19 -> N20;
80+
N20 -> N21;
81+
N21 -> N23;
82+
N23 -> N24;
83+
N24 -> N25;
84+
N25 -> N26;
85+
N26 -> N22[label="exiting scope_0 expr break,\lexiting scope_1 stmt break ;,\lexiting scope_2 block { break ; \"unreachable\"; },\lexiting scope_3 expr if y == 0 { break ; \"unreachable\"; },\lexiting scope_4 stmt if y == 0 { break ; \"unreachable\"; },\lexiting scope_5 block {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l}\l"];
86+
N27 -> N28;
87+
N28 -> N29;
88+
N25 -> N30;
89+
N29 -> N30;
90+
N30 -> N31;
91+
N31 -> N32;
92+
N32 -> N33;
93+
N33 -> N34;
94+
N34 -> N36;
95+
N36 -> N37;
96+
N37 -> N38;
97+
N38 -> N39;
98+
N39 -> N35[label="exiting scope_0 expr break,\lexiting scope_1 stmt break ;,\lexiting scope_2 block { break ; \"unreachable\"; },\lexiting scope_3 expr if z == 0 { break ; \"unreachable\"; },\lexiting scope_4 stmt if z == 0 { break ; \"unreachable\"; },\lexiting scope_5 block { if z == 0 { break ; \"unreachable\"; } z -= 1; }"];
99+
N40 -> N41;
100+
N41 -> N42;
101+
N38 -> N43;
102+
N42 -> N43;
103+
N43 -> N44;
104+
N44 -> N45;
105+
N45 -> N46;
106+
N46 -> N47;
107+
N47 -> N34;
108+
N35 -> N48;
109+
N48 -> N49;
110+
N49 -> N50;
111+
N50 -> N51;
112+
N51 -> N1[label="exiting scope_0 expr loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l}\l,\lexiting scope_1 expr loop {\l if x == 0 { break ; \"unreachable\"; }\l x -= 1;\l loop {\l if y == 0 { break ; \"unreachable\"; }\l y -= 1;\l loop { if z == 0 { break ; \"unreachable\"; } z -= 1; }\l if x > 10 { return; \"unreachable\"; }\l }\l}\l"];
113+
N52 -> N53;
114+
N53 -> N54;
115+
N50 -> N55;
116+
N54 -> N55;
117+
N55 -> N56;
118+
N56 -> N21;
119+
N22 -> N57;
120+
N57 -> N8;
121+
N9 -> N58;
122+
N58 -> N1;
123+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
// Copyright 2014 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+
#[allow(unreachable_code)]
12+
pub fn expr_while_24() {
13+
let mut x = 24;
14+
let mut y = 24;
15+
let mut z = 24;
16+
17+
loop {
18+
if x == 0 { break; "unreachable"; }
19+
x -= 1;
20+
21+
loop {
22+
if y == 0 { break; "unreachable"; }
23+
y -= 1;
24+
25+
loop {
26+
if z == 0 { break; "unreachable"; }
27+
z -= 1;
28+
}
29+
30+
if x > 10 {
31+
return;
32+
"unreachable";
33+
}
34+
}
35+
}
36+
}

0 commit comments

Comments
 (0)