rust/compiler
Nicholas Nethercote 260ae70140 Overhaul how stashed diagnostics work, again.
Stashed errors used to be counted as errors, but could then be
cancelled, leading to `ErrorGuaranteed` soundness holes. #120828 changed
that, closing the soundness hole. But it introduced other difficulties
because you sometimes have to account for pending stashed errors when
making decisions about whether errors have occured/will occur and it's
easy to overlook these.

This commit aims for a middle ground.
- Stashed errors (not warnings) are counted immediately as emitted
  errors, avoiding the possibility of forgetting to consider them.
- The ability to cancel (or downgrade) stashed errors is eliminated, by
  disallowing the use of `steal_diagnostic` with errors, and introducing
  the more restrictive methods `try_steal_{modify,replace}_and_emit_err`
  that can be used instead.

Other things:
- `DiagnosticBuilder::stash` and `DiagCtxt::stash_diagnostic` now both
  return `Option<ErrorGuaranteed>`, which enables the removal of two
  `delayed_bug` calls and one `Ty::new_error_with_message` call. This is
  possible because we store error guarantees in
  `DiagCtxt::stashed_diagnostics`.
- Storing the guarantees also saves us having to maintain a counter.
- Calls to the `stashed_err_count` method are no longer necessary
  alongside calls to `has_errors`, which is a nice simplification, and
  eliminates two more `span_delayed_bug` calls and one FIXME comment.
- Tests are added for three of the four fixed PRs mentioned below.
- `issue-121108.rs`'s output improved slightly, omitting a non-useful
  error message.

Fixes #121451.
Fixes #121477.
Fixes #121504.
Fixes #121508.
2024-02-29 11:08:27 +11:00
..
rustc
rustc_abi
rustc_arena
rustc_ast Split rustc_type_ir to avoid rustc_ast from depending on it 2024-02-27 18:11:23 +00:00
rustc_ast_ir Split rustc_type_ir to avoid rustc_ast from depending on it 2024-02-27 18:11:23 +00:00
rustc_ast_lowering Rename DiagnosticArgFromDisplay as DiagArgFromDisplay. 2024-02-28 08:55:37 +11:00
rustc_ast_passes Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_ast_pretty
rustc_attr Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_baked_icu_data
rustc_borrowck Rename DiagnosticArg{,Map,Name,Value} as DiagArg{,Map,Name,Value}. 2024-02-28 08:55:37 +11:00
rustc_builtin_macros Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_codegen_cranelift Auto merge of #121635 - 823984418:remove_archive_builder_lifetime_a, r=nnethercote 2024-02-27 03:27:48 +00:00
rustc_codegen_gcc Rename DiagnosticArg{,Map,Name,Value} as DiagArg{,Map,Name,Value}. 2024-02-28 08:55:37 +11:00
rustc_codegen_llvm Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_codegen_ssa Rename DiagnosticArg{,Map,Name,Value} as DiagArg{,Map,Name,Value}. 2024-02-28 08:55:37 +11:00
rustc_const_eval Auto merge of #121489 - nnethercote:diag-renaming, r=davidtwco 2024-02-28 20:39:38 +00:00
rustc_data_structures
rustc_driver
rustc_driver_impl
rustc_error_codes
rustc_error_messages
rustc_errors Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_expand Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_feature Changing some attributes to only_local. 2024-02-27 10:45:19 +08:00
rustc_fluent_macro
rustc_fs_util
rustc_graphviz
rustc_hir rename RPITIT from opaque to synthetic 2024-02-27 17:43:40 +00:00
rustc_hir_analysis Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_hir_pretty
rustc_hir_typeck Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_incremental
rustc_index
rustc_index_macros
rustc_infer Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_interface Rename Diagnostic as DiagInner. 2024-02-28 08:33:25 +11:00
rustc_lexer
rustc_lint Auto merge of #121489 - nnethercote:diag-renaming, r=davidtwco 2024-02-28 20:39:38 +00:00
rustc_lint_defs Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_llvm
rustc_log
rustc_macros Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_metadata Rename DiagnosticArg{,Map,Name,Value} as DiagArg{,Map,Name,Value}. 2024-02-28 08:55:37 +11:00
rustc_middle Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_mir_build Rename DiagnosticArg{,Map,Name,Value} as DiagArg{,Map,Name,Value}. 2024-02-28 08:55:37 +11:00
rustc_mir_dataflow
rustc_mir_transform Rename DiagnosticArg{,Map,Name,Value} as DiagArg{,Map,Name,Value}. 2024-02-28 08:55:37 +11:00
rustc_monomorphize Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_next_trait_solver
rustc_parse Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_parse_format
rustc_passes Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_pattern_analysis Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_privacy Rename DiagnosticArgFromDisplay as DiagArgFromDisplay. 2024-02-28 08:55:37 +11:00
rustc_query_impl Rename Diagnostic as DiagInner. 2024-02-28 08:33:25 +11:00
rustc_query_system Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_resolve Auto merge of #121489 - nnethercote:diag-renaming, r=davidtwco 2024-02-28 20:39:38 +00:00
rustc_serialize
rustc_session Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_smir
rustc_span Rollup merge of #121686 - compiler-errors:rpitit-printing, r=lcnr 2024-02-28 16:04:52 +01:00
rustc_symbol_mangling Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
rustc_target Rename wasm32-wasi-preview2 to wasm32-wasip2 2024-02-27 10:14:45 -05:00
rustc_trait_selection Overhaul how stashed diagnostics work, again. 2024-02-29 11:08:27 +11:00
rustc_traits
rustc_transmute
rustc_ty_utils
rustc_type_ir Split rustc_type_ir to avoid rustc_ast from depending on it 2024-02-27 18:11:23 +00:00
stable_mir