Don't immediately panic if dropck fails without returning errors

Type lowering can give non-fatal errors that dropck then uses to suppress its own errors. Assume this is the cases when we can't find the error in borrowck.
This commit is contained in:
Matthew Jasper 2025-02-24 16:38:00 +00:00
parent e0be1a0262
commit a4a9fb412e
3 changed files with 37 additions and 5 deletions

View File

@ -4,7 +4,6 @@ use rustc_index::interval::IntervalSet;
use rustc_infer::infer::canonical::QueryRegionConstraints;
use rustc_infer::infer::outlives::for_liveness;
use rustc_middle::mir::{BasicBlock, Body, ConstraintCategory, HasLocalDecls, Local, Location};
use rustc_middle::span_bug;
use rustc_middle::traits::query::DropckOutlivesResult;
use rustc_middle::ty::relate::Relate;
use rustc_middle::ty::{Ty, TyCtxt, TypeVisitable, TypeVisitableExt};
@ -12,7 +11,7 @@ use rustc_mir_dataflow::ResultsCursor;
use rustc_mir_dataflow::impls::MaybeInitializedPlaces;
use rustc_mir_dataflow::move_paths::{HasMoveData, MoveData, MovePathIndex};
use rustc_mir_dataflow::points::{DenseLocationMap, PointIndex};
use rustc_span::{DUMMY_SP, Span};
use rustc_span::{DUMMY_SP, ErrorGuaranteed, Span};
use rustc_trait_selection::error_reporting::InferCtxtErrorExt;
use rustc_trait_selection::traits::ObligationCtxt;
use rustc_trait_selection::traits::query::dropck_outlives;
@ -608,7 +607,7 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
Ok(TypeOpOutput { output, constraints, .. }) => {
DropData { dropck_result: output, region_constraint_data: constraints }
}
Err(_) => {
Err(ErrorGuaranteed { .. }) => {
// We don't run dropck on HIR, and dropck looks inside fields of
// types, so there's no guarantee that it succeeds. We also
// can't rely on the the `ErrorGuaranteed` from `fully_perform` here
@ -631,10 +630,10 @@ impl<'tcx> LivenessContext<'_, '_, '_, 'tcx> {
}
};
// Could have no errors if a type lowering error, say, caused the query
// to fail.
if !errors.is_empty() {
typeck.infcx.err_ctxt().report_fulfillment_errors(errors);
} else {
span_bug!(span, "Rerunning drop data query produced no error.");
}
});
DropData { dropck_result: Default::default(), region_constraint_data: None }

View File

@ -0,0 +1,14 @@
// Regression test for #137329
trait B {
type C<'a>;
fn d<E>() -> F<E> {
todo!()
}
}
struct F<G> {
h: Option<<G as B>::C>,
//~^ ERROR missing generics for associated type `B::C`
}
fn main() {}

View File

@ -0,0 +1,19 @@
error[E0107]: missing generics for associated type `B::C`
--> $DIR/dropck-after-failed-type-lowering.rs:10:25
|
LL | h: Option<<G as B>::C>,
| ^ expected 1 lifetime argument
|
note: associated type defined here, with 1 lifetime parameter: `'a`
--> $DIR/dropck-after-failed-type-lowering.rs:4:10
|
LL | type C<'a>;
| ^ --
help: add missing lifetime argument
|
LL | h: Option<<G as B>::C<'a>>,
| ++++
error: aborting due to 1 previous error
For more information about this error, try `rustc --explain E0107`.