Skip to content

Commit 0247fae

Browse files
committed
Add bound_impl_trait_ref
1 parent 6c05e8d commit 0247fae

File tree

8 files changed

+28
-25
lines changed

8 files changed

+28
-25
lines changed

compiler/rustc_middle/src/ty/print/mod.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::ty::subst::{GenericArg, Subst};
2-
use crate::ty::{self, DefIdTree, EarlyBinder, Ty, TyCtxt};
2+
use crate::ty::{self, DefIdTree, Ty, TyCtxt};
33

44
use rustc_data_structures::fx::FxHashSet;
55
use rustc_data_structures::sso::SsoHashSet;
@@ -116,14 +116,14 @@ pub trait Printer<'tcx>: Sized {
116116
DefPathData::Impl => {
117117
let generics = self.tcx().generics_of(def_id);
118118
let self_ty = self.tcx().bound_type_of(def_id);
119-
let impl_trait_ref = self.tcx().impl_trait_ref(def_id);
119+
let impl_trait_ref = self.tcx().bound_impl_trait_ref(def_id);
120120
let (self_ty, impl_trait_ref) = if substs.len() >= generics.count() {
121121
(
122122
self_ty.subst(self.tcx(), substs),
123-
EarlyBinder(impl_trait_ref).subst(self.tcx(), substs),
123+
impl_trait_ref.map(|i| i.subst(self.tcx(), substs)),
124124
)
125125
} else {
126-
(self_ty.0, impl_trait_ref)
126+
(self_ty.0, impl_trait_ref.map(|i| i.0))
127127
};
128128
self.print_impl_path(def_id, substs, self_ty, impl_trait_ref)
129129
}

compiler/rustc_middle/src/ty/util.rs

+4
Original file line numberDiff line numberDiff line change
@@ -600,6 +600,10 @@ impl<'tcx> TyCtxt<'tcx> {
600600
pub fn bound_fn_sig(self, def_id: DefId) -> EarlyBinder<ty::PolyFnSig<'tcx>> {
601601
EarlyBinder(self.fn_sig(def_id))
602602
}
603+
604+
pub fn bound_impl_trait_ref(self, def_id: DefId) -> Option<EarlyBinder<ty::TraitRef<'tcx>>> {
605+
self.impl_trait_ref(def_id).map(|i| EarlyBinder(i))
606+
}
603607
}
604608

605609
struct OpaqueTypeExpander<'tcx> {

