about summary refs log tree commit diff
path: root/src/librustc_const_eval
diff options
context:
space:
mode:
authorAndrew Cann <shum@canndrew.org>2017-02-04 16:27:45 +0800
committerAndrew Cann <shum@canndrew.org>2017-02-04 16:27:45 +0800
commita1f42cd8930d465bf616d5b2bc5d7b1b945177ab (patch)
treef09e38db0ac236a084017c0c44d848fd47f06f1c /src/librustc_const_eval
parentc781fc4a6a8af287f7abe141f035a638bc0165c3 (diff)
downloadrust-a1f42cd8930d465bf616d5b2bc5d7b1b945177ab.tar.gz
rust-a1f42cd8930d465bf616d5b2bc5d7b1b945177ab.zip
Uninhabited while-let pattern fix
Diffstat (limited to 'src/librustc_const_eval')
-rw-r--r--src/librustc_const_eval/check_match.rs19
-rw-r--r--src/librustc_const_eval/lib.rs1
2 files changed, 16 insertions, 4 deletions
diff --git a/src/librustc_const_eval/check_match.rs b/src/librustc_const_eval/check_match.rs
index 0b1f2465a4d..ce478f1a450 100644
--- a/src/librustc_const_eval/check_match.rs
+++ b/src/librustc_const_eval/check_match.rs
@@ -8,6 +8,7 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
+use std::ptr;
 use _match::{MatchCheckCtxt, Matrix, expand_pattern, is_useful};
 use _match::Usefulness::*;
 use _match::WitnessPreference::*;
@@ -302,10 +303,20 @@ fn check_arms<'a, 'tcx>(cx: &mut MatchCheckCtxt<'a, 'tcx>,
                             let &(ref first_arm_pats, _) = &arms[0];
                             let first_pat = &first_arm_pats[0];
                             let span = first_pat.0.span;
-                            struct_span_err!(cx.tcx.sess, span, E0165,
-                                             "irrefutable while-let pattern")
-                                .span_label(span, &format!("irrefutable pattern"))
-                                .emit();
+
+                            // check which arm we're on.
+                            if ptr::eq(first_arm_pats, pats) {
+                                let mut diagnostic = Diagnostic::new(Level::Warning,
+                                                                     "unreachable pattern");
+                                diagnostic.set_span(pat.span);
+                                cx.tcx.sess.add_lint_diagnostic(lint::builtin::UNREACHABLE_PATTERNS,
+                                                                hir_pat.id, diagnostic);
+                            } else {
+                                struct_span_err!(cx.tcx.sess, span, E0165,
+                                                 "irrefutable while-let pattern")
+                                    .span_label(span, &format!("irrefutable pattern"))
+                                    .emit();
+                            }
                         },
 
                         hir::MatchSource::ForLoopDesugar |
diff --git a/src/librustc_const_eval/lib.rs b/src/librustc_const_eval/lib.rs
index 198e49daabc..7c579f44e79 100644
--- a/src/librustc_const_eval/lib.rs
+++ b/src/librustc_const_eval/lib.rs
@@ -30,6 +30,7 @@
 #![feature(box_syntax)]
 #![feature(const_fn)]
 #![feature(i128_type)]
+#![feature(ptr_eq)]
 
 extern crate arena;
 #[macro_use] extern crate syntax;