Skip to content

Commit 715780d

Browse files
committed
Partly flatten the user-type loop in TypeVerifier::visit_local_decl
1 parent 92be4fc commit 715780d

File tree

1 file changed

+33
-30
lines changed
  • compiler/rustc_borrowck/src/type_check

1 file changed

+33
-30
lines changed

compiler/rustc_borrowck/src/type_check/mod.rs

+33-30
Original file line numberDiff line numberDiff line change
@@ -457,38 +457,41 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
457457
fn visit_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>) {
458458
self.super_local_decl(local, local_decl);
459459

460-
if let Some(user_ty) = &local_decl.user_ty {
461-
for (user_ty, span) in user_ty.projections_and_spans() {
462-
let ty = if !local_decl.is_nonref_binding() {
463-
// If we have a binding of the form `let ref x: T = ..`
464-
// then remove the outermost reference so we can check the
465-
// type annotation for the remaining type.
466-
if let ty::Ref(_, rty, _) = local_decl.ty.kind() {
467-
*rty
468-
} else {
469-
bug!("{:?} with ref binding has wrong type {}", local, local_decl.ty);
470-
}
460+
for (user_ty, span) in local_decl
461+
.user_ty
462+
.as_deref()
463+
.into_iter()
464+
.flat_map(UserTypeProjections::projections_and_spans)
465+
{
466+
let ty = if !local_decl.is_nonref_binding() {
467+
// If we have a binding of the form `let ref x: T = ..`
468+
// then remove the outermost reference so we can check the
469+
// type annotation for the remaining type.
470+
if let ty::Ref(_, rty, _) = local_decl.ty.kind() {
471+
*rty
471472
} else {
472-
local_decl.ty
473-
};
474-
475-
if let Err(terr) = self.typeck.relate_type_and_user_type(
476-
ty,
477-
ty::Invariant,
478-
user_ty,
479-
Locations::All(*span),
480-
ConstraintCategory::TypeAnnotation(AnnotationSource::Declaration),
481-
) {
482-
span_mirbug!(
483-
self,
484-
local,
485-
"bad user type on variable {:?}: {:?} != {:?} ({:?})",
486-
local,
487-
local_decl.ty,
488-
local_decl.user_ty,
489-
terr,
490-
);
473+
bug!("{:?} with ref binding has wrong type {}", local, local_decl.ty);
491474
}
475+
} else {
476+
local_decl.ty
477+
};
478+
479+
if let Err(terr) = self.typeck.relate_type_and_user_type(
480+
ty,
481+
ty::Invariant,
482+
user_ty,
483+
Locations::All(*span),
484+
ConstraintCategory::TypeAnnotation(AnnotationSource::Declaration),
485+
) {
486+
span_mirbug!(
487+
self,
488+
local,
489+
"bad user type on variable {:?}: {:?} != {:?} ({:?})",
490+
local,
491+
local_decl.ty,
492+
local_decl.user_ty,
493+
terr,
494+
);
492495
}
493496
}
494497
}

0 commit comments

Comments
 (0)