Skip to content

Commit 24bee00

Browse files
committed
add force_instantiate_unchecked method
1 parent 4b69edc commit 24bee00

File tree

1 file changed

+59
-0
lines changed

1 file changed

+59
-0
lines changed

src/librustc/infer/mod.rs

+59
Original file line numberDiff line numberDiff line change
@@ -1230,6 +1230,65 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
12301230
self.inlined_shallow_resolve(typ)
12311231
}
12321232

1233+
/// A hacky sort of method used by the NLL type-relating code:
1234+
///
1235+
/// - `var` must be some unbound type variable.
1236+
/// - `value` must be a suitable type to use as its value.
1237+
///
1238+
/// `var` will then be equated with `value`. Note that this
1239+
/// sidesteps a number of important checks, such as the "occurs
1240+
/// check" that prevents cyclic types, so it is important not to
1241+
/// use this method during regular type-check.
1242+
pub fn force_instantiate_unchecked(&self, var: Ty<'tcx>, value: Ty<'tcx>) {
1243+
match (&var.sty, &value.sty) {
1244+
(&ty::Infer(ty::TyVar(vid)), _) => {
1245+
let mut type_variables = self.type_variables.borrow_mut();
1246+
1247+
// In NLL, we don't have type inference variables
1248+
// floating around, so we can do this rather imprecise
1249+
// variant of the occurs-check.
1250+
assert!(!value.has_infer_types());
1251+
1252+
type_variables.instantiate(vid, value);
1253+
}
1254+
1255+
(&ty::Infer(ty::IntVar(vid)), &ty::Int(value)) => {
1256+
let mut int_unification_table = self.int_unification_table.borrow_mut();
1257+
int_unification_table
1258+
.unify_var_value(vid, Some(ty::IntVarValue::IntType(value)))
1259+
.unwrap_or_else(|_| {
1260+
bug!("failed to unify int var `{:?}` with `{:?}`", vid, value);
1261+
});
1262+
}
1263+
1264+
(&ty::Infer(ty::IntVar(vid)), &ty::Uint(value)) => {
1265+
let mut int_unification_table = self.int_unification_table.borrow_mut();
1266+
int_unification_table
1267+
.unify_var_value(vid, Some(ty::IntVarValue::UintType(value)))
1268+
.unwrap_or_else(|_| {
1269+
bug!("failed to unify int var `{:?}` with `{:?}`", vid, value);
1270+
});
1271+
}
1272+
1273+
(&ty::Infer(ty::FloatVar(vid)), &ty::Float(value)) => {
1274+
let mut float_unification_table = self.float_unification_table.borrow_mut();
1275+
float_unification_table
1276+
.unify_var_value(vid, Some(ty::FloatVarValue(value)))
1277+
.unwrap_or_else(|_| {
1278+
bug!("failed to unify float var `{:?}` with `{:?}`", vid, value)
1279+
});
1280+
}
1281+
1282+
_ => {
1283+
bug!(
1284+
"force_instantiate_unchecked invoked with bad combination: var={:?} value={:?}",
1285+
var,
1286+
value,
1287+
);
1288+
}
1289+
}
1290+
}
1291+
12331292
pub fn resolve_type_vars_if_possible<T>(&self, value: &T) -> T
12341293
where
12351294
T: TypeFoldable<'tcx>,

0 commit comments

Comments
 (0)