Skip to content

Commit 8b141a2

Browse files
committed
Add variance constraints for const params
1 parent ca8078d commit 8b141a2

File tree

1 file changed

+25
-5
lines changed

1 file changed

+25
-5
lines changed

compiler/rustc_typeck/src/variance/constraints.rs

+25-5
Original file line numberDiff line numberDiff line change
@@ -223,8 +223,8 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
223223
self.add_constraints_from_region(current, lt, variance_i)
224224
}
225225
GenericArgKind::Type(ty) => self.add_constraints_from_ty(current, ty, variance_i),
226-
GenericArgKind::Const(_) => {
227-
// Consts impose no constraints.
226+
GenericArgKind::Const(val) => {
227+
self.add_constraints_from_const(current, val, variance_i)
228228
}
229229
}
230230
}
@@ -263,7 +263,8 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
263263
self.add_constraints_from_mt(current, &ty::TypeAndMut { ty, mutbl }, variance);
264264
}
265265

266-
ty::Array(typ, _) => {
266+
ty::Array(typ, len) => {
267+
self.add_constraints_from_const(current, len, variance);
267268
self.add_constraints_from_ty(current, typ, variance);
268269
}
269270

@@ -385,13 +386,32 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> {
385386
self.add_constraints_from_region(current, lt, variance_i)
386387
}
387388
GenericArgKind::Type(ty) => self.add_constraints_from_ty(current, ty, variance_i),
388-
GenericArgKind::Const(_) => {
389-
// Consts impose no constraints.
389+
GenericArgKind::Const(val) => {
390+
self.add_constraints_from_const(current, val, variance)
390391
}
391392
}
392393
}
393394
}
394395

396+
/// Adds constraints appropriate for a const expression `val`
397+
/// in a context with ambient variance `variance`
398+
fn add_constraints_from_const(
399+
&mut self,
400+
current: &CurrentItem,
401+
val: &ty::Const<'tcx>,
402+
variance: VarianceTermPtr<'a>,
403+
) {
404+
debug!("add_constraints_from_const(val={:?}, variance={:?})", val, variance);
405+
406+
match &val.val {
407+
ty::ConstKind::Unevaluated(uv) => {
408+
let substs = uv.substs(self.tcx());
409+
self.add_constraints_from_invariant_substs(current, substs, variance);
410+
}
411+
_ => {}
412+
}
413+
}
414+
395415
/// Adds constraints appropriate for a function with signature
396416
/// `sig` appearing in a context with ambient variance `variance`
397417
fn add_constraints_from_sig(

0 commit comments

Comments
 (0)