diff options
| author | varkor <github@varkor.com> | 2019-10-23 17:40:18 +0100 |
|---|---|---|
| committer | varkor <github@varkor.com> | 2019-10-23 17:40:18 +0100 |
| commit | 12f68e6987c4669b90a6cdac1643b99b6c677aea (patch) | |
| tree | 9e7d4ab946fe9facdde7d0293015a8fb668ce1c3 /src | |
| parent | cc7294c751fd700b77c3556eaae8507661f08f22 (diff) | |
| download | rust-12f68e6987c4669b90a6cdac1643b99b6c677aea.tar.gz rust-12f68e6987c4669b90a6cdac1643b99b6c677aea.zip | |
Account for const generalisation in combine
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/infer/combine.rs | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/librustc/infer/combine.rs b/src/librustc/infer/combine.rs index 2e724ac56ee..a6c3c2de139 100644 --- a/src/librustc/infer/combine.rs +++ b/src/librustc/infer/combine.rs @@ -605,9 +605,21 @@ impl TypeRelation<'tcx> for Generalizer<'_, 'tcx> { match c.val { ConstValue::Infer(InferConst::Var(vid)) => { let mut variable_table = self.infcx.const_unification_table.borrow_mut(); - match variable_table.probe_value(vid).val.known() { - Some(u) => self.relate(&u, &u), - None => Ok(c), + let var_value = variable_table.probe_value(vid); + match var_value.val { + ConstVariableValue::Known { value: u } => self.relate(&u, &u), + ConstVariableValue::Unknown { universe } => { + if self.for_universe.can_name(universe) { + Ok(c) + } else { + let new_var_id = variable_table.new_key(ConstVarValue { + origin: var_value.origin, + val: ConstVariableValue::Unknown { universe: self.for_universe }, + }); + let u = self.tcx().mk_const_var(new_var_id, c.ty); + return Ok(u); + } + } } } _ => relate::super_relate_consts(self, c, c), |
