Stop being so bail-y in candidate assembly
This commit is contained in:
parent
2d0ea7956c
commit
0465f71d60
39 changed files with 328 additions and 240 deletions
|
@ -91,14 +91,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
} else if tcx.is_lang_item(def_id, LangItem::Sized) {
|
||||
// Sized is never implementable by end-users, it is
|
||||
// always automatically computed.
|
||||
|
||||
// FIXME: Consider moving this check to the top level as it
|
||||
// may also be useful for predicates other than `Sized`
|
||||
// Error type cannot possibly implement `Sized` (fixes #123154)
|
||||
if let Err(e) = obligation.predicate.skip_binder().self_ty().error_reported() {
|
||||
return Err(SelectionError::Overflow(e.into()));
|
||||
}
|
||||
|
||||
let sized_conditions = self.sized_conditions(obligation);
|
||||
self.assemble_builtin_bound_candidates(sized_conditions, &mut candidates);
|
||||
} else if tcx.is_lang_item(def_id, LangItem::Unsize) {
|
||||
|
@ -230,13 +222,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
) -> Result<(), SelectionError<'tcx>> {
|
||||
debug!(?stack.obligation);
|
||||
|
||||
// An error type will unify with anything. So, avoid
|
||||
// matching an error type with `ParamCandidate`.
|
||||
// This helps us avoid spurious errors like issue #121941.
|
||||
if stack.obligation.predicate.references_error() {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let bounds = stack
|
||||
.obligation
|
||||
.param_env
|
||||
|
@ -563,19 +548,6 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
|||
obligation: &PolyTraitObligation<'tcx>,
|
||||
candidates: &mut SelectionCandidateSet<'tcx>,
|
||||
) {
|
||||
// Essentially any user-written impl will match with an error type,
|
||||
// so creating `ImplCandidates` isn't useful. However, we might
|
||||
// end up finding a candidate elsewhere (e.g. a `BuiltinCandidate` for `Sized`)
|
||||
// This helps us avoid overflow: see issue #72839
|
||||
// Since compilation is already guaranteed to fail, this is just
|
||||
// to try to show the 'nicest' possible errors to the user.
|
||||
// We don't check for errors in the `ParamEnv` - in practice,
|
||||
// it seems to cause us to be overly aggressive in deciding
|
||||
// to give up searching for candidates, leading to spurious errors.
|
||||
if obligation.predicate.references_error() {
|
||||
return;
|
||||
}
|
||||
|
||||
let drcx = DeepRejectCtxt::relate_rigid_infer(self.tcx());
|
||||
let obligation_args = obligation.predicate.skip_binder().trait_ref.args;
|
||||
self.tcx().for_each_relevant_impl(
|
||||
|
|
|
@ -2487,10 +2487,6 @@ impl<'tcx> SelectionContext<'_, 'tcx> {
|
|||
let impl_args = self.infcx.fresh_args_for_item(obligation.cause.span, impl_def_id);
|
||||
|
||||
let trait_ref = impl_trait_header.trait_ref.instantiate(self.tcx(), impl_args);
|
||||
if trait_ref.references_error() {
|
||||
return Err(());
|
||||
}
|
||||
|
||||
debug!(?impl_trait_header);
|
||||
|
||||
let Normalized { value: impl_trait_ref, obligations: mut nested_obligations } =
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue