banish hir::GenericBound::LangItemTrait
This commit is contained in:
parent
ad00641b74
commit
fc010de26b
12 changed files with 68 additions and 135 deletions
|
@ -134,17 +134,6 @@ impl<'tcx> dyn AstConv<'tcx> + '_ {
|
|||
only_self_bounds,
|
||||
);
|
||||
}
|
||||
&hir::GenericBound::LangItemTrait(lang_item, span, hir_id, args) => {
|
||||
self.instantiate_lang_item_trait_ref(
|
||||
lang_item,
|
||||
span,
|
||||
hir_id,
|
||||
args,
|
||||
param_ty,
|
||||
bounds,
|
||||
only_self_bounds,
|
||||
);
|
||||
}
|
||||
hir::GenericBound::Outlives(lifetime) => {
|
||||
let region = self.ast_region_to_region(lifetime, None);
|
||||
bounds.push_region_bound(
|
||||
|
|
|
@ -791,6 +791,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
self.prohibit_generics(trait_ref.path.segments.split_last().unwrap().1.iter(), |_| {});
|
||||
self.complain_about_internal_fn_trait(span, trait_def_id, trait_segment, false);
|
||||
|
||||
// TODO: inline
|
||||
self.instantiate_poly_trait_ref_inner(
|
||||
hir_id,
|
||||
span,
|
||||
|
@ -809,42 +810,6 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
|
|||
)
|
||||
}
|
||||
|
||||
pub(crate) fn instantiate_lang_item_trait_ref(
|
||||
&self,
|
||||
lang_item: hir::LangItem,
|
||||
span: Span,
|
||||
hir_id: hir::HirId,
|
||||
args: &GenericArgs<'_>,
|
||||
self_ty: Ty<'tcx>,
|
||||
bounds: &mut Bounds<'tcx>,
|
||||
only_self_bounds: OnlySelfBounds,
|
||||
) {
|
||||
let binding_span = Some(span);
|
||||
let constness = ty::BoundConstness::NotConst;
|
||||
let speculative = false;
|
||||
let trait_ref_span = span;
|
||||
let trait_def_id = self.tcx().require_lang_item(lang_item, Some(span));
|
||||
let trait_segment = &hir::PathSegment::invalid();
|
||||
let infer_args = false;
|
||||
|
||||
self.instantiate_poly_trait_ref_inner(
|
||||
hir_id,
|
||||
span,
|
||||
binding_span,
|
||||
constness,
|
||||
ty::ImplPolarity::Positive,
|
||||
bounds,
|
||||
speculative,
|
||||
trait_ref_span,
|
||||
trait_def_id,
|
||||
trait_segment,
|
||||
args,
|
||||
infer_args,
|
||||
self_ty,
|
||||
only_self_bounds,
|
||||
);
|
||||
}
|
||||
|
||||
fn ast_path_to_mono_trait_ref(
|
||||
&self,
|
||||
span: Span,
|
||||
|
|
|
@ -938,32 +938,6 @@ impl<'a, 'tcx> Visitor<'tcx> for BoundVarContext<'a, 'tcx> {
|
|||
}
|
||||
}
|
||||
|
||||
fn visit_param_bound(&mut self, bound: &'tcx hir::GenericBound<'tcx>) {
|
||||
match bound {
|
||||
hir::GenericBound::LangItemTrait(_, _, hir_id, _) => {
|
||||
// FIXME(jackh726): This is pretty weird. `LangItemTrait` doesn't go
|
||||
// through the regular poly trait ref code, so we don't get another
|
||||
// chance to introduce a binder. For now, I'm keeping the existing logic
|
||||
// of "if there isn't a Binder scope above us, add one", but I
|
||||
// imagine there's a better way to go about this.
|
||||
let (binders, scope_type) = self.poly_trait_ref_binder_info();
|
||||
|
||||
self.record_late_bound_vars(*hir_id, binders);
|
||||
let scope = Scope::Binder {
|
||||
hir_id: *hir_id,
|
||||
bound_vars: FxIndexMap::default(),
|
||||
s: self.scope,
|
||||
scope_type,
|
||||
where_bound_origin: None,
|
||||
};
|
||||
self.with(scope, |this| {
|
||||
intravisit::walk_param_bound(this, bound);
|
||||
});
|
||||
}
|
||||
_ => intravisit::walk_param_bound(self, bound),
|
||||
}
|
||||
}
|
||||
|
||||
fn visit_poly_trait_ref(&mut self, trait_ref: &'tcx hir::PolyTraitRef<'tcx>) {
|
||||
self.visit_poly_trait_ref_inner(trait_ref, NonLifetimeBinderAllowed::Allow);
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue