Rollup merge of #111747 - compiler-errors:structural-probe-side-effects, r=fee1-dead
Don't structurally resolve during method ambiguity in probe See comment in UI test for reason for the failure. This is all on the error path anyways, not really sure what the assertion is there to achieve anyways... Fixes #111739
This commit is contained in:
commit
01cc9caffe
3 changed files with 71 additions and 5 deletions
|
@ -12,6 +12,7 @@ use rustc_hir::def::DefKind;
|
|||
use rustc_hir_analysis::autoderef::{self, Autoderef};
|
||||
use rustc_infer::infer::canonical::OriginalQueryValues;
|
||||
use rustc_infer::infer::canonical::{Canonical, QueryResponse};
|
||||
use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282;
|
||||
use rustc_infer::infer::DefineOpaqueTypes;
|
||||
use rustc_infer::infer::{self, InferOk, TyCtxtInferExt};
|
||||
use rustc_middle::middle::stability;
|
||||
|
@ -448,15 +449,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
|
|||
);
|
||||
}
|
||||
} else {
|
||||
// Encountered a real ambiguity, so abort the lookup. If `ty` is not
|
||||
// an `Err`, report the right "type annotations needed" error pointing
|
||||
// to it.
|
||||
// Ended up encountering a type variable when doing autoderef,
|
||||
// but it may not be a type variable after processing obligations
|
||||
// in our local `FnCtxt`, so don't call `structurally_resolved_type`.
|
||||
let ty = &bad_ty.ty;
|
||||
let ty = self
|
||||
.probe_instantiate_query_response(span, &orig_values, ty)
|
||||
.unwrap_or_else(|_| span_bug!(span, "instantiating {:?} failed?", ty));
|
||||
let ty = self.structurally_resolved_type(span, ty.value);
|
||||
assert!(matches!(ty.kind(), ty::Error(_)));
|
||||
let ty = self.resolve_vars_if_possible(ty.value);
|
||||
let guar = match *ty.kind() {
|
||||
ty::Infer(ty::TyVar(_)) => self
|
||||
.err_ctxt()
|
||||
.emit_inference_failure_err(self.body_id, span, ty.into(), E0282, true)
|
||||
.emit(),
|
||||
ty::Error(guar) => guar,
|
||||
_ => bug!("unexpected bad final type in method autoderef"),
|
||||
};
|
||||
self.demand_eqtype(span, ty, self.tcx.ty_error(guar));
|
||||
return Err(MethodError::NoMatch(NoMatchData {
|
||||
static_candidates: Vec::new(),
|
||||
unsatisfied_predicates: Vec::new(),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue