Convert delayed_bugs to bugs.

I have a suspicion that quite a few delayed bug paths are impossible to
reach, so I did an experiment.

I converted every `delayed_bug` to a `bug`, ran the full test suite,
then converted back every `bug` that was hit. A surprising number were
never hit.

The next commit will convert some more back, based on human judgment.
This commit is contained in:
Nicholas Nethercote 2024-02-17 01:23:40 +11:00
parent bb594538fc
commit 010f3944e0
44 changed files with 87 additions and 157 deletions

View file

@ -1636,9 +1636,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> {
if let Some(old_def_id) = self.orig_opt_local_def_id(param) { if let Some(old_def_id) = self.orig_opt_local_def_id(param) {
old_def_id old_def_id
} else { } else {
self.dcx() self.dcx().span_bug(lifetime.ident.span, "no def-id for fresh lifetime");
.span_delayed_bug(lifetime.ident.span, "no def-id for fresh lifetime");
continue;
} }
} }

View file

@ -628,7 +628,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> {
) => { ) => {
// HIR lowering sometimes doesn't catch this in erroneous // HIR lowering sometimes doesn't catch this in erroneous
// programs, so we need to use span_delayed_bug here. See #82126. // programs, so we need to use span_delayed_bug here. See #82126.
self.dcx().span_delayed_bug( self.dcx().span_bug(
hir_arg.span(), hir_arg.span(),
format!("unmatched arg and hir arg: found {kind:?} vs {hir_arg:?}"), format!("unmatched arg and hir arg: found {kind:?} vs {hir_arg:?}"),
); );

View file

@ -316,8 +316,7 @@ impl<'tcx> UniversalRegionRelationsBuilder<'_, 'tcx> {
.and(type_op::normalize::Normalize::new(ty)) .and(type_op::normalize::Normalize::new(ty))
.fully_perform(self.infcx, span) .fully_perform(self.infcx, span)
else { else {
tcx.dcx().span_delayed_bug(span, format!("failed to normalize {ty:?}")); tcx.dcx().span_bug(span, format!("failed to normalize {ty:?}"));
continue;
}; };
constraints.extend(c); constraints.extend(c);

View file

@ -154,8 +154,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
if argument_index + 1 >= body.local_decls.len() { if argument_index + 1 >= body.local_decls.len() {
self.tcx() self.tcx()
.dcx() .dcx()
.span_delayed_bug(body.span, "found more normalized_input_ty than local_decls"); .span_bug(body.span, "found more normalized_input_ty than local_decls");
break;
} }
// In MIR, argument N is stored in local N+1. // In MIR, argument N is stored in local N+1.

View file

@ -220,14 +220,13 @@ pub(crate) fn type_check<'mir, 'tcx>(
"opaque_type_map", "opaque_type_map",
), ),
); );
let mut hidden_type = infcx.resolve_vars_if_possible(decl.hidden_type); let hidden_type = infcx.resolve_vars_if_possible(decl.hidden_type);
trace!("finalized opaque type {:?} to {:#?}", opaque_type_key, hidden_type.ty.kind()); trace!("finalized opaque type {:?} to {:#?}", opaque_type_key, hidden_type.ty.kind());
if hidden_type.has_non_region_infer() { if hidden_type.has_non_region_infer() {
let reported = infcx.dcx().span_delayed_bug( infcx.dcx().span_bug(
decl.hidden_type.span, decl.hidden_type.span,
format!("could not resolve {:#?}", hidden_type.ty.kind()), format!("could not resolve {:#?}", hidden_type.ty.kind()),
); );
hidden_type.ty = Ty::new_error(infcx.tcx, reported);
} }
(opaque_type_key, hidden_type) (opaque_type_key, hidden_type)
@ -1089,10 +1088,9 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> {
); );
if result.is_err() { if result.is_err() {
self.infcx.dcx().span_delayed_bug( self.infcx
self.body.span, .dcx()
"failed re-defining predefined opaques in mir typeck", .span_bug(self.body.span, "failed re-defining predefined opaques in mir typeck");
);
} }
} }

View file

@ -393,11 +393,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
if ecx.tcx.is_ctfe_mir_available(def) { if ecx.tcx.is_ctfe_mir_available(def) {
Ok(ecx.tcx.mir_for_ctfe(def)) Ok(ecx.tcx.mir_for_ctfe(def))
} else if ecx.tcx.def_kind(def) == DefKind::AssocConst { } else if ecx.tcx.def_kind(def) == DefKind::AssocConst {
let guar = ecx ecx.tcx.dcx().bug("This is likely a const item that is missing from its impl");
.tcx
.dcx()
.delayed_bug("This is likely a const item that is missing from its impl");
throw_inval!(AlreadyReported(guar.into()));
} else { } else {
// `find_mir_or_eval_fn` checks that this is a const fn before even calling us, // `find_mir_or_eval_fn` checks that this is a const fn before even calling us,
// so this should be unreachable. // so this should be unreachable.
@ -626,7 +622,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir,
); );
// If this was a hard error, don't bother continuing evaluation. // If this was a hard error, don't bother continuing evaluation.
if is_error { if is_error {
let guard = ecx let guard: rustc_errors::ErrorGuaranteed = ecx
.tcx .tcx
.dcx() .dcx()
.span_delayed_bug(span, "The deny lint should have already errored"); .span_delayed_bug(span, "The deny lint should have already errored");

View file

@ -329,9 +329,7 @@ impl<'mir, 'tcx> Checker<'mir, 'tcx> {
fn check_static(&mut self, def_id: DefId, span: Span) { fn check_static(&mut self, def_id: DefId, span: Span) {
if self.tcx.is_thread_local_static(def_id) { if self.tcx.is_thread_local_static(def_id) {
self.tcx self.tcx.dcx().span_bug(span, "tls access is checked in `Rvalue::ThreadLocalRef`");
.dcx()
.span_delayed_bug(span, "tls access is checked in `Rvalue::ThreadLocalRef`");
} }
self.check_op_spanned(ops::StaticAccess, span) self.check_op_spanned(ops::StaticAccess, span)
} }

View file

@ -517,7 +517,7 @@ impl<'a, 'tcx> Visitor<'tcx> for CfgChecker<'a, 'tcx> {
fn visit_source_scope(&mut self, scope: SourceScope) { fn visit_source_scope(&mut self, scope: SourceScope) {
if self.body.source_scopes.get(scope).is_none() { if self.body.source_scopes.get(scope).is_none() {
self.tcx.dcx().span_delayed_bug( self.tcx.dcx().span_bug(
self.body.span, self.body.span,
format!( format!(
"broken MIR in {:?} ({}):\ninvalid source scope {:?}", "broken MIR in {:?} ({}):\ninvalid source scope {:?}",

View file

@ -1237,8 +1237,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
// trait reference. // trait reference.
let Some(trait_ref) = tcx.impl_trait_ref(impl_def_id) else { let Some(trait_ref) = tcx.impl_trait_ref(impl_def_id) else {
// A cycle error occurred, most likely. // A cycle error occurred, most likely.
let guar = tcx.dcx().span_delayed_bug(span, "expected cycle error"); tcx.dcx().span_bug(span, "expected cycle error");
return Err(guar);
}; };
self.one_bound_for_assoc_item( self.one_bound_for_assoc_item(

View file

@ -257,8 +257,7 @@ fn check_static_inhabited(tcx: TyCtxt<'_>, def_id: LocalDefId) {
fn check_opaque(tcx: TyCtxt<'_>, def_id: LocalDefId) { fn check_opaque(tcx: TyCtxt<'_>, def_id: LocalDefId) {
let item = tcx.hir().expect_item(def_id); let item = tcx.hir().expect_item(def_id);
let hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) = item.kind else { let hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) = item.kind else {
tcx.dcx().span_delayed_bug(item.span, "expected opaque item"); tcx.dcx().span_bug(item.span, "expected opaque item");
return;
}; };
// HACK(jynelson): trying to infer the type of `impl trait` breaks documenting // HACK(jynelson): trying to infer the type of `impl trait` breaks documenting
@ -382,10 +381,10 @@ fn check_opaque_meets_bounds<'tcx>(
Ok(()) => {} Ok(()) => {}
Err(ty_err) => { Err(ty_err) => {
let ty_err = ty_err.to_string(tcx); let ty_err = ty_err.to_string(tcx);
return Err(tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
span, span,
format!("could not unify `{hidden_ty}` with revealed type:\n{ty_err}"), format!("could not unify `{hidden_ty}` with revealed type:\n{ty_err}"),
)); );
} }
} }

View file

@ -734,11 +734,8 @@ pub(super) fn collect_return_position_impl_trait_in_trait_tys<'tcx>(
remapped_types.insert(def_id, ty::EarlyBinder::bind(ty)); remapped_types.insert(def_id, ty::EarlyBinder::bind(ty));
} }
Err(err) => { Err(err) => {
let reported = tcx.dcx().span_delayed_bug( tcx.dcx()
return_span, .span_bug(return_span, format!("could not fully resolve: {ty} => {err:?}"));
format!("could not fully resolve: {ty} => {err:?}"),
);
remapped_types.insert(def_id, ty::EarlyBinder::bind(Ty::new_error(tcx, reported)));
} }
} }
} }
@ -917,7 +914,7 @@ impl<'tcx> ty::FallibleTypeFolder<TyCtxt<'tcx>> for RemapHiddenTyRegions<'tcx> {
.with_note(format!("hidden type inferred to be `{}`", self.ty)) .with_note(format!("hidden type inferred to be `{}`", self.ty))
.emit() .emit()
} }
_ => self.tcx.dcx().delayed_bug("should've been able to remap region"), _ => self.tcx.dcx().bug("should've been able to remap region"),
}; };
return Err(guar); return Err(guar);
}; };
@ -1276,9 +1273,8 @@ fn compare_number_of_generics<'tcx>(
// inheriting the generics from will also have mismatched arguments, and // inheriting the generics from will also have mismatched arguments, and
// we'll report an error for that instead. Delay a bug for safety, though. // we'll report an error for that instead. Delay a bug for safety, though.
if trait_.is_impl_trait_in_trait() { if trait_.is_impl_trait_in_trait() {
return Err(tcx.dcx().delayed_bug( tcx.dcx()
"errors comparing numbers of generics of trait/impl functions were not emitted", .bug("errors comparing numbers of generics of trait/impl functions were not emitted");
));
} }
let matchings = [ let matchings = [

View file

@ -154,8 +154,7 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
trait_m_sig.inputs_and_output, trait_m_sig.inputs_and_output,
)); ));
if !ocx.select_all_or_error().is_empty() { if !ocx.select_all_or_error().is_empty() {
tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (selection)"); tcx.dcx().bug("encountered errors when checking RPITIT refinement (selection)");
return;
} }
let outlives_env = OutlivesEnvironment::with_bounds( let outlives_env = OutlivesEnvironment::with_bounds(
param_env, param_env,
@ -163,13 +162,11 @@ pub(super) fn check_refining_return_position_impl_trait_in_trait<'tcx>(
); );
let errors = infcx.resolve_regions(&outlives_env); let errors = infcx.resolve_regions(&outlives_env);
if !errors.is_empty() { if !errors.is_empty() {
tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (regions)"); tcx.dcx().bug("encountered errors when checking RPITIT refinement (regions)");
return;
} }
// Resolve any lifetime variables that may have been introduced during normalization. // Resolve any lifetime variables that may have been introduced during normalization.
let Ok((trait_bounds, impl_bounds)) = infcx.fully_resolve((trait_bounds, impl_bounds)) else { let Ok((trait_bounds, impl_bounds)) = infcx.fully_resolve((trait_bounds, impl_bounds)) else {
tcx.dcx().delayed_bug("encountered errors when checking RPITIT refinement (resolution)"); tcx.dcx().bug("encountered errors when checking RPITIT refinement (resolution)");
return;
}; };
// For quicker lookup, use an `IndexSet` (we don't use one earlier because // For quicker lookup, use an `IndexSet` (we don't use one earlier because

