Guard variance inference for params bound in non-variance context.

Before adding a variance constrant for a given early-bound param,
check if it was meant to be inferred.

To support the above, added `fn is_to_be_inferred` to
`variance::ConstraintContext`.
This commit is contained in:
Felix S. Klock II 2014-04-01 18:31:04 +02:00
parent 787f4151e3
commit 0e30f07abc

View File

@ -533,6 +533,10 @@ impl<'a> ConstraintContext<'a> {
}
}
fn is_to_be_inferred(&self, param_id: ast::NodeId) -> bool {
self.terms_cx.inferred_map.contains_key(&param_id)
}
fn declared_variance(&self,
param_def_id: ast::DefId,
item_def_id: ast::DefId,
@ -788,8 +792,10 @@ impl<'a> ConstraintContext<'a> {
variance: VarianceTermPtr<'a>) {
match region {
ty::ReEarlyBound(param_id, _, _) => {
let index = self.inferred_index(param_id);
self.add_constraint(index, variance);
if self.is_to_be_inferred(param_id) {
let index = self.inferred_index(param_id);
self.add_constraint(index, variance);
}
}
ty::ReStatic => { }