about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorFelix S. Klock II <pnkfelix@pnkfx.org>2014-04-01 18:31:04 +0200
committerFelix S. Klock II <pnkfelix@pnkfx.org>2014-04-17 11:25:46 +0200
commit0e30f07abc76587f676e91770b7630ac9727b2cb (patch)
tree6ee7303660128568f955e6217c5b6f815ac656cb /src
parent787f4151e3ac32ffe455c2d3fd991def36be9758 (diff)
downloadrust-0e30f07abc76587f676e91770b7630ac9727b2cb.tar.gz
rust-0e30f07abc76587f676e91770b7630ac9727b2cb.zip
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`.
Diffstat (limited to 'src')
-rw-r--r--src/librustc/middle/typeck/variance.rs10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/librustc/middle/typeck/variance.rs b/src/librustc/middle/typeck/variance.rs
index c6c79608f6c..b008e59d510 100644
--- a/src/librustc/middle/typeck/variance.rs
+++ b/src/librustc/middle/typeck/variance.rs
@@ -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 => { }