mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 16:54:01 +00:00
Be better about bound vars
This commit is contained in:
parent
52f82354dc
commit
3f521b3542
@ -290,7 +290,7 @@ impl DeepRejectCtxt {
|
||||
// Impls cannot contain these types as these cannot be named directly.
|
||||
ty::FnDef(..) | ty::Closure(..) | ty::Generator(..) => false,
|
||||
|
||||
ty::Placeholder(..) => false,
|
||||
ty::Placeholder(..) | ty::Bound(..) => false,
|
||||
|
||||
// Depending on the value of `treat_obligation_params`, we either
|
||||
// treat generic parameters like placeholders or like inference variables.
|
||||
@ -310,7 +310,7 @@ impl DeepRejectCtxt {
|
||||
|
||||
ty::Error(_) => true,
|
||||
|
||||
ty::GeneratorWitness(..) | ty::GeneratorWitnessMIR(..) | ty::Bound(..) => {
|
||||
ty::GeneratorWitness(..) | ty::GeneratorWitnessMIR(..) => {
|
||||
bug!("unexpected obligation type: {:?}", obligation_ty)
|
||||
}
|
||||
}
|
||||
|
@ -60,7 +60,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
) -> Option<(DefId, SubstsRef<'tcx>)> {
|
||||
let tcx = self.tcx;
|
||||
let param_env = obligation.param_env;
|
||||
let trait_ref = tcx.erase_late_bound_regions(trait_ref);
|
||||
let trait_ref = self.instantiate_binder_with_placeholders(trait_ref);
|
||||
let trait_self_ty = trait_ref.self_ty();
|
||||
|
||||
let mut self_match_impls = vec![];
|
||||
|
@ -1060,7 +1060,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
|
||||
trait_pred: ty::PolyTraitPredicate<'tcx>,
|
||||
) -> bool {
|
||||
let self_ty = self.resolve_vars_if_possible(trait_pred.self_ty());
|
||||
let ty = self.tcx.erase_late_bound_regions(self_ty);
|
||||
let ty = self.instantiate_binder_with_placeholders(self_ty);
|
||||
let Some(generics) = self.tcx.hir().get_generics(obligation.cause.body_id) else { return false };
|
||||
let ty::Ref(_, inner_ty, hir::Mutability::Not) = ty.kind() else { return false };
|
||||
let ty::Param(param) = inner_ty.kind() else { return false };
|
||||
|
@ -396,7 +396,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
// still be provided by a manual implementation for
|
||||
// this trait and type.
|
||||
}
|
||||
ty::Param(..) | ty::Alias(ty::Projection, ..) => {
|
||||
ty::Param(..)
|
||||
| ty::Alias(ty::Projection, ..)
|
||||
| ty::Placeholder(..)
|
||||
| ty::Bound(..) => {
|
||||
// In these cases, we don't know what the actual
|
||||
// type is. Therefore, we cannot break it down
|
||||
// into its constituent types. So we don't
|
||||
@ -448,6 +451,10 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
|
||||
);
|
||||
|
||||
self.infcx.probe(|_snapshot| {
|
||||
if obligation.has_non_region_late_bound() {
|
||||
return;
|
||||
}
|
||||
|
||||
// The code below doesn't care about regions, and the
|
||||
// self-ty here doesn't escape this probe, so just erase
|
||||
// any LBR.
|
||||
|
Loading…
Reference in New Issue
Block a user