@@ -112,6 +112,100 @@ reference when using guards or refactor the entire expression, perhaps by
112
112
putting the condition inside the body of the arm.
113
113
"## ,
114
114
115
+ E0162 : r##"
116
+ An if-let pattern attempts to match the pattern, and enters the body if the
117
+ match was succesful. If the match is irrefutable (when it cannot fail to match),
118
+ use a regular `let`-binding instead. For instance:
119
+
120
+ struct Irrefutable(i32);
121
+ let irr = Irrefutable(0);
122
+
123
+ // This fails to compile because the match is irrefutable.
124
+ if let Irrefutable(x) = irr {
125
+ // This body will always be executed.
126
+ foo(x);
127
+ }
128
+
129
+ // Try this instead:
130
+ let Irrefutable(x) = irr;
131
+ foo(x);
132
+ "## ,
133
+
134
+ E0165 : r##"
135
+ A while-let pattern attempts to match the pattern, and enters the body if the
136
+ match was succesful. If the match is irrefutable (when it cannot fail to match),
137
+ use a regular `let`-binding inside a `loop` instead. For instance:
138
+
139
+ struct Irrefutable(i32);
140
+ let irr = Irrefutable(0);
141
+
142
+ // This fails to compile because the match is irrefutable.
143
+ while let Irrefutable(x) = irr {
144
+ ...
145
+ }
146
+
147
+ // Try this instead:
148
+ loop {
149
+ let Irrefutable(x) = irr;
150
+ ...
151
+ }
152
+ "## ,
153
+
154
+ E0297 : r##"
155
+ Patterns used to bind names must be irrefutable. That is, they must guarantee
156
+ that a name will be extracted in all cases. Instead of pattern matching the
157
+ loop variable, consider using a `match` or `if let` inside the loop body. For
158
+ instance:
159
+
160
+ // This fails because `None` is not covered.
161
+ for Some(x) in xs {
162
+ ...
163
+ }
164
+
165
+ // Match inside the loop instead:
166
+ for item in xs {
167
+ match item {
168
+ Some(x) => ...
169
+ None => ...
170
+ }
171
+ }
172
+
173
+ // Or use `if let`:
174
+ for item in xs {
175
+ if let Some(x) = item {
176
+ ...
177
+ }
178
+ }
179
+ "## ,
180
+
181
+ E0301 : r##"
182
+ Mutable borrows are not allowed in pattern guards, because matching cannot have
183
+ side effects. Side effects could alter the matched object or the environment
184
+ on which the match depends in such a way, that the match would not be
185
+ exhaustive. For instance, the following would not match any arm if mutable
186
+ borrows were allowed:
187
+
188
+ match Some(()) {
189
+ None => { },
190
+ option if option.take().is_none() => { /* impossible, option is `Some` */ },
191
+ Some(_) => { } // When the previous match failed, the option became `None`.
192
+ }
193
+ "## ,
194
+
195
+ E0302 : r##"
196
+ Assignments are not allowed in pattern guards, because matching cannot have
197
+ side effects. Side effects could alter the matched object or the environment
198
+ on which the match depends in such a way, that the match would not be
199
+ exhaustive. For instance, the following would not match any arm if assignments
200
+ were allowed:
201
+
202
+ match Some(()) {
203
+ None => { },
204
+ option if { option = None; false } { },
205
+ Some(_) => { } // When the previous match failed, the option became `None`.
206
+ }
207
+ "## ,
208
+
115
209
E0303 : r##"
116
210
In certain cases it is possible for sub-bindings to violate memory safety.
117
211
Updates to the borrow checker in a future version of Rust may remove this
@@ -165,8 +259,6 @@ register_diagnostics! {
165
259
E0152 ,
166
260
E0158 ,
167
261
E0161 ,
168
- E0162 ,
169
- E0165 ,
170
262
E0170 ,
171
263
E0261 , // use of undeclared lifetime name
172
264
E0262 , // illegal lifetime parameter name
@@ -194,12 +286,9 @@ register_diagnostics! {
194
286
E0284 , // cannot resolve type
195
287
E0285 , // overflow evaluation builtin bounds
196
288
E0296 , // malformed recursion limit attribute
197
- E0297 , // refutable pattern in for loop binding
198
289
E0298 , // mismatched types between arms
199
290
E0299 , // mismatched types between arms
200
291
E0300 , // unexpanded macro
201
- E0301 , // cannot mutable borrow in a pattern guard
202
- E0302 , // cannot assign in a pattern guard
203
292
E0304 , // expected signed integer constant
204
293
E0305 , // expected constant
205
294
E0306 , // expected positive integer for repeat count
0 commit comments