@@ -147,7 +147,7 @@ pub fn check_crate(tcx: &ty::ctxt) {
147147fn check_expr ( cx : & mut MatchCheckCtxt , ex : & Expr ) {
148148 visit:: walk_expr ( cx, ex) ;
149149 match ex. node {
150- ExprMatch ( ref scrut, ref arms) => {
150+ ExprMatch ( ref scrut, ref arms, source ) => {
151151 // First, check legality of move bindings.
152152 for arm in arms. iter ( ) {
153153 check_legality_of_move_bindings ( cx,
@@ -184,7 +184,7 @@ fn check_expr(cx: &mut MatchCheckCtxt, ex: &Expr) {
184184 }
185185
186186 // Fourth, check for unreachable arms.
187- check_arms ( cx, inlined_arms. as_slice ( ) ) ;
187+ check_arms ( cx, inlined_arms. as_slice ( ) , source ) ;
188188
189189 // Finally, check if the whole match expression is exhaustive.
190190 // 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>]) {
252252}
253253
254254// 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 ) {
256256 let mut seen = Matrix ( vec ! [ ] ) ;
257+ let mut printed_if_let_err = false ;
257258 for & ( ref pats, guard) in arms. iter ( ) {
258259 for pat in pats. iter ( ) {
259260 let v = vec ! [ & * * pat] ;
261+
260262 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+ }
262280 Useful => ( ) ,
263281 UsefulWithWitness ( _) => unreachable ! ( )
264282 }
0 commit comments