From fcabfa97356c73cbb7c3301358013614000731d8 Mon Sep 17 00:00:00 2001 From: Ariel Ben-Yehuda Date: Tue, 7 Jun 2016 13:13:20 +0300 Subject: [PATCH] add an help message when using an old-style slice pattern --- src/librustc_typeck/check/_match.rs | 17 ++++++++++++--- src/test/compile-fail/pat-slice-old-style.rs | 22 ++++++++++++++++++++ 2 files changed, 36 insertions(+), 3 deletions(-) create mode 100644 src/test/compile-fail/pat-slice-old-style.rs 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 or the MIT license +// , 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() {}