X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=src%2Flibrustc%2Fmiddle%2Fcheck_match.rs;h=f8786c7daaa80adf5fd9d7837d3f17de9b2376f1;hb=540fd3aa715c8af7efb4b06b7f9ab6da398deb62;hp=283c6264717f035b029f14da69755157826273cc;hpb=ee0157fd52cc6ff622b383f7dfa6408df441b780;p=rust.git diff --git a/src/librustc/middle/check_match.rs b/src/librustc/middle/check_match.rs index 283c6264717..f8786c7daaa 100644 --- a/src/librustc/middle/check_match.rs +++ b/src/librustc/middle/check_match.rs @@ -29,13 +29,13 @@ use middle::ty; use std::cmp::Ordering; use std::fmt; -use std::iter::{range_inclusive, FromIterator, IntoIterator, repeat}; -use std::slice; +use std::iter::{FromIterator, IntoIterator, repeat}; use rustc_front::hir; use rustc_front::hir::Pat; use rustc_front::visit::{self, Visitor, FnKind}; use rustc_front::util as front_util; +use rustc_back::slice; use syntax::ast::{self, DUMMY_NODE_ID, NodeId}; use syntax::ast_util; @@ -272,7 +272,7 @@ fn check_for_bindings_named_the_same_as_variants(cx: &MatchCheckCtxt, pat: &Pat) fn check_for_static_nan(cx: &MatchCheckCtxt, pat: &Pat) { front_util::walk_pat(pat, |p| { if let hir::PatLit(ref expr) = p.node { - match eval_const_expr_partial(cx.tcx, &**expr, ExprTypeChecked) { + match eval_const_expr_partial(cx.tcx, &**expr, ExprTypeChecked, None) { Ok(ConstVal::Float(f)) if f.is_nan() => { span_warn!(cx.tcx.sess, p.span, E0003, "unmatchable NaN in pattern, \ @@ -281,11 +281,10 @@ fn check_for_static_nan(cx: &MatchCheckCtxt, pat: &Pat) { Ok(_) => {} Err(err) => { - let subspan = p.span.lo <= err.span.lo && err.span.hi <= p.span.hi; span_err!(cx.tcx.sess, err.span, E0471, "constant evaluation error: {}", err.description()); - if !subspan { + if !p.span.contains(err.span) { cx.tcx.sess.span_note(p.span, "in pattern here") } @@ -519,7 +518,7 @@ fn construct_witness<'a,'tcx>(cx: &MatchCheckCtxt<'a,'tcx>, ctor: &Constructor, ty::TyEnum(adt, _) | ty::TyStruct(adt, _) => { let v = adt.variant_of_ctor(ctor); - if let VariantKind::Dict = v.kind() { + if let VariantKind::Struct = v.kind() { let field_pats: Vec<_> = v.fields.iter() .zip(pats) .filter(|&(_, ref pat)| pat.node != hir::PatWild(hir::PatWildSingle)) @@ -616,7 +615,7 @@ fn all_constructors(_cx: &MatchCheckCtxt, left_ty: Ty, ty::TyRef(_, ty::TypeAndMut { ty, .. }) => match ty.sty { ty::TySlice(_) => - range_inclusive(0, max_slice_length).map(|length| Slice(length)).collect(), + (0..max_slice_length+1).map(|length| Slice(length)).collect(), _ => vec![Single] }, @@ -791,7 +790,7 @@ fn pat_constructors(cx: &MatchCheckCtxt, p: &Pat, match left_ty.sty { ty::TyArray(_, _) => vec!(Single), _ => if slice.is_some() { - range_inclusive(before.len() + after.len(), max_slice_length) + (before.len() + after.len()..max_slice_length+1) .map(|length| Slice(length)) .collect() } else {