impl<'a, 'tcx> TermsContext<'a, 'tcx> {
fn add_inferreds_for_item(&mut self,
item_id: ast::NodeId,
- has_self: bool,
generics: &hir::Generics) {
//! Add "inferreds" for the generic parameters declared on this
//! item. This has a lot of annoying parameters because we are
//!
// NB: In the code below for writing the results back into the
- // tcx, we rely on the fact that all inferreds for a particular
- // item are assigned continuous indices.
+ // `CrateVariancesMap`, we rely on the fact that all inferreds
+ // for a particular item are assigned continuous indices.
- let inferreds_on_entry = self.num_inferred();
-
- if has_self {
- self.add_inferred(item_id, 0, item_id);
- }
-
- for (i, p) in generics.lifetimes.iter().enumerate() {
+ for (p, i) in generics.lifetimes.iter().zip(0..) {
let id = p.lifetime.id;
- let i = has_self as usize + i;
self.add_inferred(item_id, i, id);
}
- for (i, p) in generics.ty_params.iter().enumerate() {
- let i = has_self as usize + generics.lifetimes.len() + i;
+ for (p, i) in generics.ty_params.iter().zip(generics.lifetimes.len()..) {
self.add_inferred(item_id, i, p.id);
}
-
- // If this item has no type or lifetime parameters,
- // then there are no variances to infer, so just
- // insert an empty entry into the variance map.
- // Arguably we could just leave the map empty in this
- // case but it seems cleaner to be able to distinguish
- // "invalid item id" from "item id with no
- // parameters".
- if self.num_inferred() == inferreds_on_entry {
- let item_def_id = self.tcx.hir.local_def_id(item_id);
- self.tcx.maps.variances_of.borrow_mut()
- .insert(item_def_id, self.empty_variances.clone());
- }
}
fn add_inferred(&mut self, item_id: ast::NodeId, index: usize, param_id: ast::NodeId) {
hir::ItemEnum(_, ref generics) |
hir::ItemStruct(_, ref generics) |
hir::ItemUnion(_, ref generics) => {
- self.add_inferreds_for_item(item.id, false, generics);
- }
- hir::ItemTrait(_, ref generics, ..) => {
- // Note: all inputs for traits are ultimately
- // constrained to be invariant. See `visit_item` in
- // the impl for `ConstraintContext` in `constraints.rs`.
- self.add_inferreds_for_item(item.id, true, generics);
+ self.add_inferreds_for_item(item.id, generics);
}
+ hir::ItemTrait(..) |
hir::ItemExternCrate(_) |
hir::ItemUse(..) |
hir::ItemDefaultImpl(..) |