Skip to content

Commit c09f5b6

Browse files
committed
Add mk_canonical_var_infos_from_iter.
It's missing, and is useful in two places.
1 parent 11c2c59 commit c09f5b6

File tree

3 files changed

+28
-23
lines changed

3 files changed

+28
-23
lines changed

compiler/rustc_middle/src/ty/codec.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -270,9 +270,9 @@ impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<D> for ty::Region<'tcx> {
270270
impl<'tcx, D: TyDecoder<I = TyCtxt<'tcx>>> Decodable<D> for CanonicalVarInfos<'tcx> {
271271
fn decode(decoder: &mut D) -> Self {
272272
let len = decoder.read_usize();
273-
let interned: Vec<CanonicalVarInfo<'tcx>> =
274-
(0..len).map(|_| Decodable::decode(decoder)).collect();
275-
decoder.interner().mk_canonical_var_infos(&interned)
273+
decoder.interner().mk_canonical_var_infos_from_iter(
274+
(0..len).map::<CanonicalVarInfo<'tcx>, _>(|_| Decodable::decode(decoder)),
275+
)
276276
}
277277
}
278278

compiler/rustc_middle/src/ty/context.rs

+8
Original file line numberDiff line numberDiff line change
@@ -2253,6 +2253,14 @@ impl<'tcx> TyCtxt<'tcx> {
22532253
T::collect_and_apply(iter, |xs| self.mk_substs(xs))
22542254
}
22552255

2256+
pub fn mk_canonical_var_infos_from_iter<I, T>(self, iter: I) -> T::Output
2257+
where
2258+
I: Iterator<Item = T>,
2259+
T: CollectAndApply<CanonicalVarInfo<'tcx>, &'tcx List<CanonicalVarInfo<'tcx>>>,
2260+
{
2261+
T::collect_and_apply(iter, |xs| self.mk_canonical_var_infos(xs))
2262+
}
2263+
22562264
pub fn mk_place_elems_from_iter<I, T>(self, iter: I) -> T::Output
22572265
where
22582266
I: Iterator<Item = T>,

compiler/rustc_traits/src/chalk/mod.rs

+17-20
Original file line numberDiff line numberDiff line change
@@ -102,31 +102,28 @@ pub(crate) fn evaluate_goal<'tcx>(
102102
.iter()
103103
.map(|p| p.lower_into(interner).fold_with(&mut reverse_param_substitutor)),
104104
);
105-
let variables: Vec<_> = binders
106-
.iter(interner)
107-
.map(|var| {
108-
let kind = match var.kind {
109-
chalk_ir::VariableKind::Ty(ty_kind) => CanonicalVarKind::Ty(match ty_kind {
110-
chalk_ir::TyVariableKind::General => CanonicalTyVarKind::General(
111-
ty::UniverseIndex::from_usize(var.skip_kind().counter),
112-
),
113-
chalk_ir::TyVariableKind::Integer => CanonicalTyVarKind::Int,
114-
chalk_ir::TyVariableKind::Float => CanonicalTyVarKind::Float,
115-
}),
116-
chalk_ir::VariableKind::Lifetime => CanonicalVarKind::Region(
105+
let variables = binders.iter(interner).map(|var| {
106+
let kind = match var.kind {
107+
chalk_ir::VariableKind::Ty(ty_kind) => CanonicalVarKind::Ty(match ty_kind {
108+
chalk_ir::TyVariableKind::General => CanonicalTyVarKind::General(
117109
ty::UniverseIndex::from_usize(var.skip_kind().counter),
118110
),
119-
// FIXME(compiler-errors): We don't currently have a way of turning
120-
// a Chalk ty back into a rustc ty, right?
121-
chalk_ir::VariableKind::Const(_) => todo!(),
122-
};
123-
CanonicalVarInfo { kind }
124-
})
125-
.collect();
111+
chalk_ir::TyVariableKind::Integer => CanonicalTyVarKind::Int,
112+
chalk_ir::TyVariableKind::Float => CanonicalTyVarKind::Float,
113+
}),
114+
chalk_ir::VariableKind::Lifetime => {
115+
CanonicalVarKind::Region(ty::UniverseIndex::from_usize(var.skip_kind().counter))
116+
}
117+
// FIXME(compiler-errors): We don't currently have a way of turning
118+
// a Chalk ty back into a rustc ty, right?
119+
chalk_ir::VariableKind::Const(_) => todo!(),
120+
};
121+
CanonicalVarInfo { kind }
122+
});
126123
let max_universe = binders.iter(interner).map(|v| v.skip_kind().counter).max().unwrap_or(0);
127124
let sol = Canonical {
128125
max_universe: ty::UniverseIndex::from_usize(max_universe),
129-
variables: tcx.mk_canonical_var_infos(&variables),
126+
variables: tcx.mk_canonical_var_infos_from_iter(variables),
130127
value: QueryResponse {
131128
var_values: CanonicalVarValues { var_values },
132129
region_constraints: QueryRegionConstraints::default(),

0 commit comments

Comments
 (0)