Rollup merge of #137302 - compiler-errors:stray-drop-regions, r=matthewjasper
Use a probe to avoid registering stray region obligations when re-checking drops in MIR typeck Fixes #137288. See the comment I left on the probe. I'm not totally sure why this depends on *both* an unconstrained type parameter in the impl and a type error for the self type, but I think the fix is at least theoretically well motivated. r? ```@matthewjasper```
This commit is contained in:
commit
3a04ec8c56
4 changed files with 42 additions and 9 deletions
|
@ -613,9 +613,14 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
|
||||||
// types, so there's no guarantee that it succeeds. We also
|
// types, so there's no guarantee that it succeeds. We also
|
||||||
// can't rely on the the `ErrorGuaranteed` from `fully_perform` here
|
// can't rely on the the `ErrorGuaranteed` from `fully_perform` here
|
||||||
// because it comes from delay_span_bug.
|
// because it comes from delay_span_bug.
|
||||||
let ocx = ObligationCtxt::new_with_diagnostics(&typeck.infcx);
|
//
|
||||||
let errors =
|
// Do this inside of a probe because we don't particularly care (or want)
|
||||||
match dropck_outlives::compute_dropck_outlives_with_errors(&ocx, op, span) {
|
// any region side-effects of this operation in our infcx.
|
||||||
|
typeck.infcx.probe(|_| {
|
||||||
|
let ocx = ObligationCtxt::new_with_diagnostics(&typeck.infcx);
|
||||||
|
let errors = match dropck_outlives::compute_dropck_outlives_with_errors(
|
||||||
|
&ocx, op, span,
|
||||||
|
) {
|
||||||
Ok(_) => ocx.select_all_or_error(),
|
Ok(_) => ocx.select_all_or_error(),
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
if e.is_empty() {
|
if e.is_empty() {
|
||||||
|
@ -626,11 +631,12 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if !errors.is_empty() {
|
if !errors.is_empty() {
|
||||||
typeck.infcx.err_ctxt().report_fulfillment_errors(errors);
|
typeck.infcx.err_ctxt().report_fulfillment_errors(errors);
|
||||||
} else {
|
} else {
|
||||||
span_bug!(span, "Rerunning drop data query produced no error.");
|
span_bug!(span, "Rerunning drop data query produced no error.");
|
||||||
}
|
}
|
||||||
|
});
|
||||||
DropData { dropck_result: Default::default(), region_constraint_data: None }
|
DropData { dropck_result: Default::default(), region_constraint_data: None }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -950,7 +950,7 @@ impl<'tcx> InferCtxt<'tcx> {
|
||||||
let inner = self.inner.borrow();
|
let inner = self.inner.borrow();
|
||||||
assert!(!UndoLogs::<UndoLog<'_>>::in_snapshot(&inner.undo_log));
|
assert!(!UndoLogs::<UndoLog<'_>>::in_snapshot(&inner.undo_log));
|
||||||
let storage = inner.region_constraint_storage.as_ref().expect("regions already resolved");
|
let storage = inner.region_constraint_storage.as_ref().expect("regions already resolved");
|
||||||
assert!(storage.data.is_empty());
|
assert!(storage.data.is_empty(), "{:#?}", storage.data);
|
||||||
// We clone instead of taking because borrowck still wants to use the
|
// We clone instead of taking because borrowck still wants to use the
|
||||||
// inference context after calling this for diagnostics and the new
|
// inference context after calling this for diagnostics and the new
|
||||||
// trait solver.
|
// trait solver.
|
||||||
|
|
18
tests/ui/borrowck/bad-drop-side-effects.rs
Normal file
18
tests/ui/borrowck/bad-drop-side-effects.rs
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
// Regression test for <https://github.com/rust-lang/rust/issues/137288>.
|
||||||
|
|
||||||
|
trait B {
|
||||||
|
type C;
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<U> B for &Missing {
|
||||||
|
//~^ ERROR cannot find type `Missing` in this scope
|
||||||
|
type C = ();
|
||||||
|
}
|
||||||
|
|
||||||
|
struct E<T: B> {
|
||||||
|
g: <T as B>::C,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn h(i: Box<E<&()>>) {}
|
||||||
|
|
||||||
|
fn main() {}
|
9
tests/ui/borrowck/bad-drop-side-effects.stderr
Normal file
9
tests/ui/borrowck/bad-drop-side-effects.stderr
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
error[E0412]: cannot find type `Missing` in this scope
|
||||||
|
--> $DIR/bad-drop-side-effects.rs:7:16
|
||||||
|
|
|
||||||
|
LL | impl<U> B for &Missing {
|
||||||
|
| ^^^^^^^ not found in this scope
|
||||||
|
|
||||||
|
error: aborting due to 1 previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0412`.
|
Loading…
Add table
Add a link
Reference in a new issue