View file

@ -67,11 +67,10 @@ pub fn check_drop_impl(tcx: TyCtxt<'_>, drop_impl_did: DefId) -> Result<(), Erro
// already checked by coherence, but compilation may // already checked by coherence, but compilation may
// not have been terminated. // not have been terminated.
let span = tcx.def_span(drop_impl_did); let span = tcx.def_span(drop_impl_did);
let reported = tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
span, span,
format!("should have been rejected by coherence check: {dtor_self_type}"), format!("should have been rejected by coherence check: {dtor_self_type}"),
); );
Err(reported)
} }
} }
} }

View file

@ -1088,10 +1088,8 @@ fn check_type_defn<'tcx>(
let ty = tcx.type_of(variant.tail().did).instantiate_identity(); let ty = tcx.type_of(variant.tail().did).instantiate_identity();
let ty = tcx.erase_regions(ty); let ty = tcx.erase_regions(ty);
if ty.has_infer() { if ty.has_infer() {
tcx.dcx() // Unresolved type expression.
.span_delayed_bug(item.span, format!("inference variables in {ty:?}")); tcx.dcx().span_bug(item.span, format!("inference variables in {ty:?}"));
// Just treat unresolved type expression as if it needs drop.
true
} else { } else {
ty.needs_drop(tcx, tcx.param_env(item.owner_id)) ty.needs_drop(tcx, tcx.param_env(item.owner_id))
} }

View file

@ -315,7 +315,7 @@ pub(super) fn generics_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> ty::Generics {
if is_host_effect { if is_host_effect {
if let Some(idx) = host_effect_index { if let Some(idx) = host_effect_index {
tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
param.span, param.span,
format!("parent also has host effect param? index: {idx}, def: {def_id:?}"), format!("parent also has host effect param? index: {idx}, def: {def_id:?}"),
); );

View file

@ -1331,7 +1331,7 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
} }
} }
self.tcx.dcx().span_delayed_bug( self.tcx.dcx().span_bug(
lifetime_ref.ident.span, lifetime_ref.ident.span,
format!("Could not resolve {:?} in scope {:#?}", lifetime_ref, self.scope,), format!("Could not resolve {:?} in scope {:#?}", lifetime_ref, self.scope,),
); );
@ -1465,10 +1465,9 @@ impl<'a, 'tcx> BoundVarContext<'a, 'tcx> {
} }
} }
self.tcx.dcx().span_delayed_bug( self.tcx
self.tcx.hir().span(hir_id), .dcx()
format!("could not resolve {param_def_id:?}"), .span_bug(self.tcx.hir().span(hir_id), format!("could not resolve {param_def_id:?}"));
);
} }
#[instrument(level = "debug", skip(self))] #[instrument(level = "debug", skip(self))]

View file

@ -139,10 +139,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
| ty::Never | ty::Never
| ty::Dynamic(_, _, ty::DynStar) | ty::Dynamic(_, _, ty::DynStar)
| ty::Error(_) => { | ty::Error(_) => {
let guar = self self.dcx().span_bug(span, format!("`{t:?}` should be sized but is not?"));
.dcx()
.span_delayed_bug(span, format!("`{t:?}` should be sized but is not?"));
return Err(guar);
} }
}) })
} }

View file

@ -76,16 +76,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// While we don't allow *arbitrary* coercions here, we *do* allow // While we don't allow *arbitrary* coercions here, we *do* allow
// coercions from ! to `expected`. // coercions from ! to `expected`.
if ty.is_never() { if ty.is_never() {
if let Some(adjustments) = self.typeck_results.borrow().adjustments().get(expr.hir_id) { if let Some(_) = self.typeck_results.borrow().adjustments().get(expr.hir_id) {
let reported = self.dcx().span_delayed_bug( self.dcx()
expr.span, .span_bug(expr.span, "expression with never type wound up being adjusted");
"expression with never type wound up being adjusted",
);
return if let [Adjustment { kind: Adjust::NeverToAny, target }] = &adjustments[..] {
target.to_owned()
} else {
Ty::new_error(self.tcx(), reported)
};
} }
let adj_ty = self.next_ty_var(TypeVariableOrigin { let adj_ty = self.next_ty_var(TypeVariableOrigin {
@ -1325,7 +1318,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
// permit break with a value [1]. // permit break with a value [1].
if ctxt.coerce.is_none() && !ctxt.may_break { if ctxt.coerce.is_none() && !ctxt.may_break {
// [1] // [1]
self.dcx().span_delayed_bug(body.span, "no coercion, but loop may not break"); self.dcx().span_bug(body.span, "no coercion, but loop may not break");
} }
ctxt.coerce.map(|c| c.complete(self)).unwrap_or_else(|| Ty::new_unit(self.tcx)) ctxt.coerce.map(|c| c.complete(self)).unwrap_or_else(|| Ty::new_unit(self.tcx))
} }

View file

@ -48,8 +48,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let to = normalize(to); let to = normalize(to);
trace!(?from, ?to); trace!(?from, ?to);
if from.has_non_region_infer() || to.has_non_region_infer() { if from.has_non_region_infer() || to.has_non_region_infer() {
tcx.dcx().span_delayed_bug(span, "argument to transmute has inference variables"); tcx.dcx().span_bug(span, "argument to transmute has inference variables");
return;
} }
// Transmutes that are only changing lifetimes are always ok. // Transmutes that are only changing lifetimes are always ok.
if from == to { if from == to {

View file

@ -570,8 +570,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
_ => { _ => {
self.tcx() self.tcx()
.dcx() .dcx()
.span_delayed_bug(span, "struct or tuple struct pattern not applied to an ADT"); .span_bug(span, "struct or tuple struct pattern not applied to an ADT");
Err(())
} }
} }
} }
@ -583,8 +582,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> {
match ty.kind() { match ty.kind() {
ty::Tuple(args) => Ok(args.len()), ty::Tuple(args) => Ok(args.len()),
_ => { _ => {
self.tcx().dcx().span_delayed_bug(span, "tuple pattern not applied to a tuple"); self.tcx().dcx().span_bug(span, "tuple pattern not applied to a tuple");
Err(())
} }
} }
} }

View file

@ -804,11 +804,10 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
let trait_ref = principal.with_self_ty(self.tcx, self_ty); let trait_ref = principal.with_self_ty(self.tcx, self_ty);
self.elaborate_bounds(iter::once(trait_ref), |this, new_trait_ref, item| { self.elaborate_bounds(iter::once(trait_ref), |this, new_trait_ref, item| {
if new_trait_ref.has_non_region_bound_vars() { if new_trait_ref.has_non_region_bound_vars() {
this.dcx().span_delayed_bug( this.dcx().span_bug(
this.span, this.span,
"tried to select method from HRTB with non-lifetime bound vars", "tried to select method from HRTB with non-lifetime bound vars",
); );
return;
} }
let new_trait_ref = this.instantiate_bound_regions_with_erased(new_trait_ref); let new_trait_ref = this.instantiate_bound_regions_with_erased(new_trait_ref);

View file

@ -924,7 +924,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
span: item_span, span: item_span,
.. ..
})) => { })) => {
tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
*item_span, *item_span,
"auto trait is invoked with no method error, but no error reported?", "auto trait is invoked with no method error, but no error reported?",
); );

View file

@ -1085,10 +1085,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
let variant = match res { let variant = match res {
Res::Err => { Res::Err => {
let e = tcx.dcx().span_delayed_bug(pat.span, "`Res::Err` but no error emitted"); tcx.dcx().span_bug(pat.span, "`Res::Err` but no error emitted");
self.set_tainted_by_errors(e);
on_error(e);
return Ty::new_error(tcx, e);
} }
Res::Def(DefKind::AssocConst | DefKind::AssocFn, _) => { Res::Def(DefKind::AssocConst | DefKind::AssocFn, _) => {
let e = report_unexpected_res(res); let e = report_unexpected_res(res);

View file

@ -303,7 +303,7 @@ where
// Ignore this, we presume it will yield an error later, // Ignore this, we presume it will yield an error later,
// since if a type variable is not resolved by this point // since if a type variable is not resolved by this point
// it never will be. // it never will be.
self.tcx.dcx().span_delayed_bug( self.tcx.dcx().span_bug(
origin.span(), origin.span(),
format!("unresolved inference variable in outlives: {v:?}"), format!("unresolved inference variable in outlives: {v:?}"),
); );

View file

@ -175,11 +175,7 @@ impl<'cx, 'tcx> VerifyBoundCx<'cx, 'tcx> {
// Ignore this, we presume it will yield an error later, since // Ignore this, we presume it will yield an error later, since
// if a type variable is not resolved by this point it never // if a type variable is not resolved by this point it never
// will be. // will be.
self.tcx self.tcx.dcx().bug(format!("unresolved inference variable in outlives: {v:?}"));
.dcx()
.delayed_bug(format!("unresolved inference variable in outlives: {v:?}"));
// Add a bound that never holds.
VerifyBound::AnyBound(vec![])
} }
} }
} }

View file

