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)
}
--- /dev/null
+// 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() {}