Don't skip mir typeck if body has errors
This commit is contained in:
parent
b3cbf7c835
commit
b1387e776c
@ -183,17 +183,10 @@ pub(crate) fn type_check<'mir, 'tcx>(
|
||||
&mut borrowck_context,
|
||||
);
|
||||
|
||||
let errors_reported = {
|
||||
let mut verifier = TypeVerifier::new(&mut checker, promoted);
|
||||
verifier.visit_body(&body);
|
||||
verifier.errors_reported
|
||||
};
|
||||
|
||||
if !errors_reported {
|
||||
// if verifier failed, don't do further checks to avoid ICEs
|
||||
checker.typeck_mir(body);
|
||||
}
|
||||
let mut verifier = TypeVerifier::new(&mut checker, promoted);
|
||||
verifier.visit_body(&body);
|
||||
|
||||
checker.typeck_mir(body);
|
||||
checker.equate_inputs_and_outputs(&body, universal_regions, &normalized_inputs_and_output);
|
||||
checker.check_signature_annotation(&body);
|
||||
|
||||
@ -294,7 +287,6 @@ struct TypeVerifier<'a, 'b, 'tcx> {
|
||||
cx: &'a mut TypeChecker<'b, 'tcx>,
|
||||
promoted: &'b IndexSlice<Promoted, Body<'tcx>>,
|
||||
last_span: Span,
|
||||
errors_reported: bool,
|
||||
}
|
||||
|
||||
impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> {
|
||||
@ -383,13 +375,11 @@ fn visit_constant(&mut self, constant: &Constant<'tcx>, location: Location) {
|
||||
};
|
||||
};
|
||||
|
||||
if !self.errors_reported {
|
||||
let promoted_body = &self.promoted[promoted];
|
||||
self.sanitize_promoted(promoted_body, location);
|
||||
let promoted_body = &self.promoted[promoted];
|
||||
self.sanitize_promoted(promoted_body, location);
|
||||
|
||||
let promoted_ty = promoted_body.return_ty();
|
||||
check_err(self, promoted_body, ty, promoted_ty);
|
||||
}
|
||||
let promoted_ty = promoted_body.return_ty();
|
||||
check_err(self, promoted_body, ty, promoted_ty);
|
||||
} else {
|
||||
self.cx.ascribe_user_type(
|
||||
constant.literal.ty(),
|
||||
@ -483,9 +473,6 @@ fn visit_body(&mut self, body: &Body<'tcx>) {
|
||||
for local_decl in &body.local_decls {
|
||||
self.sanitize_type(local_decl, local_decl.ty);
|
||||
}
|
||||
if self.errors_reported {
|
||||
return;
|
||||
}
|
||||
self.super_body(body);
|
||||
}
|
||||
}
|
||||
@ -495,7 +482,7 @@ fn new(
|
||||
cx: &'a mut TypeChecker<'b, 'tcx>,
|
||||
promoted: &'b IndexSlice<Promoted, Body<'tcx>>,
|
||||
) -> Self {
|
||||
TypeVerifier { promoted, last_span: cx.body.span, cx, errors_reported: false }
|
||||
TypeVerifier { promoted, last_span: cx.body.span, cx }
|
||||
}
|
||||
|
||||
fn body(&self) -> &Body<'tcx> {
|
||||
@ -529,7 +516,6 @@ fn sanitize_place(
|
||||
for elem in place.projection.iter() {
|
||||
if place_ty.variant_index.is_none() {
|
||||
if let Err(guar) = place_ty.ty.error_reported() {
|
||||
assert!(self.errors_reported);
|
||||
return PlaceTy::from_ty(self.tcx().ty_error(guar));
|
||||
}
|
||||
}
|
||||
@ -593,10 +579,7 @@ fn sanitize_promoted(&mut self, promoted_body: &'b Body<'tcx>, location: Locatio
|
||||
|
||||
self.visit_body(&promoted_body);
|
||||
|
||||
if !self.errors_reported {
|
||||
// if verifier failed, don't do further checks to avoid ICEs
|
||||
self.cx.typeck_mir(promoted_body);
|
||||
}
|
||||
self.cx.typeck_mir(promoted_body);
|
||||
|
||||
self.cx.body = parent_body;
|
||||
// Merge the outlives constraints back in, at the given location.
|
||||
@ -762,7 +745,6 @@ fn sanitize_projection(
|
||||
}
|
||||
|
||||
fn error(&mut self) -> Ty<'tcx> {
|
||||
self.errors_reported = true;
|
||||
self.tcx().ty_error_misc()
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user