about summary refs log tree commit diff
diff options
context:
space:
mode:
authorAriel Ben-Yehuda <ariel.byd@gmail.com>2016-06-07 13:13:20 +0300
committerAriel Ben-Yehuda <ariel.byd@gmail.com>2016-06-09 00:38:38 +0300
commitfcabfa97356c73cbb7c3301358013614000731d8 (patch)
treecd147b63569cffa00429a7dd51b85c3adbd8b816
parent5cf4139d21073731fa7f7226d941349dbacc16d6 (diff)
add an help message when using an old-style slice pattern
-rw-r--r--src/librustc_typeck/check/_match.rs17
-rw-r--r--src/test/compile-fail/pat-slice-old-style.rs22
2 files changed, 36 insertions, 3 deletions
diff --git a/src/librustc_typeck/check/_match.rs b/src/librustc_typeck/check/_match.rs
index 2fbeb43b8a3..0430585fe6d 100644
--- a/src/librustc_typeck/check/_match.rs
+++ b/src/librustc_typeck/check/_match.rs
@@ -345,9 +345,20 @@ impl<'a, 'gcx, 'tcx> PatCtxt<'a, 'gcx, 'tcx> {
                     ty::TySlice(inner_ty) => (inner_ty, expected_ty),
                     _ => {
                         if !expected_ty.references_error() {
-                            span_err!(tcx.sess, pat.span, E0529,
-                                      "expected an array or slice, found `{}`",
-                                      expected_ty);
+                            let mut err = struct_span_err!(
+                                tcx.sess, pat.span, E0529,
+                                "expected an array or slice, found `{}`",
+                                expected_ty);
+                            if let ty::TyRef(_, ty::TypeAndMut { mutbl: _, ty }) = expected_ty.sty {
+                                match ty.sty {
+                                    ty::TyArray(..) | ty::TySlice(..) => {
+                                        err.help("the semantics of slice patterns changed \
+                                                  recently; see issue #23121");
+                                    }
+                                    _ => {}
+                                }
+                            }
+                            err.emit();
                         }
                         (tcx.types.err, tcx.types.err)
                     }
diff --git a/src/test/compile-fail/pat-slice-old-style.rs b/src/test/compile-fail/pat-slice-old-style.rs
new file mode 100644
index 00000000000..ccb25d859ac
--- /dev/null
+++ b/src/test/compile-fail/pat-slice-old-style.rs
@@ -0,0 +1,22 @@
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![feature(slice_patterns)]
+
+fn slice_pat(x: &[u8]) {
+    // OLD!
+    match x {
+        [a, b..] => {}
+        //~^ ERROR expected an array or slice, found `&[u8]`
+        //~| HELP the semantics of slice patterns changed recently; see issue #23121
+    }
+}
+
+fn main() {}