Rollup merge of #121669 - nnethercote:count-stashed-errs-again, r=estebank
Count stashed errors again Stashed diagnostics are such a pain. Their "might be emitted, might not" semantics messes with lots of things. #120828 and #121206 made some big changes to how they work, improving some things, but still leaving some problems, as seen by the issues caused by #121206. This PR aims to fix all of them by restricting them in a way that eliminates the "might be emitted, might not" semantics while still allowing 98% of their benefit. Details in the individual commit logs. r? `@oli-obk`
This commit is contained in:
commit
a5945b5d8d
40 changed files with 476 additions and 343 deletions
|
@ -847,13 +847,15 @@ impl<'tcx> OpaqueHiddenType<'tcx> {
|
|||
opaque_def_id: LocalDefId,
|
||||
tcx: TyCtxt<'tcx>,
|
||||
) -> Result<Diag<'tcx>, ErrorGuaranteed> {
|
||||
if let Some(diag) = tcx
|
||||
.sess
|
||||
.dcx()
|
||||
.steal_diagnostic(tcx.def_span(opaque_def_id), StashKey::OpaqueHiddenTypeMismatch)
|
||||
{
|
||||
diag.cancel();
|
||||
}
|
||||
// We used to cancel here for slightly better error messages, but
|
||||
// cancelling stashed diagnostics is no longer allowed because it
|
||||
// causes problems when tracking whether errors have actually
|
||||
// occurred.
|
||||
tcx.sess.dcx().try_steal_modify_and_emit_err(
|
||||
tcx.def_span(opaque_def_id),
|
||||
StashKey::OpaqueHiddenTypeMismatch,
|
||||
|_err| {},
|
||||
);
|
||||
(self.ty, other.ty).error_reported()?;
|
||||
// Found different concrete types for the opaque type.
|
||||
let sub_diag = if self.span == other.span {
|
||||
|
|
|
@ -91,8 +91,8 @@ impl<'tcx> Region<'tcx> {
|
|||
|
||||
/// Constructs a `RegionKind::ReError` region.
|
||||
#[track_caller]
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, reported: ErrorGuaranteed) -> Region<'tcx> {
|
||||
tcx.intern_region(ty::ReError(reported))
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> Region<'tcx> {
|
||||
tcx.intern_region(ty::ReError(guar))
|
||||
}
|
||||
|
||||
/// Constructs a `RegionKind::ReError` region and registers a delayed bug to ensure it gets
|
||||
|
|
|
@ -1528,8 +1528,8 @@ impl<'tcx> Ty<'tcx> {
|
|||
}
|
||||
|
||||
/// Constructs a `TyKind::Error` type with current `ErrorGuaranteed`
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, reported: ErrorGuaranteed) -> Ty<'tcx> {
|
||||
Ty::new(tcx, Error(reported))
|
||||
pub fn new_error(tcx: TyCtxt<'tcx>, guar: ErrorGuaranteed) -> Ty<'tcx> {
|
||||
Ty::new(tcx, Error(guar))
|
||||
}
|
||||
|
||||
/// Constructs a `TyKind::Error` type and registers a `span_delayed_bug` to ensure it gets used.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue