Skip to content

Commit 729fbeb

Browse files
committed
typeck/pat.rs: extract diagnostics from check_pat_slice.
1 parent 2ab69ae commit 729fbeb

File tree

1 file changed

+54
-41
lines changed
  • src/librustc_typeck/check

1 file changed

+54
-41
lines changed

src/librustc_typeck/check/pat.rs

Lines changed: 54 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,59 +1012,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10121012
let expected_ty = self.structurally_resolved_type(span, expected);
10131013
let (inner_ty, slice_ty) = match expected_ty.sty {
10141014
ty::Array(inner_ty, size) => {
1015-
if let Some(size) = size.try_eval_usize(tcx, self.param_env) {
1015+
let slice_ty = if let Some(size) = size.try_eval_usize(tcx, self.param_env) {
10161016
let min_len = before.len() as u64 + after.len() as u64;
10171017
if slice.is_none() {
10181018
if min_len != size {
1019-
struct_span_err!(
1020-
tcx.sess, span, E0527,
1021-
"pattern requires {} elements but array has {}",
1022-
min_len, size
1023-
)
1024-
.span_label(span, format!("expected {} elements", size))
1025-
.emit();
1019+
self.error_scrutinee_inconsistent_length(span, min_len, size)
10261020
}
1027-
(inner_ty, tcx.types.err)
1021+
tcx.types.err
10281022
} else if let Some(rest) = size.checked_sub(min_len) {
1029-
(inner_ty, tcx.mk_array(inner_ty, rest))
1023+
tcx.mk_array(inner_ty, rest)
10301024
} else {
1031-
let msg = format!("pattern cannot match array of {} elements", size);
1032-
struct_span_err!(
1033-
tcx.sess, span, E0528,
1034-
"pattern requires at least {} elements but array has {}",
1035-
min_len, size
1036-
)
1037-
.span_label(span, msg)
1038-
.emit();
1039-
(inner_ty, tcx.types.err)
1025+
self.error_scrutinee_with_rest_inconsistent_length(span, min_len, size);
1026+
tcx.types.err
10401027
}
10411028
} else {
1042-
struct_span_err!(
1043-
tcx.sess, span, E0730,
1044-
"cannot pattern-match on an array without a fixed length",
1045-
)
1046-
.emit();
1047-
(inner_ty, tcx.types.err)
1048-
}
1029+
self.error_scrutinee_unfixed_length(span);
1030+
tcx.types.err
1031+
};
1032+
(inner_ty, slice_ty)
10491033
}
10501034
ty::Slice(inner_ty) => (inner_ty, expected_ty),
10511035
_ => {
10521036
if !expected_ty.references_error() {
1053-
let mut err = struct_span_err!(
1054-
tcx.sess, span, E0529,
1055-
"expected an array or slice, found `{}`",
1056-
expected_ty
1057-
);
1058-
if let ty::Ref(_, ty, _) = expected_ty.sty {
1059-
if let ty::Array(..) | ty::Slice(..) = ty.sty {
1060-
err.help("the semantics of slice patterns changed \
1061-
recently; see issue #62254");
1062-
}
1063-
}
1064-
1065-
let msg = format!("pattern cannot match with input type `{}`", expected_ty);
1066-
err.span_label(span, msg);
1067-
err.emit();
1037+
self.error_expected_array_or_slice(span, expected_ty);
10681038
}
10691039
(tcx.types.err, tcx.types.err)
10701040
}
@@ -1081,4 +1051,47 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
10811051
}
10821052
expected_ty
10831053
}
1054+
1055+
fn error_scrutinee_inconsistent_length(&self, span: Span, min_len: u64, size: u64) {
1056+
struct_span_err!(
1057+
self.tcx.sess, span, E0527,
1058+
"pattern requires {} elements but array has {}",
1059+
min_len, size
1060+
)
1061+
.span_label(span, format!("expected {} elements", size))
1062+
.emit();
1063+
}
1064+
1065+
fn error_scrutinee_with_rest_inconsistent_length(&self, span: Span, min_len: u64, size: u64) {
1066+
struct_span_err!(
1067+
self.tcx.sess, span, E0528,
1068+
"pattern requires at least {} elements but array has {}",
1069+
min_len, size
1070+
)
1071+
.span_label(span, format!("pattern cannot match array of {} elements", size))
1072+
.emit();
1073+
}
1074+
1075+
fn error_scrutinee_unfixed_length(&self, span: Span) {
1076+
struct_span_err!(
1077+
self.tcx.sess, span, E0730,
1078+
"cannot pattern-match on an array without a fixed length",
1079+
)
1080+
.emit();
1081+
}
1082+
1083+
fn error_expected_array_or_slice(&self, span: Span, expected_ty: Ty<'tcx>) {
1084+
let mut err = struct_span_err!(
1085+
self.tcx.sess, span, E0529,
1086+
"expected an array or slice, found `{}`",
1087+
expected_ty
1088+
);
1089+
if let ty::Ref(_, ty, _) = expected_ty.sty {
1090+
if let ty::Array(..) | ty::Slice(..) = ty.sty {
1091+
err.help("the semantics of slice patterns changed recently; see issue #62254");
1092+
}
1093+
}
1094+
err.span_label(span, format!("pattern cannot match with input type `{}`", expected_ty));
1095+
err.emit();
1096+
}
10841097
}

0 commit comments

Comments
 (0)