//! We walk the set of items and, for each member, generate new constraints.
use hir::def_id::DefId;
-use rustc::mir::interpret::ConstValue;
use rustc::ty::subst::{SubstsRef, UnpackedKind};
use rustc::ty::{self, Ty, TyCtxt};
use rustc::hir;
UnpackedKind::Type(ty) => {
self.add_constraints_from_ty(current, ty, variance_i)
}
- UnpackedKind::Const(ct) => {
- self.add_constraints_from_const(current, ct, variance_i)
+ UnpackedKind::Const(_) => {
+ // Consts impose no constraints.
}
}
}
self.add_constraints_from_mt(current, &ty::TypeAndMut { ty, mutbl }, variance);
}
- ty::Array(typ, len) => {
+ ty::Array(typ, _) => {
self.add_constraints_from_ty(current, typ, variance);
- self.add_constraints_from_const(current, len, variance);
}
ty::Slice(typ) => {
UnpackedKind::Type(ty) => {
self.add_constraints_from_ty(current, ty, variance_i)
}
- UnpackedKind::Const(ct) => {
- self.add_constraints_from_const(current, ct, variance_i)
+ UnpackedKind::Const(_) => {
+ // Consts impose no constraints.
}
}
}
}
}
- fn add_constraints_from_const(
- &mut self,
- current: &CurrentItem,
- ct: &ty::Const<'tcx>,
- variance: VarianceTermPtr<'a>
- ) {
- debug!(
- "add_constraints_from_const(ct={:?}, variance={:?})",
- ct,
- variance
- );
-
- self.add_constraints_from_ty(current, ct.ty, variance);
- if let ConstValue::Param(ref data) = ct.val {
- self.add_constraint(current, data.index, variance);
- }
- }
-
/// Adds constraints appropriate for a mutability-type pair
/// appearing in a context with ambient variance `variance`
fn add_constraints_from_mt(&mut self,
self.terms_cx.inferred_starts.iter().map(|(&id, &InferredIndex(start))| {
let def_id = tcx.hir().local_def_id_from_hir_id(id);
let generics = tcx.generics_of(def_id);
+ let count = generics.count();
- let mut variances = solutions[start..start+generics.count()].to_vec();
-
+ let mut variances = solutions[start..(start + count)].to_vec();
debug!("id={} variances={:?}", id, variances);
- // Functions can have unused type parameters: make those invariant.
+ // Const parameters are always invariant.
+ for (idx, param) in generics.params.iter().enumerate() {
+ if let ty::GenericParamDefKind::Const = param.kind {
+ variances[idx] = ty::Invariant;
+ }
+ }
+
+ // Functions are permitted to have unused generic parameters: make those invariant.
if let ty::FnDef(..) = tcx.type_of(def_id).sty {
for variance in &mut variances {
if *variance == ty::Bivariant {