Skip to content

Commit d66d64f

Browse files
committed
Extend both tests with the example from #103073
1 parent 3a089b2 commit d66d64f

4 files changed

Lines changed: 362 additions & 0 deletions

File tree

tests/mir-opt/building/match/aggregate_array_eq.rs

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,25 @@ pub fn array_match(x: [u8; 4]) -> bool {
1313
// CHECK-NOT: switchInt(copy _1[
1414
matches!(x, [1, 2, 3, 4])
1515
}
16+
17+
pub enum MyEnum {
18+
A,
19+
B,
20+
C,
21+
D,
22+
}
23+
24+
// Regression test for https://github.com/rust-lang/rust/issues/103073.
25+
// EMIT_MIR aggregate_array_eq.try_from_matched.built.after.mir
26+
pub fn try_from_matched(value: [u8; 4]) -> Result<MyEnum, ()> {
27+
// CHECK-LABEL: fn try_from_matched(
28+
// CHECK: <[u8; 4] as PartialEq>::eq
29+
// CHECK-NOT: switchInt(copy (*_2)[
30+
match &value {
31+
b"ABCD" => Ok(MyEnum::A),
32+
b"EFGH" => Ok(MyEnum::B),
33+
b"IJKL" => Ok(MyEnum::C),
34+
b"MNOP" => Ok(MyEnum::D),
35+
_ => Err(()),
36+
}
37+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// MIR for `try_from_matched` after built
2+
3+
fn try_from_matched(_1: [u8; 4]) -> Result<MyEnum, ()> {
4+
debug value => _1;
5+
let mut _0: std::result::Result<MyEnum, ()>;
6+
let mut _2: &[u8; 4];
7+
let mut _3: &[u8; 4];
8+
let mut _4: bool;
9+
let mut _5: &[u8; 4];
10+
let mut _6: bool;
11+
let mut _7: &[u8; 4];
12+
let mut _8: bool;
13+
let mut _9: &[u8; 4];
14+
let mut _10: bool;
15+
let mut _11: MyEnum;
16+
let mut _12: MyEnum;
17+
let mut _13: MyEnum;
18+
let mut _14: MyEnum;
19+
let mut _15: ();
20+
21+
bb0: {
22+
StorageLive(_2);
23+
_2 = &_1;
24+
PlaceMention(_2);
25+
_9 = &(*_2);
26+
_10 = <[u8; 4] as PartialEq>::eq(copy _9, const &*b"ABCD") -> [return: bb19, unwind: bb26];
27+
}
28+
29+
bb1: {
30+
StorageLive(_15);
31+
_15 = ();
32+
_0 = Result::<MyEnum, ()>::Err(move _15);
33+
StorageDead(_15);
34+
goto -> bb25;
35+
}
36+
37+
bb2: {
38+
falseEdge -> [real: bb24, imaginary: bb4];
39+
}
40+
41+
bb3: {
42+
goto -> bb1;
43+
}
44+
45+
bb4: {
46+
_7 = &(*_2);
47+
_8 = <[u8; 4] as PartialEq>::eq(copy _7, const &*b"EFGH") -> [return: bb18, unwind: bb26];
48+
}
49+
50+
bb5: {
51+
goto -> bb1;
52+
}
53+
54+
bb6: {
55+
falseEdge -> [real: bb23, imaginary: bb8];
56+
}
57+
58+
bb7: {
59+
goto -> bb5;
60+
}
61+
62+
bb8: {
63+
_5 = &(*_2);
64+
_6 = <[u8; 4] as PartialEq>::eq(copy _5, const &*b"IJKL") -> [return: bb17, unwind: bb26];
65+
}
66+
67+
bb9: {
68+
goto -> bb5;
69+
}
70+
71+
bb10: {
72+
falseEdge -> [real: bb22, imaginary: bb12];
73+
}
74+
75+
bb11: {
76+
goto -> bb9;
77+
}
78+
79+
bb12: {
80+
_3 = &(*_2);
81+
_4 = <[u8; 4] as PartialEq>::eq(copy _3, const &*b"MNOP") -> [return: bb16, unwind: bb26];
82+
}
83+
84+
bb13: {
85+
goto -> bb9;
86+
}
87+
88+
bb14: {
89+
falseEdge -> [real: bb21, imaginary: bb1];
90+
}
91+
92+
bb15: {
93+
goto -> bb13;
94+
}
95+
96+
bb16: {
97+
switchInt(move _4) -> [0: bb13, otherwise: bb14];
98+
}
99+
100+
bb17: {
101+
switchInt(move _6) -> [0: bb12, otherwise: bb10];
102+
}
103+
104+
bb18: {
105+
switchInt(move _8) -> [0: bb8, otherwise: bb6];
106+
}
107+
108+
bb19: {
109+
switchInt(move _10) -> [0: bb4, otherwise: bb2];
110+
}
111+
112+
bb20: {
113+
FakeRead(ForMatchedPlace(None), _2);
114+
unreachable;
115+
}
116+
117+
bb21: {
118+
StorageLive(_14);
119+
_14 = MyEnum::D;
120+
_0 = Result::<MyEnum, ()>::Ok(move _14);
121+
StorageDead(_14);
122+
goto -> bb25;
123+
}
124+
125+
bb22: {
126+
StorageLive(_13);
127+
_13 = MyEnum::C;
128+
_0 = Result::<MyEnum, ()>::Ok(move _13);
129+
StorageDead(_13);
130+
goto -> bb25;
131+
}
132+
133+
bb23: {
134+
StorageLive(_12);
135+
_12 = MyEnum::B;
136+
_0 = Result::<MyEnum, ()>::Ok(move _12);
137+
StorageDead(_12);
138+
goto -> bb25;
139+
}
140+
141+
bb24: {
142+
StorageLive(_11);
143+
_11 = MyEnum::A;
144+
_0 = Result::<MyEnum, ()>::Ok(move _11);
145+
StorageDead(_11);
146+
goto -> bb25;
147+
}
148+
149+
bb25: {
150+
StorageDead(_2);
151+
return;
152+
}
153+
154+
bb26 (cleanup): {
155+
resume;
156+
}
157+
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
// MIR for `try_from_matched` after built
2+
3+
fn try_from_matched(_1: [u8; 4]) -> Result<MyEnum, ()> {
4+
debug value => _1;
5+
let mut _0: std::result::Result<MyEnum, ()>;
6+
let mut _2: &[u8; 4];
7+
let mut _3: &[u8; 4];
8+
let mut _4: bool;
9+
let mut _5: &[u8; 4];
10+
let mut _6: bool;
11+
let mut _7: &[u8; 4];
12+
let mut _8: bool;
13+
let mut _9: &[u8; 4];
14+
let mut _10: bool;
15+
let mut _11: MyEnum;
16+
let mut _12: MyEnum;
17+
let mut _13: MyEnum;
18+
let mut _14: MyEnum;
19+
let mut _15: ();
20+
21+
bb0: {
22+
StorageLive(_2);
23+
_2 = &_1;
24+
PlaceMention(_2);
25+
_9 = &(*_2);
26+
_10 = <[u8; 4] as PartialEq>::eq(copy _9, const &*b"ABCD") -> [return: bb19, unwind: bb26];
27+
}
28+
29+
bb1: {
30+
StorageLive(_15);
31+
_15 = ();
32+
_0 = Result::<MyEnum, ()>::Err(move _15);
33+
StorageDead(_15);
34+
goto -> bb25;
35+
}
36+
37+
bb2: {
38+
falseEdge -> [real: bb24, imaginary: bb4];
39+
}
40+
41+
bb3: {
42+
goto -> bb1;
43+
}
44+
45+
bb4: {
46+
_7 = &(*_2);
47+
_8 = <[u8; 4] as PartialEq>::eq(copy _7, const &*b"EFGH") -> [return: bb18, unwind: bb26];
48+
}
49+
50+
bb5: {
51+
goto -> bb1;
52+
}
53+
54+
bb6: {
55+
falseEdge -> [real: bb23, imaginary: bb8];
56+
}
57+
58+
bb7: {
59+
goto -> bb5;
60+
}
61+
62+
bb8: {
63+
_5 = &(*_2);
64+
_6 = <[u8; 4] as PartialEq>::eq(copy _5, const &*b"IJKL") -> [return: bb17, unwind: bb26];
65+
}
66+
67+
bb9: {
68+
goto -> bb5;
69+
}
70+
71+
bb10: {
72+
falseEdge -> [real: bb22, imaginary: bb12];
73+
}
74+
75+
bb11: {
76+
goto -> bb9;
77+
}
78+
79+
bb12: {
80+
_3 = &(*_2);
81+
_4 = <[u8; 4] as PartialEq>::eq(copy _3, const &*b"MNOP") -> [return: bb16, unwind: bb26];
82+
}
83+
84+
bb13: {
85+
goto -> bb9;
86+
}
87+
88+
bb14: {
89+
falseEdge -> [real: bb21, imaginary: bb1];
90+
}
91+
92+
bb15: {
93+
goto -> bb13;
94+
}
95+
96+
bb16: {
97+
switchInt(move _4) -> [0: bb13, otherwise: bb14];
98+
}
99+
100+
bb17: {
101+
switchInt(move _6) -> [0: bb12, otherwise: bb10];
102+
}
103+
104+
bb18: {
105+
switchInt(move _8) -> [0: bb8, otherwise: bb6];
106+
}
107+
108+
bb19: {
109+
switchInt(move _10) -> [0: bb4, otherwise: bb2];
110+
}
111+
112+
bb20: {
113+
FakeRead(ForMatchedPlace(None), _2);
114+
unreachable;
115+
}
116+
117+
bb21: {
118+
StorageLive(_14);
119+
_14 = MyEnum::D;
120+
_0 = Result::<MyEnum, ()>::Ok(move _14);
121+
StorageDead(_14);
122+
goto -> bb25;
123+
}
124+
125+
bb22: {
126+
StorageLive(_13);
127+
_13 = MyEnum::C;
128+
_0 = Result::<MyEnum, ()>::Ok(move _13);
129+
StorageDead(_13);
130+
goto -> bb25;
131+
}
132+
133+
bb23: {
134+
StorageLive(_12);
135+
_12 = MyEnum::B;
136+
_0 = Result::<MyEnum, ()>::Ok(move _12);
137+
StorageDead(_12);
138+
goto -> bb25;
139+
}
140+
141+
bb24: {
142+
StorageLive(_11);
143+
_11 = MyEnum::A;
144+
_0 = Result::<MyEnum, ()>::Ok(move _11);
145+
StorageDead(_11);
146+
goto -> bb25;
147+
}
148+
149+
bb25: {
150+
StorageDead(_2);
151+
return;
152+
}
153+
154+
bb26 (cleanup): {
155+
resume;
156+
}
157+
}

tests/ui/match/aggregate-array-eq.rs

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,35 @@ fn array_match(x: [u8; 4]) -> bool {
88
matches!(x, [1, 2, 3, 4])
99
}
1010

11+
#[derive(Debug, PartialEq)]
12+
enum MyEnum {
13+
A,
14+
B,
15+
C,
16+
D,
17+
}
18+
19+
// Regression test for https://github.com/rust-lang/rust/issues/103073.
20+
fn try_from_matched(value: [u8; 4]) -> Result<MyEnum, ()> {
21+
match &value {
22+
b"ABCD" => Ok(MyEnum::A),
23+
b"EFGH" => Ok(MyEnum::B),
24+
b"IJKL" => Ok(MyEnum::C),
25+
b"MNOP" => Ok(MyEnum::D),
26+
_ => Err(()),
27+
}
28+
}
29+
1130
fn main() {
1231
assert!(array_match([1, 2, 3, 4]));
1332
assert!(!array_match([1, 2, 3, 5]));
1433
assert!(!array_match([0, 0, 0, 0]));
1534
assert!(!array_match([4, 3, 2, 1]));
35+
36+
assert_eq!(try_from_matched(*b"ABCD"), Ok(MyEnum::A));
37+
assert_eq!(try_from_matched(*b"EFGH"), Ok(MyEnum::B));
38+
assert_eq!(try_from_matched(*b"IJKL"), Ok(MyEnum::C));
39+
assert_eq!(try_from_matched(*b"MNOP"), Ok(MyEnum::D));
40+
assert_eq!(try_from_matched(*b"ZZZZ"), Err(()));
41+
assert_eq!(try_from_matched(*b"ABCE"), Err(()));
1642
}

0 commit comments

Comments
 (0)