Skip to content

Commit

Permalink
Don't immediately panic if dropck fails without returning errors
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
matthewjasper committed Feb 24, 2025
1 parent e0be1a0 commit a4a9fb4
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 5 deletions.
9 changes: 4 additions & 5 deletions compiler/rustc_borrowck/src/type_check/liveness/trace.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,14 @@ 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};
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;
Expand Down Expand Up @@ -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
Expand All @@ -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 }
Expand Down
14 changes: 14 additions & 0 deletions tests/ui/dropck/dropck-after-failed-type-lowering.rs
Original file line number Diff line number Diff line change
@@ -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() {}
19 changes: 19 additions & 0 deletions tests/ui/dropck/dropck-after-failed-type-lowering.stderr
Original file line number Diff line number Diff line change
@@ -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`.

0 comments on commit a4a9fb4

Please sign in to comment.