@@ -147,7 +147,7 @@ pub fn check_crate(tcx: &ty::ctxt) {
147
147
fn check_expr ( cx : & mut MatchCheckCtxt , ex : & Expr ) {
148
148
visit:: walk_expr ( cx, ex) ;
149
149
match ex. node {
150
- ExprMatch ( ref scrut, ref arms) => {
150
+ ExprMatch ( ref scrut, ref arms, source ) => {
151
151
// First, check legality of move bindings.
152
152
for arm in arms. iter ( ) {
153
153
check_legality_of_move_bindings ( cx,
@@ -184,7 +184,7 @@ fn check_expr(cx: &mut MatchCheckCtxt, ex: &Expr) {
184
184
}
185
185
186
186
// Fourth, check for unreachable arms.
187
- check_arms ( cx, inlined_arms. as_slice ( ) ) ;
187
+ check_arms ( cx, inlined_arms. as_slice ( ) , source ) ;
188
188
189
189
// Finally, check if the whole match expression is exhaustive.
190
190
// Check for empty enum, because is_useful only works on inhabited types.
@@ -252,13 +252,31 @@ fn check_for_static_nan(cx: &MatchCheckCtxt, pats: &[P<Pat>]) {
252
252
}
253
253
254
254
// Check for unreachable patterns
255
- fn check_arms ( cx : & MatchCheckCtxt , arms : & [ ( Vec < P < Pat > > , Option < & Expr > ) ] ) {
255
+ fn check_arms ( cx : & MatchCheckCtxt , arms : & [ ( Vec < P < Pat > > , Option < & Expr > ) ] , source : MatchSource ) {
256
256
let mut seen = Matrix ( vec ! [ ] ) ;
257
+ let mut printed_if_let_err = false ;
257
258
for & ( ref pats, guard) in arms. iter ( ) {
258
259
for pat in pats. iter ( ) {
259
260
let v = vec ! [ & * * pat] ;
261
+
260
262
match is_useful ( cx, & seen, v. as_slice ( ) , LeaveOutWitness ) {
261
- NotUseful => span_err ! ( cx. tcx. sess, pat. span, E0001 , "unreachable pattern" ) ,
263
+ NotUseful => {
264
+ if source == MatchIfLetDesugar {
265
+ if printed_if_let_err {
266
+ // we already printed an irrefutable if-let pattern error.
267
+ // We don't want two, that's just confusing.
268
+ } else {
269
+ // find the first arm pattern so we can use its span
270
+ let & ( ref first_arm_pats, _) = & arms[ 0 ] ;
271
+ let first_pat = first_arm_pats. get ( 0 ) ;
272
+ let span = first_pat. span ;
273
+ span_err ! ( cx. tcx. sess, span, E0162 , "irrefutable if-let pattern" ) ;
274
+ printed_if_let_err = true ;
275
+ }
276
+ } else {
277
+ span_err ! ( cx. tcx. sess, pat. span, E0001 , "unreachable pattern" ) ;
278
+ }
279
+ }
262
280
Useful => ( ) ,
263
281
UsefulWithWitness ( _) => unreachable ! ( )
264
282
}
0 commit comments