@ -420,11 +420,9 @@ where
match b.kind() { match b.kind() {
ty::ConstKind::Infer(InferConst::Var(_)) if D::forbid_inference_vars() => { ty::ConstKind::Infer(InferConst::Var(_)) if D::forbid_inference_vars() => {
// Forbid inference variables in the RHS. // Forbid inference variables in the RHS.
self.infcx.dcx().span_delayed_bug( self.infcx
self.delegate.span(), .dcx()
format!("unexpected inference var {b:?}",), .span_bug(self.delegate.span(), format!("unexpected inference var {b:?}",));
);
Ok(a)
} }
// FIXME(invariance): see the related FIXME above. // FIXME(invariance): see the related FIXME above.
_ => self.infcx.super_combine_consts(self, a, b), _ => self.infcx.super_combine_consts(self, a, b),

View file

@ -410,8 +410,7 @@ impl<'tcx> TypeckResults<'tcx> {
pub fn extract_binding_mode(&self, s: &Session, id: HirId, sp: Span) -> Option<BindingMode> { pub fn extract_binding_mode(&self, s: &Session, id: HirId, sp: Span) -> Option<BindingMode> {
self.pat_binding_modes().get(id).copied().or_else(|| { self.pat_binding_modes().get(id).copied().or_else(|| {
s.dcx().span_delayed_bug(sp, "missing binding mode"); s.dcx().span_bug(sp, "missing binding mode");
None
}) })
} }

View file

@ -356,9 +356,7 @@ impl<'tcx> TyCtxt<'tcx> {
} }
let Some(item_id) = self.associated_item_def_ids(impl_did).first() else { let Some(item_id) = self.associated_item_def_ids(impl_did).first() else {
self.dcx() self.dcx().span_bug(self.def_span(impl_did), "Drop impl without drop function");
.span_delayed_bug(self.def_span(impl_did), "Drop impl without drop function");
return;
}; };
if let Some((old_item_id, _)) = dtor_candidate { if let Some((old_item_id, _)) = dtor_candidate {

View file

@ -42,7 +42,7 @@ fn opt_span_bug_fmt<S: Into<MultiSpan>>(
/// delayed bug, so what is the point of this? It exists to help us test the interaction of delayed /// delayed bug, so what is the point of this? It exists to help us test the interaction of delayed
/// bugs with the query system and incremental. /// bugs with the query system and incremental.
pub fn trigger_delayed_bug(tcx: TyCtxt<'_>, key: rustc_hir::def_id::DefId) { pub fn trigger_delayed_bug(tcx: TyCtxt<'_>, key: rustc_hir::def_id::DefId) {
tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
tcx.def_span(key), tcx.def_span(key),
"delayed bug triggered by #[rustc_error(delayed_bug_from_inside_query)]", "delayed bug triggered by #[rustc_error(delayed_bug_from_inside_query)]",
); );

View file

@ -110,15 +110,12 @@ fn lit_to_mir_constant<'tcx>(
let LitToConstInput { lit, ty, neg } = lit_input; let LitToConstInput { lit, ty, neg } = lit_input;
let trunc = |n| { let trunc = |n| {
let param_ty = ty::ParamEnv::reveal_all().and(ty); let param_ty = ty::ParamEnv::reveal_all().and(ty);
let width = let width = tcx
tcx.layout_of(param_ty) .layout_of(param_ty)
.map_err(|_| { .map_err(|_| {
LitToConstError::Reported(tcx.dcx().delayed_bug(format!( tcx.dcx().bug(format!("couldn't compute width of literal: {:?}", lit_input.lit))
"couldn't compute width of literal: {:?}", })?
lit_input.lit .size;
)))
})?
.size;
trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits()); trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits());
let result = width.truncate(n); let result = width.truncate(n);
trace!("trunc result: {}", result); trace!("trunc result: {}", result);

View file

@ -12,15 +12,12 @@ pub(crate) fn lit_to_const<'tcx>(
let trunc = |n| { let trunc = |n| {
let param_ty = ParamEnv::reveal_all().and(ty); let param_ty = ParamEnv::reveal_all().and(ty);
let width = let width = tcx
tcx.layout_of(param_ty) .layout_of(param_ty)
.map_err(|_| { .map_err(|_| {
LitToConstError::Reported(tcx.dcx().delayed_bug(format!( tcx.dcx().bug(format!("couldn't compute width of literal: {:?}", lit_input.lit))
"couldn't compute width of literal: {:?}", })?
lit_input.lit .size;
)))
})?
.size;
trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits()); trace!("trunc {} with size {} and shift {}", n, width.bits(), 128 - width.bits());
let result = width.truncate(n); let result = width.truncate(n);
trace!("trunc result: {}", result); trace!("trunc result: {}", result);
@ -59,15 +56,11 @@ pub(crate) fn lit_to_const<'tcx>(
} }
(ast::LitKind::Bool(b), ty::Bool) => ty::ValTree::from_scalar_int((*b).into()), (ast::LitKind::Bool(b), ty::Bool) => ty::ValTree::from_scalar_int((*b).into()),
(ast::LitKind::Float(n, _), ty::Float(fty)) => { (ast::LitKind::Float(n, _), ty::Float(fty)) => {
let bits = let bits = parse_float_into_scalar(*n, *fty, neg)
parse_float_into_scalar(*n, *fty, neg) .ok_or_else(|| {
.ok_or_else(|| { tcx.dcx().bug(format!("couldn't parse float literal: {:?}", lit_input.lit))
LitToConstError::Reported(tcx.dcx().delayed_bug(format!( })?
"couldn't parse float literal: {:?}", .assert_int();
lit_input.lit
)))
})?
.assert_int();
ty::ValTree::from_scalar_int(bits) ty::ValTree::from_scalar_int(bits)
} }
(ast::LitKind::Char(c), ty::Char) => ty::ValTree::from_scalar_int((*c).into()), (ast::LitKind::Char(c), ty::Char) => ty::ValTree::from_scalar_int((*c).into()),

View file

@ -175,7 +175,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> {
) -> Result<PatKind<'tcx>, ErrorGuaranteed> { ) -> Result<PatKind<'tcx>, ErrorGuaranteed> {
if lo_expr.is_none() && hi_expr.is_none() { if lo_expr.is_none() && hi_expr.is_none() {
let msg = "found twice-open range pattern (`..`) outside of error recovery"; let msg = "found twice-open range pattern (`..`) outside of error recovery";
return Err(self.tcx.dcx().span_delayed_bug(span, msg)); self.tcx.dcx().span_bug(span, msg);
} }
let (lo, lo_ascr, lo_inline) = self.lower_pattern_range_endpoint(lo_expr)?; let (lo, lo_ascr, lo_inline) = self.lower_pattern_range_endpoint(lo_expr)?;

View file

@ -1615,11 +1615,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform {
(args.discr_ty(tcx), coroutine_kind.movability() == hir::Movability::Movable) (args.discr_ty(tcx), coroutine_kind.movability() == hir::Movability::Movable)
} }
_ => { _ => {
tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(body.span, format!("unexpected coroutine type {coroutine_ty}"));
body.span,
format!("unexpected coroutine type {coroutine_ty}"),
);
return;
} }
}; };

