Skip to content

Commit

Permalink
Const parameters should impose no variance constraints
Browse files Browse the repository at this point in the history
  • Loading branch information
varkor committed Apr 17, 2019
1 parent 3b7dd97 commit 15033a9
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 29 deletions.
30 changes: 5 additions & 25 deletions src/librustc_typeck/variance/constraints.rs
Expand Up @@ -4,7 +4,6 @@
//! 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;
Expand Down Expand Up @@ -239,8 +238,8 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
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.
}
}
}
Expand Down Expand Up @@ -275,9 +274,8 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
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) => {
Expand Down Expand Up @@ -395,8 +393,8 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
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.
}
}
}
Expand Down Expand Up @@ -449,24 +447,6 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
}
}

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,
Expand Down
13 changes: 10 additions & 3 deletions src/librustc_typeck/variance/solve.rs
Expand Up @@ -85,12 +85,19 @@ impl<'a, 'tcx> SolveContext<'a, 'tcx> {
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 {
Expand Down
2 changes: 1 addition & 1 deletion src/librustc_typeck/variance/terms.rs
Expand Up @@ -119,7 +119,7 @@ impl<'a, 'tcx> TermsContext<'a, 'tcx> {
// for a particular item are assigned continuous indices.

let arena = self.arena;
self.inferred_terms.extend((start..start+count).map(|i| {
self.inferred_terms.extend((start..(start + count)).map(|i| {
&*arena.alloc(InferredTerm(InferredIndex(i)))
}));
}
Expand Down

0 comments on commit 15033a9

Please sign in to comment.