Skip to content

Commit 3a51caa

Browse files
committed
typeck/pat.rs: extract check_pat_tuple.
1 parent c16248d commit 3a51caa

File tree

1 file changed

+58
-45
lines changed
  • src/librustc_typeck/check

1 file changed

+58
-45
lines changed

src/librustc_typeck/check/pat.rs

Lines changed: 58 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -105,48 +105,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
105105
expected_ty
106106
}
107107
PatKind::Tuple(ref elements, ddpos) => {
108-
let mut expected_len = elements.len();
109-
if ddpos.is_some() {
110-
// Require known type only when `..` is present.
111-
if let ty::Tuple(ref tys) =
112-
self.structurally_resolved_type(pat.span, expected).sty {
113-
expected_len = tys.len();
114-
}
115-
}
116-
let max_len = cmp::max(expected_len, elements.len());
117-
118-
let element_tys_iter = (0..max_len).map(|_| {
119-
Kind::from(self.next_ty_var(
120-
// FIXME: `MiscVariable` for now -- obtaining the span and name information
121-
// from all tuple elements isn't trivial.
122-
TypeVariableOrigin {
123-
kind: TypeVariableOriginKind::TypeInference,
124-
span: pat.span,
125-
},
126-
))
127-
});
128-
let element_tys = tcx.mk_substs(element_tys_iter);
129-
let pat_ty = tcx.mk_ty(ty::Tuple(element_tys));
130-
if let Some(mut err) = self.demand_eqtype_diag(pat.span, expected, pat_ty) {
131-
err.emit();
132-
// Walk subpatterns with an expected type of `err` in this case to silence
133-
// further errors being emitted when using the bindings. #50333
134-
let element_tys_iter = (0..max_len).map(|_| tcx.types.err);
135-
for (_, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) {
136-
self.check_pat_walk(elem, &tcx.types.err, def_bm, discrim_span);
137-
}
138-
tcx.mk_tup(element_tys_iter)
139-
} else {
140-
for (i, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) {
141-
self.check_pat_walk(
142-
elem,
143-
&element_tys[i].expect_ty(),
144-
def_bm,
145-
discrim_span,
146-
);
147-
}
148-
pat_ty
149-
}
108+
self.check_pat_tuple(pat.span, elements, ddpos, expected, def_bm, discrim_span)
150109
}
151110
PatKind::Box(ref inner) => {
152111
let inner_ty = self.next_ty_var(TypeVariableOrigin {
@@ -807,7 +766,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
807766
pat.hir_id);
808767
if !pat_ty.is_fn() {
809768
report_unexpected_res(res);
810-
return self.tcx.types.err;
769+
return tcx.types.err;
811770
}
812771

813772
let variant = match res {
@@ -833,8 +792,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
833792
self.demand_eqtype_pat(pat.span, expected, pat_ty, match_arm_pat_span);
834793

835794
// Type-check subpatterns.
836-
if subpats.len() == variant.fields.len() ||
837-
subpats.len() < variant.fields.len() && ddpos.is_some() {
795+
if subpats.len() == variant.fields.len()
796+
|| subpats.len() < variant.fields.len() && ddpos.is_some()
797+
{
838798
let substs = match pat_ty.sty {
839799
ty::Adt(_, substs) => substs,
840800
_ => bug!("unexpected pattern type {:?}", pat_ty),
@@ -861,6 +821,59 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
861821
pat_ty
862822
}
863823

824+
fn check_pat_tuple(
825+
&self,
826+
span: Span,
827+
elements: &'tcx [P<hir::Pat>],
828+
ddpos: Option<usize>,
829+
expected: Ty<'tcx>,
830+
def_bm: ty::BindingMode,
831+
discrim_span: Option<Span>,
832+
) -> Ty<'tcx> {
833+
let tcx = self.tcx;
834+
let mut expected_len = elements.len();
835+
if ddpos.is_some() {
836+
// Require known type only when `..` is present.
837+
if let ty::Tuple(ref tys) = self.structurally_resolved_type(span, expected).sty {
838+
expected_len = tys.len();
839+
}
840+
}
841+
let max_len = cmp::max(expected_len, elements.len());
842+
843+
let element_tys_iter = (0..max_len).map(|_| {
844+
Kind::from(self.next_ty_var(
845+
// FIXME: `MiscVariable` for now -- obtaining the span and name information
846+
// from all tuple elements isn't trivial.
847+
TypeVariableOrigin {
848+
kind: TypeVariableOriginKind::TypeInference,
849+
span,
850+
},
851+
))
852+
});
853+
let element_tys = tcx.mk_substs(element_tys_iter);
854+
let pat_ty = tcx.mk_ty(ty::Tuple(element_tys));
855+
if let Some(mut err) = self.demand_eqtype_diag(span, expected, pat_ty) {
856+
err.emit();
857+
// Walk subpatterns with an expected type of `err` in this case to silence
858+
// further errors being emitted when using the bindings. #50333
859+
let element_tys_iter = (0..max_len).map(|_| tcx.types.err);
860+
for (_, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) {
861+
self.check_pat_walk(elem, &tcx.types.err, def_bm, discrim_span);
862+
}
863+
tcx.mk_tup(element_tys_iter)
864+
} else {
865+
for (i, elem) in elements.iter().enumerate_and_adjust(max_len, ddpos) {
866+
self.check_pat_walk(
867+
elem,
868+
&element_tys[i].expect_ty(),
869+
def_bm,
870+
discrim_span,
871+
);
872+
}
873+
pat_ty
874+
}
875+
}
876+
864877
fn check_struct_pat_fields(
865878
&self,
866879
adt_ty: Ty<'tcx>,

0 commit comments

Comments
 (0)