View file

@ -380,7 +380,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> {
LookupResult::Parent(None) => {} LookupResult::Parent(None) => {}
LookupResult::Parent(Some(_)) => { LookupResult::Parent(Some(_)) => {
if !replace { if !replace {
self.tcx.dcx().span_delayed_bug( self.tcx.dcx().span_bug(
terminator.source_info.span, terminator.source_info.span,
format!("drop of untracked value {bb:?}"), format!("drop of untracked value {bb:?}"),
); );

View file

@ -3681,13 +3681,13 @@ impl<'a: 'ast, 'b, 'ast, 'tcx> LateResolutionVisitor<'a, 'b, 'ast, 'tcx> {
None None
} }
Res::SelfCtor(_) => { Res::SelfCtor(_) => {
// njn: remove comment?
// We resolve `Self` in pattern position as an ident sometimes during recovery, // We resolve `Self` in pattern position as an ident sometimes during recovery,
// so delay a bug instead of ICEing. // so delay a bug instead of ICEing.
self.r.dcx().span_delayed_bug( self.r.dcx().span_bug(
ident.span, ident.span,
"unexpected `SelfCtor` in pattern, expected identifier" "unexpected `SelfCtor` in pattern, expected identifier"
); );
None
} }
_ => span_bug!( _ => span_bug!(
ident.span, ident.span,

View file

@ -62,14 +62,12 @@ pub fn is_const_evaluatable<'tcx>(
match unexpanded_ct.kind() { match unexpanded_ct.kind() {
ty::ConstKind::Expr(_) => { ty::ConstKind::Expr(_) => {
// njn: ?
// FIXME(generic_const_exprs): we have a `ConstKind::Expr` which is fully concrete, // FIXME(generic_const_exprs): we have a `ConstKind::Expr` which is fully concrete,
// but currently it is not possible to evaluate `ConstKind::Expr` so we are unable // but currently it is not possible to evaluate `ConstKind::Expr` so we are unable
// to tell if it is evaluatable or not. For now we just ICE until this is // to tell if it is evaluatable or not. For now we just ICE until this is
// implemented. // implemented.
Err(NotConstEvaluatable::Error(tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(span, "evaluating `ConstKind::Expr` is not currently supported");
span,
"evaluating `ConstKind::Expr` is not currently supported",
)))
} }
ty::ConstKind::Unevaluated(uv) => { ty::ConstKind::Unevaluated(uv) => {
let concrete = infcx.const_eval_resolve(param_env, uv, Some(span)); let concrete = infcx.const_eval_resolve(param_env, uv, Some(span));

View file

@ -3313,7 +3313,7 @@ impl<'tcx> TypeErrCtxt<'_, 'tcx> {
expected_trait_ref.self_ty().error_reported()?; expected_trait_ref.self_ty().error_reported()?;
let Some(found_trait_ty) = found_trait_ref.self_ty().no_bound_vars() else { let Some(found_trait_ty) = found_trait_ref.self_ty().no_bound_vars() else {
return Err(self.dcx().delayed_bug("bound vars outside binder")); self.dcx().bug("bound vars outside binder");
}; };
let found_did = match *found_trait_ty.kind() { let found_did = match *found_trait_ty.kind() {

View file

@ -172,7 +172,7 @@ fn do_normalize_predicates<'tcx>(
// the normalized predicates. // the normalized predicates.
let errors = infcx.resolve_regions(&outlives_env); let errors = infcx.resolve_regions(&outlives_env);
if !errors.is_empty() { if !errors.is_empty() {
tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
span, span,
format!("failed region resolution while normalizing {elaborated_env:?}: {errors:?}"), format!("failed region resolution while normalizing {elaborated_env:?}: {errors:?}"),
); );

View file

@ -100,7 +100,7 @@ fn implied_outlives_bounds<'a, 'tcx>(
let errors = ocx.select_all_or_error(); let errors = ocx.select_all_or_error();
if !errors.is_empty() { if !errors.is_empty() {
infcx.dcx().span_delayed_bug( infcx.dcx().span_bug(
span, span,
"implied_outlives_bounds failed to solve obligations from instantiation", "implied_outlives_bounds failed to solve obligations from instantiation",
); );

View file

@ -645,7 +645,7 @@ pub fn compute_inherent_assoc_ty_args<'a, 'b, 'tcx>(
match selcx.infcx.at(&cause, param_env).eq(DefineOpaqueTypes::No, impl_ty, self_ty) { match selcx.infcx.at(&cause, param_env).eq(DefineOpaqueTypes::No, impl_ty, self_ty) {
Ok(mut ok) => obligations.append(&mut ok.obligations), Ok(mut ok) => obligations.append(&mut ok.obligations),
Err(_) => { Err(_) => {
tcx.dcx().span_delayed_bug( tcx.dcx().span_bug(
cause.span, cause.span,
format!( format!(
"{self_ty:?} was a subtype of {impl_ty:?} during selection but now it is not" "{self_ty:?} was a subtype of {impl_ty:?} during selection but now it is not"
@ -1190,11 +1190,10 @@ fn assemble_candidates_from_impls<'cx, 'tcx>(
ImplSource::Builtin(BuiltinImplSource::TraitUpcasting { .. }, _) ImplSource::Builtin(BuiltinImplSource::TraitUpcasting { .. }, _)
| ImplSource::Builtin(BuiltinImplSource::TupleUnsizing, _) => { | ImplSource::Builtin(BuiltinImplSource::TupleUnsizing, _) => {
// These traits have no associated types. // These traits have no associated types.
selcx.tcx().dcx().span_delayed_bug( selcx.tcx().dcx().span_bug(
obligation.cause.span, obligation.cause.span,
format!("Cannot project an associated type from `{impl_source:?}`"), format!("Cannot project an associated type from `{impl_source:?}`"),
); );
return Err(());
} }
}; };

View file

@ -82,7 +82,7 @@ where
let value = infcx.commit_if_ok(|_| { let value = infcx.commit_if_ok(|_| {
let ocx = ObligationCtxt::new(infcx); let ocx = ObligationCtxt::new(infcx);
let value = op(&ocx).map_err(|_| { let value = op(&ocx).map_err(|_| {
infcx.dcx().span_delayed_bug(span, format!("error performing operation: {name}")) infcx.dcx().span_bug(span, format!("error performing operation: {name}"))
})?; })?;
let errors = ocx.select_all_or_error(); let errors = ocx.select_all_or_error();
if errors.is_empty() { if errors.is_empty() {

View file

@ -190,10 +190,9 @@ where
} }
} }
if !progress { if !progress {
return Err(infcx.dcx().span_delayed_bug( infcx
span, .dcx()
format!("ambiguity processing {obligations:?} from {self:?}"), .span_bug(span, format!("ambiguity processing {obligations:?} from {self:?}"));
));
} }
} }

View file

@ -90,8 +90,7 @@ fn univariant_uninterned<'tcx>(
let dl = cx.data_layout(); let dl = cx.data_layout();
let pack = repr.pack; let pack = repr.pack;
if pack.is_some() && repr.align.is_some() { if pack.is_some() && repr.align.is_some() {
cx.tcx.dcx().delayed_bug("struct cannot be packed and aligned"); cx.tcx.dcx().bug("struct cannot be packed and aligned");
return Err(cx.tcx.arena.alloc(LayoutError::Unknown(ty)));
} }
cx.univariant(dl, fields, repr, kind).ok_or_else(|| error(cx, LayoutError::SizeOverflow(ty))) cx.univariant(dl, fields, repr, kind).ok_or_else(|| error(cx, LayoutError::SizeOverflow(ty)))

View file

@ -337,7 +337,7 @@ impl<'tcx> TypeVisitor<TyCtxt<'tcx>> for ImplTraitInAssocTypeCollector<'tcx> {
.instantiate(self.0.tcx, impl_args) .instantiate(self.0.tcx, impl_args)
.visit_with(self); .visit_with(self);
} else { } else {
self.0.tcx.dcx().span_delayed_bug( self.0.tcx.dcx().span_bug(
self.0.tcx.def_span(assoc.def_id), self.0.tcx.def_span(assoc.def_id),
"item had incorrect args", "item had incorrect args",
); );