Commit 226661f
Exhaustiveness checking for match statements (#12267)
Closes #12010.
Mypy can now detect if a match statement covers all the possible values.
Example:
```
def f(x: int | str) -> int:
match x:
case str():
return 0
case int():
return 1
# Mypy knows that we can't reach here
```
Most of the work was done by @freundTech. I did various minor updates
and changes to tests.
This doesn't handle some cases properly, including these:
1. We don't recognize that `match [*args]` fully covers a list type
2. Fake intersections don't work quite right (some tests are skipped)
3. We assume enums don't have custom `__eq__` methods
Co-authored-by: Adrian Freund <[email protected]>1 parent fce1b54 commit 226661f
File tree
4 files changed
+520
-142
lines changed- mypy
- test-data/unit
4 files changed
+520
-142
lines changed| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
4089 | 4089 | | |
4090 | 4090 | | |
4091 | 4091 | | |
| 4092 | + | |
| 4093 | + | |
| 4094 | + | |
| 4095 | + | |
| 4096 | + | |
4092 | 4097 | | |
4093 | | - | |
4094 | 4098 | | |
4095 | | - | |
| 4099 | + | |
4096 | 4100 | | |
4097 | | - | |
| 4101 | + | |
| 4102 | + | |
| 4103 | + | |
| 4104 | + | |
| 4105 | + | |
4098 | 4106 | | |
4099 | 4107 | | |
4100 | 4108 | | |
4101 | 4109 | | |
| 4110 | + | |
4102 | 4111 | | |
4103 | | - | |
| 4112 | + | |
| 4113 | + | |
| 4114 | + | |
| 4115 | + | |
| 4116 | + | |
| 4117 | + | |
| 4118 | + | |
| 4119 | + | |
4104 | 4120 | | |
4105 | 4121 | | |
4106 | | - | |
| 4122 | + | |
| 4123 | + | |
4107 | 4124 | | |
4108 | | - | |
4109 | | - | |
| 4125 | + | |
| 4126 | + | |
4110 | 4127 | | |
4111 | | - | |
| 4128 | + | |
| 4129 | + | |
4112 | 4130 | | |
4113 | | - | |
4114 | | - | |
| 4131 | + | |
| 4132 | + | |
| 4133 | + | |
| 4134 | + | |
| 4135 | + | |
4115 | 4136 | | |
4116 | 4137 | | |
4117 | 4138 | | |
4118 | 4139 | | |
4119 | 4140 | | |
4120 | 4141 | | |
4121 | | - | |
| 4142 | + | |
4122 | 4143 | | |
4123 | 4144 | | |
4124 | 4145 | | |
| |||
4128 | 4149 | | |
4129 | 4150 | | |
4130 | 4151 | | |
| 4152 | + | |
4131 | 4153 | | |
4132 | | - | |
| 4154 | + | |
4133 | 4155 | | |
4134 | 4156 | | |
4135 | 4157 | | |
4136 | 4158 | | |
4137 | | - | |
| 4159 | + | |
4138 | 4160 | | |
4139 | | - | |
4140 | | - | |
4141 | | - | |
4142 | | - | |
4143 | | - | |
4144 | | - | |
4145 | | - | |
4146 | | - | |
4147 | | - | |
4148 | | - | |
| 4161 | + | |
| 4162 | + | |
| 4163 | + | |
| 4164 | + | |
| 4165 | + | |
| 4166 | + | |
| 4167 | + | |
| 4168 | + | |
4149 | 4169 | | |
4150 | 4170 | | |
4151 | 4171 | | |
| 4172 | + | |
4152 | 4173 | | |
| 4174 | + | |
| 4175 | + | |
| 4176 | + | |
| 4177 | + | |
| 4178 | + | |
| 4179 | + | |
| 4180 | + | |
| 4181 | + | |
| 4182 | + | |
| 4183 | + | |
4153 | 4184 | | |
4154 | 4185 | | |
4155 | 4186 | | |
| |||
5637 | 5668 | | |
5638 | 5669 | | |
5639 | 5670 | | |
| 5671 | + | |
| 5672 | + | |
| 5673 | + | |
| 5674 | + | |
| 5675 | + | |
| 5676 | + | |
| 5677 | + | |
| 5678 | + | |
5640 | 5679 | | |
5641 | 5680 | | |
5642 | 5681 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
2 | 3 | | |
3 | 4 | | |
4 | 5 | | |
| |||
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
22 | | - | |
| 23 | + | |
| 24 | + | |
23 | 25 | | |
24 | 26 | | |
25 | 27 | | |
| |||
55 | 57 | | |
56 | 58 | | |
57 | 59 | | |
58 | | - | |
| 60 | + | |
59 | 61 | | |
60 | 62 | | |
61 | 63 | | |
| |||
177 | 179 | | |
178 | 180 | | |
179 | 181 | | |
| 182 | + | |
180 | 183 | | |
181 | 184 | | |
182 | 185 | | |
| |||
259 | 262 | | |
260 | 263 | | |
261 | 264 | | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
262 | 268 | | |
263 | 269 | | |
264 | 270 | | |
| |||
287 | 293 | | |
288 | 294 | | |
289 | 295 | | |
290 | | - | |
291 | | - | |
292 | | - | |
| 296 | + | |
293 | 297 | | |
294 | 298 | | |
295 | 299 | | |
296 | 300 | | |
297 | 301 | | |
298 | | - | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
299 | 310 | | |
300 | 311 | | |
301 | 312 | | |
| |||
344 | 355 | | |
345 | 356 | | |
346 | 357 | | |
347 | | - | |
348 | | - | |
| 358 | + | |
349 | 359 | | |
350 | 360 | | |
351 | 361 | | |
| |||
639 | 649 | | |
640 | 650 | | |
641 | 651 | | |
| 652 | + | |
| 653 | + | |
| 654 | + | |
| 655 | + | |
| 656 | + | |
| 657 | + | |
| 658 | + | |
642 | 659 | | |
643 | 660 | | |
644 | 661 | | |
| |||
676 | 693 | | |
677 | 694 | | |
678 | 695 | | |
| 696 | + | |
| 697 | + | |
| 698 | + | |
| 699 | + | |
| 700 | + | |
679 | 701 | | |
680 | 702 | | |
681 | 703 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
21 | 21 | | |
22 | 22 | | |
23 | 23 | | |
| 24 | + | |
24 | 25 | | |
25 | 26 | | |
26 | 27 | | |
| |||
39 | 40 | | |
40 | 41 | | |
41 | 42 | | |
| 43 | + | |
42 | 44 | | |
43 | 45 | | |
44 | 46 | | |
| |||
50 | 52 | | |
51 | 53 | | |
52 | 54 | | |
| 55 | + | |
53 | 56 | | |
54 | 57 | | |
55 | 58 | | |
| |||
73 | 76 | | |
74 | 77 | | |
75 | 78 | | |
| 79 | + | |
76 | 80 | | |
77 | 81 | | |
78 | 82 | | |
| |||
114 | 118 | | |
115 | 119 | | |
116 | 120 | | |
| 121 | + | |
117 | 122 | | |
118 | 123 | | |
119 | 124 | | |
| |||
0 commit comments