1
Fork 0

Don't call typeck if we have no typeck results

This has a 10000000% chance of us causing a cycle if we're not careful
This commit is contained in:
Michael Goulet 2022-12-21 05:49:12 +00:00
parent c6ef53477e
commit 85a9d85435

View file

@ -335,7 +335,7 @@ pub trait TypeErrCtxtExt<'tcx> {
err: &mut Diagnostic, err: &mut Diagnostic,
trait_pred: ty::PolyTraitPredicate<'tcx>, trait_pred: ty::PolyTraitPredicate<'tcx>,
); );
fn function_argument_obligation( fn note_function_argument_obligation(
&self, &self,
arg_hir_id: HirId, arg_hir_id: HirId,
err: &mut Diagnostic, err: &mut Diagnostic,
@ -2909,7 +2909,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
ref parent_code, ref parent_code,
.. ..
} => { } => {
self.function_argument_obligation( self.note_function_argument_obligation(
arg_hir_id, arg_hir_id,
err, err,
parent_code, parent_code,
@ -3141,7 +3141,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
); );
} }
} }
fn function_argument_obligation( fn note_function_argument_obligation(
&self, &self,
arg_hir_id: HirId, arg_hir_id: HirId,
err: &mut Diagnostic, err: &mut Diagnostic,
@ -3152,12 +3152,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
) { ) {
let tcx = self.tcx; let tcx = self.tcx;
let hir = tcx.hir(); let hir = tcx.hir();
if let Some(Node::Expr(expr)) = hir.find(arg_hir_id) { if let Some(Node::Expr(expr)) = hir.find(arg_hir_id)
let parent_id = hir.get_parent_item(arg_hir_id); && let Some(typeck_results) = &self.typeck_results
let typeck_results: &TypeckResults<'tcx> = match &self.typeck_results { {
Some(t) if t.hir_owner == parent_id => t,
_ => self.tcx.typeck(parent_id.def_id),
};
if let hir::Expr { kind: hir::ExprKind::Block(..), .. } = expr { if let hir::Expr { kind: hir::ExprKind::Block(..), .. } = expr {
let expr = expr.peel_blocks(); let expr = expr.peel_blocks();
let ty = typeck_results.expr_ty_adjusted_opt(expr).unwrap_or(tcx.ty_error()); let ty = typeck_results.expr_ty_adjusted_opt(expr).unwrap_or(tcx.ty_error());
@ -3219,9 +3216,9 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
// If the expression we're calling on is a binding, we want to point at the // If the expression we're calling on is a binding, we want to point at the
// `let` when talking about the type. Otherwise we'll point at every part // `let` when talking about the type. Otherwise we'll point at every part
// of the method chain with the type. // of the method chain with the type.
self.point_at_chain(binding_expr, typeck_results, type_diffs, param_env, err); self.point_at_chain(binding_expr, &typeck_results, type_diffs, param_env, err);
} else { } else {
self.point_at_chain(expr, typeck_results, type_diffs, param_env, err); self.point_at_chain(expr, &typeck_results, type_diffs, param_env, err);
} }
} }
let call_node = hir.find(call_hir_id); let call_node = hir.find(call_hir_id);