Skip to content

Commit b1387e7

Browse files
Don't skip mir typeck if body has errors
1 parent b3cbf7c commit b1387e7

File tree

1 file changed

+9
-27
lines changed
  • compiler/rustc_borrowck/src/type_check

1 file changed

+9
-27
lines changed

compiler/rustc_borrowck/src/type_check/mod.rs

+9-27
Original file line numberDiff line numberDiff line change
@@ -183,17 +183,10 @@ pub(crate) fn type_check<'mir, 'tcx>(
183183
&mut borrowck_context,
184184
);
185185

186-
let errors_reported = {
187-
let mut verifier = TypeVerifier::new(&mut checker, promoted);
188-
verifier.visit_body(&body);
189-
verifier.errors_reported
190-
};
191-
192-
if !errors_reported {
193-
// if verifier failed, don't do further checks to avoid ICEs
194-
checker.typeck_mir(body);
195-
}
186+
let mut verifier = TypeVerifier::new(&mut checker, promoted);
187+
verifier.visit_body(&body);
196188

189+
checker.typeck_mir(body);
197190
checker.equate_inputs_and_outputs(&body, universal_regions, &normalized_inputs_and_output);
198191
checker.check_signature_annotation(&body);
199192

@@ -294,7 +287,6 @@ struct TypeVerifier<'a, 'b, 'tcx> {
294287
cx: &'a mut TypeChecker<'b, 'tcx>,
295288
promoted: &'b IndexSlice<Promoted, Body<'tcx>>,
296289
last_span: Span,
297-
errors_reported: bool,
298290
}
299291

300292
impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
@@ -383,13 +375,11 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
383375
};
384376
};
385377

386-
if !self.errors_reported {
387-
let promoted_body = &self.promoted[promoted];
388-
self.sanitize_promoted(promoted_body, location);
378+
let promoted_body = &self.promoted[promoted];
379+
self.sanitize_promoted(promoted_body, location);
389380

390-
let promoted_ty = promoted_body.return_ty();
391-
check_err(self, promoted_body, ty, promoted_ty);
392-
}
381+
let promoted_ty = promoted_body.return_ty();
382+
check_err(self, promoted_body, ty, promoted_ty);
393383
} else {
394384
self.cx.ascribe_user_type(
395385
constant.literal.ty(),
@@ -483,9 +473,6 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
483473
for local_decl in &body.local_decls {
484474
self.sanitize_type(local_decl, local_decl.ty);
485475
}
486-
if self.errors_reported {
487-
return;
488-
}
489476
self.super_body(body);
490477
}
491478
}
@@ -495,7 +482,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
495482
cx: &'a mut TypeChecker<'b, 'tcx>,
496483
promoted: &'b IndexSlice<Promoted, Body<'tcx>>,
497484
) -> Self {
498-
TypeVerifier { promoted, last_span: cx.body.span, cx, errors_reported: false }
485+
TypeVerifier { promoted, last_span: cx.body.span, cx }
499486
}
500487

501488
fn body(&self) -> &Body<'tcx> {
@@ -529,7 +516,6 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
529516
for elem in place.projection.iter() {
530517
if place_ty.variant_index.is_none() {
531518
if let Err(guar) = place_ty.ty.error_reported() {
532-
assert!(self.errors_reported);
533519
return PlaceTy::from_ty(self.tcx().ty_error(guar));
534520
}
535521
}
@@ -593,10 +579,7 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
593579

594580
self.visit_body(&promoted_body);
595581

596-
if !self.errors_reported {
597-
// if verifier failed, don't do further checks to avoid ICEs
598-
self.cx.typeck_mir(promoted_body);
599-
}
582+
self.cx.typeck_mir(promoted_body);
600583

601584
self.cx.body = parent_body;
602585
// Merge the outlives constraints back in, at the given location.
@@ -762,7 +745,6 @@ impl<'a, 'b, 'tcx> TypeVerifier<'a, 'b, 'tcx> {
762745
}
763746

764747
fn error(&mut self) -> Ty<'tcx> {
765-
self.errors_reported = true;
766748
self.tcx().ty_error_misc()
767749
}
768750

0 commit comments

Comments
 (0)