diff --git a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs index 12e8be41614bd..dc35d5eb89c95 100644 --- a/compiler/rustc_borrowck/src/type_check/liveness/trace.rs +++ b/compiler/rustc_borrowck/src/type_check/liveness/trace.rs @@ -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 } diff --git a/tests/ui/dropck/dropck-after-failed-type-lowering.rs b/tests/ui/dropck/dropck-after-failed-type-lowering.rs new file mode 100644 index 0000000000000..2441e26fec96c --- /dev/null +++ b/tests/ui/dropck/dropck-after-failed-type-lowering.rs @@ -0,0 +1,14 @@ +// Regression test for #137329 + +trait B { + type C<'a>; + fn d() -> F { + todo!() + } +} +struct F { + h: Option<::C>, + //~^ ERROR missing generics for associated type `B::C` +} + +fn main() {} diff --git a/tests/ui/dropck/dropck-after-failed-type-lowering.stderr b/tests/ui/dropck/dropck-after-failed-type-lowering.stderr new file mode 100644 index 0000000000000..56ea72de0c5f2 --- /dev/null +++ b/tests/ui/dropck/dropck-after-failed-type-lowering.stderr @@ -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<::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<::C<'a>>, + | ++++ + +error: aborting due to 1 previous error + +For more information about this error, try `rustc --explain E0107`.