Skip to content

Commit 6ebdffb

Browse files
authored
Rollup merge of rust-lang#108754 - compiler-errors:retry, r=oli-obk
Retry `pred_known_to_hold_modulo_regions` with fulfillment if ambiguous Fixes rust-lang#108721 The problem here is that when we're checking `is_sized_raw` during codegen on some type that has a lot of opaques in it, something emits several nested obligations that are individually ambiguous, but when processed together in a loop then apply modulo regions. Since the `evaluate_predicates_recursively` inner loop doesn't process predicates until they stop changing, we return `EvaluatedToAmbig`, which makes the sized check return false incorrectly. See: https://github.com/rust-lang/rust/blob/f15f0ea73972786e426732c5b92ba9a904b866c4/compiler/rustc_trait_selection/src/traits/select/mod.rs#L596-L606 ... Compared to the analogous loop in the new solver: https://github.com/rust-lang/rust/blob/f15f0ea73972786e426732c5b92ba9a904b866c4/compiler/rustc_trait_selection/src/solve/mod.rs#L481-L512 To fix this, if we get ambiguous during `pred_known_to_hold_modulo_regions`, just retry the obligation in a fulfillment context. -- Unfortunately... I don't have a test for this. I've only tested this locally. Pending minimization :/ r? types
2 parents 767c1e7 + 118afdf commit 6ebdffb

File tree

1 file changed

+5
-3
lines changed
  • compiler/rustc_trait_selection/src/traits

1 file changed

+5
-3
lines changed

compiler/rustc_trait_selection/src/traits/mod.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -155,10 +155,12 @@ fn pred_known_to_hold_modulo_regions<'tcx>(
155155
predicate: pred.to_predicate(infcx.tcx),
156156
};
157157

158-
let result = infcx.predicate_must_hold_modulo_regions(&obligation);
158+
let result = infcx.evaluate_obligation_no_overflow(&obligation);
159159
debug!(?result);
160160

161-
if result && has_non_region_infer {
161+
if result.must_apply_modulo_regions() && !has_non_region_infer {
162+
true
163+
} else if result.may_apply() {
162164
// Because of inference "guessing", selection can sometimes claim
163165
// to succeed while the success requires a guess. To ensure
164166
// this function's result remains infallible, we must confirm
@@ -179,7 +181,7 @@ fn pred_known_to_hold_modulo_regions<'tcx>(
179181
}
180182
}
181183
} else {
182-
result
184+
false
183185
}
184186
}
185187

0 commit comments

Comments
 (0)