compiler/rustc_trait_selection/src/traits/coherence.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ use rustc_middle::traits::specialization_graph::OverlapMode;
2323
use rustc_middle::ty::fast_reject::{self, TreatParams};
2424
use rustc_middle::ty::fold::TypeFoldable;
2525
use rustc_middle::ty::subst::Subst;
26-
use rustc_middle::ty::{self, EarlyBinder, ImplSubject, Ty, TyCtxt};
26+
use rustc_middle::ty::{self, ImplSubject, Ty, TyCtxt};
2727
use rustc_span::symbol::sym;
2828
use rustc_span::DUMMY_SP;
2929
use std::fmt::Debug;
@@ -136,7 +136,7 @@ fn with_fresh_ty_vars<'cx, 'tcx>(
136136
let header = ty::ImplHeader {
137137
impl_def_id,
138138
self_ty: tcx.bound_type_of(impl_def_id).subst(tcx, impl_substs),
139-
trait_ref: EarlyBinder(tcx.impl_trait_ref(impl_def_id)).subst(tcx, impl_substs),
139+
trait_ref: tcx.bound_impl_trait_ref(impl_def_id).map(|i| i.subst(tcx, impl_substs)),
140140
predicates: tcx.predicates_of(impl_def_id).instantiate(tcx, impl_substs).predicates,
141141
};
142142

compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs

+2-3
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::infer::InferCtxt;
55
use rustc_hir as hir;
66
use rustc_hir::def_id::DefId;
77
use rustc_middle::ty::subst::{Subst, SubstsRef};
8-
use rustc_middle::ty::{self, EarlyBinder, GenericParamDefKind};
8+
use rustc_middle::ty::{self, GenericParamDefKind};
99
use rustc_span::symbol::sym;
1010
use std::iter;
1111

@@ -45,8 +45,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
4545

4646
self.tcx.for_each_relevant_impl(trait_ref.def_id, trait_self_ty, |def_id| {
4747
let impl_substs = self.fresh_substs_for_item(obligation.cause.span, def_id);
48-
let impl_trait_ref =
49-
EarlyBinder(tcx.impl_trait_ref(def_id).unwrap()).subst(tcx, impl_substs);
48+
let impl_trait_ref = tcx.bound_impl_trait_ref(def_id).unwrap().subst(tcx, impl_substs);
5049

5150
let impl_self_ty = impl_trait_ref.self_ty();
5251

compiler/rustc_trait_selection/src/traits/select/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -2066,12 +2066,12 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
20662066
impl_def_id: DefId,
20672067
obligation: &TraitObligation<'tcx>,
20682068
) -> Result<Normalized<'tcx, SubstsRef<'tcx>>, ()> {
2069-
let impl_trait_ref = self.tcx().impl_trait_ref(impl_def_id).unwrap();
2069+
let impl_trait_ref = self.tcx().bound_impl_trait_ref(impl_def_id).unwrap();
20702070

20712071
// Before we create the substitutions and everything, first
20722072
// consider a "quick reject". This avoids creating more types
20732073
// and so forth that we need to.
2074-
if self.fast_reject_trait_refs(obligation, &impl_trait_ref) {
2074+
if self.fast_reject_trait_refs(obligation, &impl_trait_ref.0) {
20752075
return Err(());
20762076
}
20772077

@@ -2081,7 +2081,7 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> {
20812081

20822082
let impl_substs = self.infcx.fresh_substs_for_item(obligation.cause.span, impl_def_id);
20832083

2084-
let impl_trait_ref = EarlyBinder(impl_trait_ref).subst(self.tcx(), impl_substs);
2084+
let impl_trait_ref = impl_trait_ref.subst(self.tcx(), impl_substs);
20852085

20862086
debug!(?impl_trait_ref);
20872087

compiler/rustc_trait_selection/src/traits/specialize/mod.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use rustc_errors::{struct_span_err, EmissionGuarantee};
2020
use rustc_hir::def_id::{DefId, LocalDefId};
2121
use rustc_middle::lint::LintDiagnosticBuilder;
2222
use rustc_middle::ty::subst::{InternalSubsts, Subst, SubstsRef};
23-
use rustc_middle::ty::{self, EarlyBinder, ImplSubject, TyCtxt};
23+
use rustc_middle::ty::{self, ImplSubject, TyCtxt};
2424
use rustc_session::lint::builtin::COHERENCE_LEAK_CHECK;
2525
use rustc_session::lint::builtin::ORDER_DEPENDENT_TRAIT_OBJECTS;
2626
use rustc_span::{Span, DUMMY_SP};
@@ -84,8 +84,8 @@ pub fn translate_substs<'a, 'tcx>(
8484
"translate_substs({:?}, {:?}, {:?}, {:?})",
8585
param_env, source_impl, source_substs, target_node
8686
);
87-
let source_trait_ref = EarlyBinder(infcx.tcx.impl_trait_ref(source_impl).unwrap())
88-
.subst(infcx.tcx, &source_substs);
87+
let source_trait_ref =
88+
infcx.tcx.bound_impl_trait_ref(source_impl).unwrap().subst(infcx.tcx, &source_substs);
8989

9090
// translate the Self and Param parts of the substitution, since those
9191
// vary across impls

compiler/rustc_traits/src/chalk/db.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -310,8 +310,8 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
310310
let bound_vars = bound_vars_for_item(self.interner.tcx, def_id);
311311
let binders = binders_for(self.interner, bound_vars);
312312

313-
let trait_ref = self.interner.tcx.impl_trait_ref(def_id).expect("not an impl");
314-
let trait_ref = EarlyBinder(trait_ref).subst(self.interner.tcx, bound_vars);
313+
let trait_ref = self.interner.tcx.bound_impl_trait_ref(def_id).expect("not an impl");
314+
let trait_ref = trait_ref.subst(self.interner.tcx, bound_vars);
315315

316316
let where_clauses = self.where_clauses_for(def_id, bound_vars);
317317

@@ -352,11 +352,11 @@ impl<'tcx> chalk_solve::RustIrDatabase<RustInterner<'tcx>> for RustIrDatabase<'t
352352
let all_impls = self.interner.tcx.all_impls(def_id);
353353
let matched_impls = all_impls.filter(|impl_def_id| {
354354
use chalk_ir::could_match::CouldMatch;
355-
let trait_ref = self.interner.tcx.impl_trait_ref(*impl_def_id).unwrap();
355+
let trait_ref = self.interner.tcx.bound_impl_trait_ref(*impl_def_id).unwrap();
356356
let bound_vars = bound_vars_for_item(self.interner.tcx, *impl_def_id);
357357

358-
let self_ty = trait_ref.self_ty();
359-
let self_ty = EarlyBinder(self_ty).subst(self.interner.tcx, bound_vars);
358+
let self_ty = trait_ref.map_bound(|t| t.self_ty());
359+
let self_ty = self_ty.subst(self.interner.tcx, bound_vars);
360360
let lowered_ty = self_ty.lower_into(self.interner);
361361

362362
parameters[0].assert_ty_ref(self.interner).could_match(

src/librustdoc/clean/blanket_impl.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -34,15 +34,15 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
3434
trait_def_id,
3535
impl_def_id
3636
);
37-
let trait_ref = cx.tcx.impl_trait_ref(impl_def_id).unwrap();
38-
let is_param = matches!(trait_ref.self_ty().kind(), ty::Param(_));
37+
let trait_ref = cx.tcx.bound_impl_trait_ref(impl_def_id).unwrap();
38+
let is_param = matches!(trait_ref.0.self_ty().kind(), ty::Param(_));
3939
let may_apply = is_param && cx.tcx.infer_ctxt().enter(|infcx| {
4040
let substs = infcx.fresh_substs_for_item(DUMMY_SP, item_def_id);
4141
let ty = ty.subst(infcx.tcx, substs);
4242
let param_env = EarlyBinder(param_env).subst(infcx.tcx, substs);
4343

4444
let impl_substs = infcx.fresh_substs_for_item(DUMMY_SP, impl_def_id);
45-
let trait_ref = EarlyBinder(trait_ref).subst(infcx.tcx, impl_substs);
45+
let trait_ref = trait_ref.subst(infcx.tcx, impl_substs);
4646

4747
// Require the type the impl is implemented on to match
4848
// our type, and ignore the impl if there was a mismatch.
@@ -115,15 +115,15 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> {
115115
),
116116
// FIXME(eddyb) compute both `trait_` and `for_` from
117117
// the post-inference `trait_ref`, as it's more accurate.
118-
trait_: Some(trait_ref.clean(cx)),
118+
trait_: Some(trait_ref.0.clean(cx)),
119119
for_: ty.0.clean(cx),
120120
items: cx.tcx
121121
.associated_items(impl_def_id)
122122
.in_definition_order()
123123
.map(|x| x.clean(cx))
124124
.collect::<Vec<_>>(),
125125
polarity: ty::ImplPolarity::Positive,
126-
kind: ImplKind::Blanket(box trait_ref.self_ty().clean(cx)),
126+
kind: ImplKind::Blanket(box trait_ref.0.self_ty().clean(cx)),
127127
}),
128128
cfg: None,
129129
});

0 commit comments

Comments
 (0)