Skip to content

Commit 592f251

Browse files
committed
Split out generic arg equality for nll query response instantiation
1 parent bd12986 commit 592f251

File tree

1 file changed

+61
-40
lines changed

1 file changed

+61
-40
lines changed

compiler/rustc_infer/src/infer/canonical/query_response.rs

+61-40
Original file line numberDiff line numberDiff line change
@@ -262,50 +262,20 @@ impl<'tcx> InferCtxt<'tcx> {
262262

263263
let constraint_category = cause.to_constraint_category();
264264

265-
for (index, original_value) in original_values.var_values.iter().enumerate() {
265+
for (index, &original_value) in original_values.var_values.iter().enumerate() {
266266
// ...with the value `v_r` of that variable from the query.
267267
let result_value = query_response.instantiate_projected(self.tcx, &result_args, |v| {
268268
v.var_values[BoundVar::new(index)]
269269
});
270-
match (original_value.unpack(), result_value.unpack()) {
271-
(GenericArgKind::Lifetime(re1), GenericArgKind::Lifetime(re2))
272-
if re1.is_erased() && re2.is_erased() =>
273-
{
274-
// No action needed.
275-
}
276-
277-
(GenericArgKind::Lifetime(v_o), GenericArgKind::Lifetime(v_r)) => {
278-
// To make `v_o = v_r`, we emit `v_o: v_r` and `v_r: v_o`.
279-
if v_o != v_r {
280-
output_query_region_constraints
281-
.outlives
282-
.push((ty::OutlivesPredicate(v_o.into(), v_r), constraint_category));
283-
output_query_region_constraints
284-
.outlives
285-
.push((ty::OutlivesPredicate(v_r.into(), v_o), constraint_category));
286-
}
287-
}
288-
289-
(GenericArgKind::Type(v1), GenericArgKind::Type(v2)) => {
290-
obligations.extend(
291-
self.at(&cause, param_env)
292-
.eq(DefineOpaqueTypes::Yes, v1, v2)?
293-
.into_obligations(),
294-
);
295-
}
296-
297-
(GenericArgKind::Const(v1), GenericArgKind::Const(v2)) => {
298-
obligations.extend(
299-
self.at(&cause, param_env)
300-
.eq(DefineOpaqueTypes::Yes, v1, v2)?
301-
.into_obligations(),
302-
);
303-
}
304-
305-
_ => {
306-
bug!("kind mismatch, cannot unify {:?} and {:?}", original_value, result_value);
307-
}
308-
}
270+
self.equate_generic_arg(
271+
original_value,
272+
result_value,
273+
output_query_region_constraints,
274+
constraint_category,
275+
&mut obligations,
276+
cause,
277+
param_env,
278+
)?;
309279
}
310280

311281
// ...also include the other query region constraints from the query.
@@ -335,6 +305,57 @@ impl<'tcx> InferCtxt<'tcx> {
335305
Ok(InferOk { value: user_result, obligations })
336306
}
337307

308+
fn equate_generic_arg(
309+
&self,
310+
original_value: GenericArg<'tcx>,
311+
result_value: GenericArg<'tcx>,
312+
output_query_region_constraints: &mut QueryRegionConstraints<'tcx>,
313+
constraint_category: ConstraintCategory<'tcx>,
314+
obligations: &mut Vec<Obligation<'tcx, ty::Predicate<'tcx>>>,
315+
cause: &ObligationCause<'tcx>,
316+
param_env: ty::ParamEnv<'tcx>,
317+
) -> Result<(), ty::error::TypeError<'tcx>> {
318+
Ok(match (original_value.unpack(), result_value.unpack()) {
319+
(GenericArgKind::Lifetime(re1), GenericArgKind::Lifetime(re2))
320+
if re1.is_erased() && re2.is_erased() =>
321+
{
322+
// No action needed.
323+
}
324+
325+
(GenericArgKind::Lifetime(v_o), GenericArgKind::Lifetime(v_r)) => {
326+
// To make `v_o = v_r`, we emit `v_o: v_r` and `v_r: v_o`.
327+
if v_o != v_r {
328+
output_query_region_constraints
329+
.outlives
330+
.push((ty::OutlivesPredicate(v_o.into(), v_r), constraint_category));
331+
output_query_region_constraints
332+
.outlives
333+
.push((ty::OutlivesPredicate(v_r.into(), v_o), constraint_category));
334+
}
335+
}
336+
337+
(GenericArgKind::Type(v1), GenericArgKind::Type(v2)) => {
338+
obligations.extend(
339+
self.at(&cause, param_env)
340+
.eq(DefineOpaqueTypes::Yes, v1, v2)?
341+
.into_obligations(),
342+
);
343+
}
344+
345+
(GenericArgKind::Const(v1), GenericArgKind::Const(v2)) => {
346+
obligations.extend(
347+
self.at(&cause, param_env)
348+
.eq(DefineOpaqueTypes::Yes, v1, v2)?
349+
.into_obligations(),
350+
);
351+
}
352+
353+
_ => {
354+
bug!("kind mismatch, cannot unify {:?} and {:?}", original_value, result_value);
355+
}
356+
})
357+
}
358+
338359
/// Given the original values and the (canonicalized) result from
339360
/// computing a query, returns an instantiation that can be applied
340361
/// to the query result to convert the result back into the

0 commit comments

Comments
 (0)