about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bootstrap/CHANGELOG.md3
-rw-r--r--src/bootstrap/Cargo.lock676
-rw-r--r--src/bootstrap/Cargo.toml8
-rw-r--r--src/bootstrap/bootstrap.py172
-rw-r--r--src/bootstrap/dist.rs13
-rw-r--r--src/bootstrap/lib.rs14
-rw-r--r--src/bootstrap/native.rs13
-rw-r--r--src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version2
-rwxr-xr-xsrc/ci/init_repo.sh19
m---------src/doc/book0
m---------src/doc/embedded-book0
m---------src/doc/reference0
m---------src/doc/rust-by-example0
m---------src/doc/rustc-dev-guide0
-rw-r--r--src/doc/unstable-book/src/compiler-flags/extern-options.md27
-rw-r--r--src/doc/unstable-book/src/language-features/lang-items.md4
-rwxr-xr-xsrc/etc/cpu-usage-over-time-plot.sh20
-rw-r--r--src/librustdoc/clean/mod.rs58
-rw-r--r--src/librustdoc/clean/utils.rs9
-rw-r--r--src/librustdoc/html/format.rs80
-rw-r--r--src/librustdoc/html/highlight.rs115
-rw-r--r--src/librustdoc/html/layout.rs2
-rw-r--r--src/librustdoc/html/render/context.rs6
-rw-r--r--src/librustdoc/html/render/mod.rs19
-rw-r--r--src/librustdoc/html/render/span_map.rs83
-rw-r--r--src/librustdoc/html/render/write_shared.rs2
-rw-r--r--src/librustdoc/html/sources.rs4
-rw-r--r--src/librustdoc/html/static/css/rustdoc.css109
-rw-r--r--src/librustdoc/html/static/css/settings.css21
-rw-r--r--src/librustdoc/html/static/css/themes/ayu.css13
-rw-r--r--src/librustdoc/html/static/css/themes/dark.css13
-rw-r--r--src/librustdoc/html/static/css/themes/light.css13
-rw-r--r--src/librustdoc/html/static/js/main.js307
-rw-r--r--src/librustdoc/html/static/js/search.js5
-rw-r--r--src/librustdoc/html/static/js/settings.js40
-rw-r--r--src/librustdoc/html/static/js/source-script.js51
-rw-r--r--src/librustdoc/html/static/js/storage.js11
-rw-r--r--src/librustdoc/html/templates/page.html19
-rw-r--r--src/librustdoc/json/conversions.rs11
-rw-r--r--src/test/codegen/loads.rs40
-rw-r--r--src/test/codegen/noalias-rwlockreadguard.rs14
-rw-r--r--src/test/debuginfo/rwlock-read.rs7
-rw-r--r--src/test/mir-opt/const_prop/boxes.main.ConstProp.diff14
-rw-r--r--src/test/mir-opt/inline/inline_into_box_place.main.Inline.32bit.diff44
-rw-r--r--src/test/mir-opt/inline/inline_into_box_place.main.Inline.64bit.diff44
-rw-r--r--src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.b.Inline.after.mir6
-rw-r--r--src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.d.Inline.after.mir6
-rw-r--r--src/test/pretty/where-clauses.rs3
-rw-r--r--src/test/rustdoc-gui/duplicate-macro-reexport.goml6
-rw-r--r--src/test/rustdoc-gui/escape-key.goml12
-rw-r--r--src/test/rustdoc-gui/headings.goml4
-rw-r--r--src/test/rustdoc-gui/pocket-menu.goml72
-rw-r--r--src/test/rustdoc-gui/shortcuts.goml5
-rw-r--r--src/test/rustdoc-gui/sidebar-source-code-display.goml99
-rw-r--r--src/test/rustdoc-gui/sidebar-source-code.goml10
-rw-r--r--src/test/rustdoc-gui/source-code-page.goml2
-rw-r--r--src/test/rustdoc-json/keyword.rs21
-rw-r--r--src/test/rustdoc-ui/display-output.stdout2
-rw-r--r--src/test/rustdoc/check-source-code-urls-to-def-std.rs25
-rw-r--r--src/test/rustdoc/generic_const_exprs.rs24
-rw-r--r--src/test/ui-fulldeps/internal-lints/diagnostics.rs4
-rw-r--r--src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs241
-rw-r--r--src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr287
-rw-r--r--src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.rs159
-rw-r--r--src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.stderr207
-rw-r--r--src/test/ui/argument-suggestions/basic.stderr8
-rw-r--r--src/test/ui/argument-suggestions/complex.stderr4
-rw-r--r--src/test/ui/argument-suggestions/issue-96638.stderr4
-rw-r--r--src/test/ui/argument-suggestions/issue-97197.stderr4
-rw-r--r--src/test/ui/argument-suggestions/issue-97484.stderr4
-rw-r--r--src/test/ui/argument-suggestions/missing_arguments.stderr76
-rw-r--r--src/test/ui/argument-suggestions/mixed_cases.stderr24
-rw-r--r--src/test/ui/array-slice-vec/array_const_index-0.stderr13
-rw-r--r--src/test/ui/array-slice-vec/array_const_index-1.stderr13
-rw-r--r--src/test/ui/associated-consts/associated-const-dead-code.rs2
-rw-r--r--src/test/ui/associated-consts/associated-const-dead-code.stderr2
-rw-r--r--src/test/ui/associated-consts/defaults-not-assumed-fail.stderr25
-rw-r--r--src/test/ui/associated-item/associated-item-enum.stderr6
-rw-r--r--src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr3
-rw-r--r--src/test/ui/associated-types/issue-47139-2.rs (renamed from src/test/ui/issues/issue-47139-2.rs)0
-rw-r--r--src/test/ui/associated-types/issue-87261.rs8
-rw-r--r--src/test/ui/associated-types/issue-87261.stderr24
-rw-r--r--src/test/ui/async-await/issue-68112.stderr30
-rw-r--r--src/test/ui/async-await/issue-70935-complex-spans.drop_tracking.stderr40
-rw-r--r--src/test/ui/async-await/issue-70935-complex-spans.normal.stderr (renamed from src/test/ui/async-await/issue-70935-complex-spans.stderr)8
-rw-r--r--src/test/ui/async-await/issue-70935-complex-spans.rs16
-rw-r--r--src/test/ui/async-await/partial-drop-partial-reinit.rs8
-rw-r--r--src/test/ui/async-await/partial-drop-partial-reinit.stderr20
-rw-r--r--src/test/ui/async-await/pin-needed-to-poll.stderr2
-rw-r--r--src/test/ui/backtrace-apple-no-dsymutil.rs1
-rw-r--r--src/test/ui/backtrace.rs2
-rw-r--r--src/test/ui/bogus-tag.stderr2
-rw-r--r--src/test/ui/borrowck/issue-71546.rs14
-rw-r--r--src/test/ui/borrowck/issue-71546.stderr59
-rw-r--r--src/test/ui/borrowck/issue-81899.stderr13
-rw-r--r--src/test/ui/borrowck/issue-88434-minimal-example.stderr13
-rw-r--r--src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr13
-rw-r--r--src/test/ui/c-variadic/variadic-ffi-1.stderr8
-rw-r--r--src/test/ui/cast/issue-10991.rs (renamed from src/test/ui/issues/issue-10991.rs)0
-rw-r--r--src/test/ui/cast/issue-10991.stderr (renamed from src/test/ui/issues/issue-10991.stderr)0
-rw-r--r--src/test/ui/closures/2229_closure_analysis/issue-87987.rs11
-rw-r--r--src/test/ui/closures/2229_closure_analysis/issue-87987.stderr14
-rw-r--r--src/test/ui/closures/2229_closure_analysis/match/issue-87097.rs2
-rw-r--r--src/test/ui/closures/2229_closure_analysis/match/issue-87097.stderr5
-rw-r--r--src/test/ui/closures/closure-move-sync.stderr16
-rw-r--r--src/test/ui/codegen/issue-28950.rs (renamed from src/test/ui/issues/issue-28950.rs)0
-rw-r--r--src/test/ui/codegen/issue-63787.rs (renamed from src/test/ui/issues/issue-63787.rs)0
-rw-r--r--src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr24
-rw-r--r--src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr24
-rw-r--r--src/test/ui/coherence/coherence-impls-copy.stderr42
-rw-r--r--src/test/ui/coherence/coherence-impls-send.stderr22
-rw-r--r--src/test/ui/coherence/coherence-impls-sized.stderr66
-rw-r--r--src/test/ui/coherence/coherence-with-closure.stderr18
-rw-r--r--src/test/ui/coherence/coherence-with-generator.stderr18
-rw-r--r--src/test/ui/confuse-field-and-method/issue-18343.stderr2
-rw-r--r--src/test/ui/confuse-field-and-method/issue-2392.stderr22
-rw-r--r--src/test/ui/confuse-field-and-method/issue-32128.stderr2
-rw-r--r--src/test/ui/confuse-field-and-method/private-field.stderr2
-rw-r--r--src/test/ui/const-generics/defaults/rp_impl_trait_fail.stderr9
-rw-r--r--src/test/ui/const-generics/generic_const_exprs/issue-69654.stderr2
-rw-r--r--src/test/ui/const-generics/generic_const_exprs/issue-80742.stderr18
-rw-r--r--src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr2
-rw-r--r--src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.min.stderr (renamed from src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.stderr)2
-rw-r--r--src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.rs14
-rw-r--r--src/test/ui/const-generics/issues/issue-97634.rs10
-rw-r--r--src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.rs6
-rw-r--r--src/test/ui/consts/assert-type-intrinsics.stderr42
-rw-r--r--src/test/ui/consts/assoc_const_generic_impl.stderr17
-rw-r--r--src/test/ui/consts/const-err-early.stderr85
-rw-r--r--src/test/ui/consts/const-err-multi.stderr68
-rw-r--r--src/test/ui/consts/const-err.stderr17
-rw-r--r--src/test/ui/consts/const-eval/conditional_array_execution.stderr33
-rw-r--r--src/test/ui/consts/const-eval/const-eval-overflow-2.stderr17
-rw-r--r--src/test/ui/consts/const-eval/const-eval-overflow2.stderr150
-rw-r--r--src/test/ui/consts/const-eval/const-eval-overflow2b.stderr150
-rw-r--r--src/test/ui/consts/const-eval/const-eval-overflow2c.stderr150
-rw-r--r--src/test/ui/consts/const-eval/const-eval-query-stack.stderr28
-rw-r--r--src/test/ui/consts/const-eval/const-pointer-values-in-various-types.64bit.stderr351
-rw-r--r--src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr76
-rw-r--r--src/test/ui/consts/const-eval/erroneous-const.stderr17
-rw-r--r--src/test/ui/consts/const-eval/erroneous-const2.stderr17
-rw-r--r--src/test/ui/consts/const-eval/format.rs21
-rw-r--r--src/test/ui/consts/const-eval/format.stderr124
-rw-r--r--src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr17
-rw-r--r--src/test/ui/consts/const-eval/issue-43197.stderr66
-rw-r--r--src/test/ui/consts/const-eval/issue-44578.stderr33
-rw-r--r--src/test/ui/consts/const-eval/issue-50814-2.stderr13
-rw-r--r--src/test/ui/consts/const-eval/issue-50814.stderr13
-rw-r--r--src/test/ui/consts/const-eval/partial_ptr_overwrite.stderr19
-rw-r--r--src/test/ui/consts/const-eval/promoted_errors.noopt.stderr50
-rw-r--r--src/test/ui/consts/const-eval/promoted_errors.opt.stderr51
-rw-r--r--src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr50
-rw-r--r--src/test/ui/consts/const-eval/pub_const_err.stderr17
-rw-r--r--src/test/ui/consts/const-eval/pub_const_err_bin.stderr17
-rw-r--r--src/test/ui/consts/const-eval/ref_to_int_match.32bit.stderr13
-rw-r--r--src/test/ui/consts/const-eval/ref_to_int_match.64bit.stderr13
-rw-r--r--src/test/ui/consts/const-eval/ub-enum.32bit.stderr55
-rw-r--r--src/test/ui/consts/const-eval/ub-enum.64bit.stderr55
-rw-r--r--src/test/ui/consts/const-eval/ub-ref-ptr.32bit.stderr63
-rw-r--r--src/test/ui/consts/const-eval/ub-ref-ptr.64bit.stderr63
-rw-r--r--src/test/ui/consts/const-eval/ub-wide-ptr.32bit.stderr83
-rw-r--r--src/test/ui/consts/const-eval/ub-wide-ptr.64bit.stderr83
-rw-r--r--src/test/ui/consts/const-eval/unused-broken-const.stderr13
-rw-r--r--src/test/ui/consts/const-external-macro-const-err.stderr12
-rw-r--r--src/test/ui/consts/const-float-bits-reject-conv.stderr112
-rw-r--r--src/test/ui/consts/const-len-underflow-separate-spans.stderr13
-rw-r--r--src/test/ui/consts/const-needs_drop-monomorphic.stderr2
-rw-r--r--src/test/ui/consts/const-prop-read-static-in-const.stderr13
-rw-r--r--src/test/ui/consts/const-size_of_val-align_of_val-extern-type.stderr26
-rw-r--r--src/test/ui/consts/const-slice-oob.stderr13
-rw-r--r--src/test/ui/consts/const_limit/const_eval_limit_reached.stderr18
-rw-r--r--src/test/ui/consts/invalid-union.32bit.stderr11
-rw-r--r--src/test/ui/consts/invalid-union.64bit.stderr11
-rw-r--r--src/test/ui/consts/issue-56164.stderr11
-rw-r--r--src/test/ui/consts/issue-66693.stderr11
-rw-r--r--src/test/ui/consts/issue-miri-1910.stderr25
-rw-r--r--src/test/ui/consts/miri_unleashed/assoc_const.stderr25
-rw-r--r--src/test/ui/consts/miri_unleashed/assoc_const_2.stderr17
-rw-r--r--src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr55
-rw-r--r--src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.32bit.stderr42
-rw-r--r--src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.64bit.stderr42
-rw-r--r--src/test/ui/consts/ptr_comparisons.stderr26
-rw-r--r--src/test/ui/consts/recursive.stderr19
-rw-r--r--src/test/ui/consts/uninhabited-const-issue-61744.stderr144
-rw-r--r--src/test/ui/copy-a-resource.stderr2
-rw-r--r--src/test/ui/derive-uninhabited-enum-38885.rs2
-rw-r--r--src/test/ui/derive-uninhabited-enum-38885.stderr5
-rw-r--r--src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.rs12
-rw-r--r--src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr24
-rw-r--r--src/test/ui/derives/clone-debug-dead-code.rs10
-rw-r--r--src/test/ui/derives/clone-debug-dead-code.stderr30
-rw-r--r--src/test/ui/derives/derive-assoc-type-not-impl.stderr4
-rw-r--r--src/test/ui/derives/issue-91492.stderr2
-rw-r--r--src/test/ui/derives/issue-91550.stderr6
-rw-r--r--src/test/ui/derives/issue-97343.stderr2
-rw-r--r--src/test/ui/deriving/issue-6341.rs (renamed from src/test/ui/issues/issue-6341.rs)0
-rw-r--r--src/test/ui/did_you_mean/issue-40006.stderr2
-rw-r--r--src/test/ui/dont-suggest-private-trait-method.stderr2
-rw-r--r--src/test/ui/error-codes/E0057.stderr4
-rw-r--r--src/test/ui/error-codes/E0060.stderr4
-rw-r--r--src/test/ui/error-codes/E0061.stderr8
-rw-r--r--src/test/ui/error-codes/E0109.stderr4
-rw-r--r--src/test/ui/error-codes/E0110.stderr4
-rw-r--r--src/test/ui/error-codes/E0411.stderr2
-rw-r--r--src/test/ui/error-codes/E0599.stderr2
-rw-r--r--src/test/ui/generator/issue-68112.rs22
-rw-r--r--src/test/ui/generator/issue-68112.stderr41
-rw-r--r--src/test/ui/generator/not-send-sync.stderr11
-rw-r--r--src/test/ui/generator/print/generator-print-verbose-1.stderr33
-rw-r--r--src/test/ui/generator/print/generator-print-verbose-2.stderr11
-rw-r--r--src/test/ui/generic-associated-types/collectivity-regression.rs24
-rw-r--r--src/test/ui/generic-associated-types/collectivity-regression.stderr14
-rw-r--r--src/test/ui/generic-associated-types/issue-70304.rs2
-rw-r--r--src/test/ui/generic-associated-types/issue-70304.stderr13
-rw-r--r--src/test/ui/generic-associated-types/issue-86483.rs8
-rw-r--r--src/test/ui/generic-associated-types/issue-86483.stderr50
-rw-r--r--src/test/ui/generic-associated-types/issue-91139.rs18
-rw-r--r--src/test/ui/generic-associated-types/issue-91139.stderr50
-rw-r--r--src/test/ui/generic-associated-types/issue-91883.rs42
-rw-r--r--src/test/ui/generic-associated-types/issue-91883.stderr26
-rw-r--r--src/test/ui/generic-associated-types/issue-92096.rs9
-rw-r--r--src/test/ui/generic-associated-types/issue-92096.stderr8
-rw-r--r--src/test/ui/generic-associated-types/issue-95305.rs2
-rw-r--r--src/test/ui/generic-associated-types/issue-95305.stderr12
-rw-r--r--src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr4
-rw-r--r--src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr6
-rw-r--r--src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr340
-rw-r--r--src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.rs8
-rw-r--r--src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.stderr19
-rw-r--r--src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-71955.stderr4
-rw-r--r--src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.rs4
-rw-r--r--src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.stderr16
-rw-r--r--src/test/ui/hrtb/hrtb-just-for-static.stderr2
-rw-r--r--src/test/ui/hrtb/issue-30786.stderr8
-rw-r--r--src/test/ui/hrtb/issue-58451.stderr4
-rw-r--r--src/test/ui/impl-header-lifetime-elision/dyn-trait.rs4
-rw-r--r--src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr2
-rw-r--r--src/test/ui/impl-trait/auto-trait-leak2.rs18
-rw-r--r--src/test/ui/impl-trait/auto-trait-leak2.stderr32
-rw-r--r--src/test/ui/impl-trait/auto-trait.stderr18
-rw-r--r--src/test/ui/impl-trait/bound-normalization-fail.stderr6
-rw-r--r--src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr2
-rw-r--r--src/test/ui/impl-trait/issues/issue-62742.stderr2
-rw-r--r--src/test/ui/impl-trait/method-suggestion-no-duplication.stderr2
-rw-r--r--src/test/ui/impl-trait/negative-reasoning.stderr22
-rw-r--r--src/test/ui/impl-trait/no-method-suggested-traits.stderr6
-rw-r--r--src/test/ui/impl-trait/printing-binder.rs14
-rw-r--r--src/test/ui/impl-trait/printing-binder.stderr31
-rw-r--r--src/test/ui/impl-trait/suggest-calling-rpit-closure.rs12
-rw-r--r--src/test/ui/impl-trait/suggest-calling-rpit-closure.stderr21
-rw-r--r--src/test/ui/imports/issue-24883.rs (renamed from src/test/ui/issues/issue-24883.rs)0
-rw-r--r--src/test/ui/imports/issue-68103.rs (renamed from src/test/ui/issues/issue-68103.rs)0
-rw-r--r--src/test/ui/inference/cannot-infer-closure-circular.rs4
-rw-r--r--src/test/ui/inference/cannot-infer-closure-circular.stderr12
-rw-r--r--src/test/ui/inference/issue-72690.rs (renamed from src/test/ui/issues/issue-72690.rs)0
-rw-r--r--src/test/ui/inference/issue-72690.stderr (renamed from src/test/ui/issues/issue-72690.stderr)0
-rw-r--r--src/test/ui/infinite/infinite-autoderef.stderr2
-rw-r--r--src/test/ui/interior-mutability/interior-mutability.stderr6
-rw-r--r--src/test/ui/issue-94866.rs14
-rw-r--r--src/test/ui/issue-94866.stderr21
-rw-r--r--src/test/ui/issues-71798.stderr3
-rw-r--r--src/test/ui/issues/issue-18819.stderr4
-rw-r--r--src/test/ui/issues/issue-19692.stderr2
-rw-r--r--src/test/ui/issues/issue-22706.stderr2
-rw-r--r--src/test/ui/issues/issue-22933-2.stderr2
-rw-r--r--src/test/ui/issues/issue-23173.stderr8
-rw-r--r--src/test/ui/issues/issue-23217.stderr2
-rw-r--r--src/test/ui/issues/issue-2823.stderr2
-rw-r--r--src/test/ui/issues/issue-28971.stderr2
-rw-r--r--src/test/ui/issues/issue-3044.stderr2
-rw-r--r--src/test/ui/issues/issue-37515.rs2
-rw-r--r--src/test/ui/issues/issue-37515.stderr2
-rw-r--r--src/test/ui/issues/issue-38919.stderr2
-rw-r--r--src/test/ui/issues/issue-41880.stderr2
-rw-r--r--src/test/ui/issues/issue-57924.stderr2
-rw-r--r--src/test/ui/issues/issue-60989.stderr4
-rw-r--r--src/test/ui/issues/issue-64430.stderr2
-rw-r--r--src/test/ui/issues/issue-76077.rs2
-rw-r--r--src/test/ui/issues/issue-76077.stderr4
-rw-r--r--src/test/ui/issues/issue-7950.stderr2
-rw-r--r--src/test/ui/issues/issue-98299.rs18
-rw-r--r--src/test/ui/issues/issue-98299.stderr9
-rw-r--r--src/test/ui/kindck/kindck-nonsendable-1.stderr6
-rw-r--r--src/test/ui/lexical-scopes.stderr2
-rw-r--r--src/test/ui/lifetimes/elided-lifetime-in-path-in-pat.rs13
-rw-r--r--src/test/ui/lifetimes/issue-97194.rs2
-rw-r--r--src/test/ui/lifetimes/issue-97194.stderr4
-rw-r--r--src/test/ui/lifetimes/lifetime-errors/ex3-both-anon-regions-using-trait-objects.stderr4
-rw-r--r--src/test/ui/limits/issue-55878.stderr12
-rw-r--r--src/test/ui/lint/dead-code/basic.rs2
-rw-r--r--src/test/ui/lint/dead-code/basic.stderr2
-rw-r--r--src/test/ui/lint/dead-code/const-and-self.rs4
-rw-r--r--src/test/ui/lint/dead-code/const-and-self.stderr15
-rw-r--r--src/test/ui/lint/dead-code/empty-unused-enum.rs2
-rw-r--r--src/test/ui/lint/dead-code/empty-unused-enum.stderr2
-rw-r--r--src/test/ui/lint/dead-code/impl-trait.rs2
-rw-r--r--src/test/ui/lint/dead-code/impl-trait.stderr2
-rw-r--r--src/test/ui/lint/dead-code/issue-85255.rs24
-rw-r--r--src/test/ui/lint/dead-code/issue-85255.stderr42
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-1.rs20
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-1.stderr23
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-2.rs6
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-2.stderr6
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-3.rs10
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-3.stderr10
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-4.rs20
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-4.stderr54
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-5.rs8
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-5.stderr18
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-6.rs8
-rw-r--r--src/test/ui/lint/dead-code/lint-dead-code-6.stderr8
-rw-r--r--src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.rs29
-rw-r--r--src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.stderr55
-rw-r--r--src/test/ui/lint/dead-code/newline-span.rs6
-rw-r--r--src/test/ui/lint/dead-code/newline-span.stderr6
-rw-r--r--src/test/ui/lint/dead-code/type-alias.rs2
-rw-r--r--src/test/ui/lint/dead-code/type-alias.stderr2
-rw-r--r--src/test/ui/lint/dead-code/unused-enum.rs7
-rw-r--r--src/test/ui/lint/dead-code/unused-enum.stderr6
-rw-r--r--src/test/ui/lint/dead-code/unused-struct-variant.rs2
-rw-r--r--src/test/ui/lint/dead-code/unused-struct-variant.stderr5
-rw-r--r--src/test/ui/lint/dead-code/unused-variant.rs2
-rw-r--r--src/test/ui/lint/dead-code/unused-variant.stderr4
-rw-r--r--src/test/ui/lint/dead-code/with-core-crate.rs2
-rw-r--r--src/test/ui/lint/dead-code/with-core-crate.stderr2
-rw-r--r--src/test/ui/lint/force-warn/allow-warnings.rs2
-rw-r--r--src/test/ui/lint/force-warn/allow-warnings.stderr2
-rw-r--r--src/test/ui/lint/force-warn/allowed-cli-deny-by-default-lint.stderr13
-rw-r--r--src/test/ui/lint/force-warn/allowed-deny-by-default-lint.stderr13
-rw-r--r--src/test/ui/lint/force-warn/allowed-warn-by-default-lint.rs2
-rw-r--r--src/test/ui/lint/force-warn/allowed-warn-by-default-lint.stderr2
-rw-r--r--src/test/ui/lint/force-warn/deny-by-default-lint.stderr13
-rw-r--r--src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.rs4
-rw-r--r--src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.stderr4
-rw-r--r--src/test/ui/lint/issue-17718-const-naming.rs2
-rw-r--r--src/test/ui/lint/issue-17718-const-naming.stderr2
-rw-r--r--src/test/ui/lint/issue-35075.rs (renamed from src/test/ui/issues/issue-35075.rs)0
-rw-r--r--src/test/ui/lint/issue-35075.stderr (renamed from src/test/ui/issues/issue-35075.stderr)0
-rw-r--r--src/test/ui/lint/unused/unused-attr-doc-hidden.fixed55
-rw-r--r--src/test/ui/lint/unused/unused-attr-doc-hidden.rs55
-rw-r--r--src/test/ui/lint/unused/unused-attr-doc-hidden.stderr67
-rw-r--r--src/test/ui/lub-glb/empty-binder-future-compat.rs22
-rw-r--r--src/test/ui/lub-glb/empty-binders-err.rs55
-rw-r--r--src/test/ui/lub-glb/empty-binders-err.stderr59
-rw-r--r--src/test/ui/lub-glb/empty-binders.rs45
-rw-r--r--src/test/ui/macros/cfg.rs1
-rw-r--r--src/test/ui/macros/cfg.stderr10
-rw-r--r--src/test/ui/macros/issue-8851.rs (renamed from src/test/ui/issues/issue-8851.rs)0
-rw-r--r--src/test/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs42
-rw-r--r--src/test/ui/match/issue-46920-byte-array-patterns.rs (renamed from src/test/ui/issues/issue-46920-byte-array-patterns.rs)0
-rw-r--r--src/test/ui/methods/method-call-err-msg.stderr16
-rw-r--r--src/test/ui/methods/method-not-found-generic-arg-elision.stderr14
-rw-r--r--src/test/ui/mir/issue-92893.rs3
-rw-r--r--src/test/ui/mir/issue-92893.stderr8
-rw-r--r--src/test/ui/mir/ssa-analysis-regression-50041.rs18
-rw-r--r--src/test/ui/mismatched_types/overloaded-calls-bad.stderr8
-rw-r--r--src/test/ui/mismatched_types/ref-pat-suggestions.fixed13
-rw-r--r--src/test/ui/mismatched_types/ref-pat-suggestions.rs13
-rw-r--r--src/test/ui/mismatched_types/ref-pat-suggestions.stderr92
-rw-r--r--src/test/ui/mod-subitem-as-enum-variant.stderr2
-rw-r--r--src/test/ui/nll/issue-27282-move-match-input-into-guard.rs (renamed from src/test/ui/borrowck/issue-27282-move-match-input-into-guard.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-move-match-input-into-guard.stderr (renamed from src/test/ui/borrowck/issue-27282-move-match-input-into-guard.stderr)0
-rw-r--r--src/test/ui/nll/issue-27282-move-ref-mut-into-guard.rs (renamed from src/test/ui/issues/issue-27282-move-ref-mut-into-guard.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-move-ref-mut-into-guard.stderr (renamed from src/test/ui/issues/issue-27282-move-ref-mut-into-guard.stderr)0
-rw-r--r--src/test/ui/nll/issue-27282-mutate-before-diverging-arm-1.rs (renamed from src/test/ui/issues/issue-27282-mutate-before-diverging-arm-1.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-mutate-before-diverging-arm-1.stderr (renamed from src/test/ui/issues/issue-27282-mutate-before-diverging-arm-1.stderr)0
-rw-r--r--src/test/ui/nll/issue-27282-mutate-before-diverging-arm-2.rs (renamed from src/test/ui/borrowck/issue-27282-mutate-before-diverging-arm-2.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-mutate-before-diverging-arm-2.stderr (renamed from src/test/ui/borrowck/issue-27282-mutate-before-diverging-arm-2.stderr)0
-rw-r--r--src/test/ui/nll/issue-27282-mutate-before-diverging-arm-3.rs (renamed from src/test/ui/issues/issue-27282-mutate-before-diverging-arm-3.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-mutate-before-diverging-arm-3.stderr (renamed from src/test/ui/issues/issue-27282-mutate-before-diverging-arm-3.stderr)0
-rw-r--r--src/test/ui/nll/issue-27282-mutation-in-guard.rs (renamed from src/test/ui/borrowck/issue-27282-mutation-in-guard.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-mutation-in-guard.stderr (renamed from src/test/ui/borrowck/issue-27282-mutation-in-guard.stderr)0
-rw-r--r--src/test/ui/nll/issue-27282-reborrow-ref-mut-in-guard.rs (renamed from src/test/ui/borrowck/issue-27282-reborrow-ref-mut-in-guard.rs)0
-rw-r--r--src/test/ui/nll/issue-27282-reborrow-ref-mut-in-guard.stderr (renamed from src/test/ui/borrowck/issue-27282-reborrow-ref-mut-in-guard.stderr)0
-rw-r--r--src/test/ui/nll/issue-52057.rs (renamed from src/test/ui/issues/issue-52057.rs)0
-rw-r--r--src/test/ui/nll/issue-97997.rs16
-rw-r--r--src/test/ui/nll/issue-97997.stderr20
-rw-r--r--src/test/ui/nll/issue-98170.rs25
-rw-r--r--src/test/ui/nll/issue-98170.stderr44
-rw-r--r--src/test/ui/nll/snocat-regression.rs16
-rw-r--r--src/test/ui/nll/snocat-regression.stderr14
-rw-r--r--src/test/ui/nll/type-test-universe.rs21
-rw-r--r--src/test/ui/nll/type-test-universe.stderr16
-rw-r--r--src/test/ui/nll/vimwiki-core-regression.rs37
-rw-r--r--src/test/ui/no-send-res-ports.stderr11
-rw-r--r--src/test/ui/noncopyable-class.stderr2
-rw-r--r--src/test/ui/not-clone-closure.stderr9
-rw-r--r--src/test/ui/not-enough-arguments.stderr8
-rw-r--r--src/test/ui/numbers-arithmetic/promoted_overflow.rs4
-rw-r--r--src/test/ui/panics/issue-47429-short-backtraces.legacy.run.stderr2
-rw-r--r--src/test/ui/panics/issue-47429-short-backtraces.rs1
-rw-r--r--src/test/ui/panics/issue-47429-short-backtraces.v0.run.stderr2
-rw-r--r--src/test/ui/panics/runtime-switch.legacy.run.stderr2
-rw-r--r--src/test/ui/panics/runtime-switch.rs1
-rw-r--r--src/test/ui/panics/runtime-switch.v0.run.stderr2
-rw-r--r--src/test/ui/panics/unique-panic.rs4
-rw-r--r--src/test/ui/parser/emoji-identifiers.stderr2
-rw-r--r--src/test/ui/parser/expr-as-stmt.stderr4
-rw-r--r--src/test/ui/parser/struct-literal-restrictions-in-lamda.stderr6
-rw-r--r--src/test/ui/pattern/for-loop-bad-item.stderr5
-rw-r--r--src/test/ui/pattern/usefulness/integer-ranges/exhaustiveness.stderr50
-rw-r--r--src/test/ui/pattern/usefulness/integer-ranges/pointer-sized-int.deny.stderr40
-rw-r--r--src/test/ui/pattern/usefulness/non-exhaustive-match.stderr4
-rw-r--r--src/test/ui/pattern/usefulness/tuple-struct-nonexhaustive.stderr2
-rw-r--r--src/test/ui/privacy/issue-79593.rs2
-rw-r--r--src/test/ui/privacy/issue-79593.stderr4
-rw-r--r--src/test/ui/regions/forall-wf-ref-reflexive.rs18
-rw-r--r--src/test/ui/regions/forall-wf-ref-reflexive.stderr8
-rw-r--r--src/test/ui/regions/forall-wf-reflexive.rs15
-rw-r--r--src/test/ui/reify-intrinsic.stderr4
-rw-r--r--src/test/ui/resolve/issue-24968.rs25
-rw-r--r--src/test/ui/resolve/issue-24968.stderr56
-rw-r--r--src/test/ui/rfc-2294-if-let-guard/feature-gate.rs2
-rw-r--r--src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr20
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs88
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr450
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.rs1
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr26
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/feature-gate.rs3
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr18
-rw-r--r--src/test/ui/rfc-2497-if-let-chains/invalid-let-in-a-valid-let-context.rs17
-rw-r--r--src/test/ui/runtime/backtrace-debuginfo.rs1
-rw-r--r--src/test/ui/rust-2018/uniform-paths/issue-87932.stderr2
-rw-r--r--src/test/ui/self/point-at-arbitrary-self-type-method.stderr2
-rw-r--r--src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr2
-rw-r--r--src/test/ui/span/issue-7575.stderr4
-rw-r--r--src/test/ui/span/macro-span-replacement.rs2
-rw-r--r--src/test/ui/span/macro-span-replacement.stderr2
-rw-r--r--src/test/ui/span/move-closure.stderr4
-rw-r--r--src/test/ui/span/unused-warning-point-at-identifier.rs8
-rw-r--r--src/test/ui/span/unused-warning-point-at-identifier.stderr8
-rw-r--r--src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr4
-rw-r--r--src/test/ui/std-backtrace.rs1
-rw-r--r--src/test/ui/structs/struct-path-associated-type.stderr4
-rw-r--r--src/test/ui/structs/struct-path-self.stderr6
-rw-r--r--src/test/ui/suggestions/args-instead-of-tuple-errors.stderr12
-rw-r--r--src/test/ui/suggestions/derive-trait-for-method-call.stderr6
-rw-r--r--src/test/ui/suggestions/dont-suggest-pin-array-dot-set.rs15
-rw-r--r--src/test/ui/suggestions/dont-suggest-pin-array-dot-set.stderr9
-rw-r--r--src/test/ui/suggestions/dont-wrap-ambiguous-receivers.stderr2
-rw-r--r--src/test/ui/suggestions/field-has-method.stderr2
-rw-r--r--src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr14
-rw-r--r--src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr2
-rw-r--r--src/test/ui/suggestions/issue-21673.stderr2
-rw-r--r--src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr2
-rw-r--r--src/test/ui/suggestions/suggest-methods.stderr2
-rw-r--r--src/test/ui/suggestions/suggest-variants.stderr6
-rw-r--r--src/test/ui/suggestions/use-placement-typeck.stderr2
-rw-r--r--src/test/ui/test-attrs/issue-16597-empty.rs (renamed from src/test/ui/issues/issue-16597-empty.rs)0
-rw-r--r--src/test/ui/test-attrs/issue-16597.rs (renamed from src/test/ui/issues/issue-16597.rs)0
-rw-r--r--src/test/ui/test-attrs/test-warns-dead-code.rs2
-rw-r--r--src/test/ui/test-attrs/test-warns-dead-code.stderr2
-rw-r--r--src/test/ui/trait-bounds/issue-93008.rs17
-rw-r--r--src/test/ui/trait-bounds/issue-93008.stderr12
-rw-r--r--src/test/ui/trait-bounds/issue-94680.rs14
-rw-r--r--src/test/ui/trait-bounds/issue-94999.rs34
-rw-r--r--src/test/ui/trait-bounds/issue-95640.rs31
-rw-r--r--src/test/ui/trait-bounds/select-param-env-instead-of-blanket.rs43
-rw-r--r--src/test/ui/trait-bounds/select-param-env-instead-of-blanket.stderr18
-rw-r--r--src/test/ui/traits/alias/issue-83613.stderr16
-rw-r--r--src/test/ui/traits/issue-38033.rs (renamed from src/test/ui/issues/issue-38033.rs)0
-rw-r--r--src/test/ui/traits/issue-3973.stderr2
-rw-r--r--src/test/ui/traits/issue-65284-suggest-generic-trait-bound.stderr2
-rw-r--r--src/test/ui/traits/issue-78372.rs1
-rw-r--r--src/test/ui/traits/issue-78372.stderr15
-rw-r--r--src/test/ui/traits/issue-87558.rs9
-rw-r--r--src/test/ui/traits/issue-87558.stderr24
-rw-r--r--src/test/ui/traits/issue-95898.stderr2
-rw-r--r--src/test/ui/traits/item-privacy.stderr12
-rw-r--r--src/test/ui/traits/negative-impls/explicitly-unimplemented-error-message.stderr4
-rw-r--r--src/test/ui/tuple/wrong_argument_ice-3.stderr4
-rw-r--r--src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs6
-rw-r--r--src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr60
-rw-r--r--src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr4
-rw-r--r--src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr2
-rw-r--r--src/test/ui/type-alias-impl-trait/auto-trait-leakage2.rs8
-rw-r--r--src/test/ui/type-alias-impl-trait/auto-trait-leakage2.stderr10
-rw-r--r--src/test/ui/type-alias-impl-trait/issue-63279.stderr4
-rw-r--r--src/test/ui/type-alias-impl-trait/nested-tait-inference.stderr3
-rw-r--r--src/test/ui/type-alias-impl-trait/nested-tait-inference2.stderr3
-rw-r--r--src/test/ui/type-alias/issue-62263-self-in-atb.rs2
-rw-r--r--src/test/ui/type-alias/issue-62263-self-in-atb.stderr4
-rw-r--r--src/test/ui/type-alias/issue-62305-self-assoc-ty.rs2
-rw-r--r--src/test/ui/type-alias/issue-62305-self-assoc-ty.stderr4
-rw-r--r--src/test/ui/type-alias/issue-62364-self-ty-arg.stderr6
-rw-r--r--src/test/ui/type/issue-91268.rs2
-rw-r--r--src/test/ui/type/issue-91268.stderr4
-rw-r--r--src/test/ui/typeck/issue-10401.rs (renamed from src/test/ui/issues/issue-10401.rs)0
-rw-r--r--src/test/ui/typeck/issue-10401.stderr (renamed from src/test/ui/issues/issue-10401.stderr)0
-rw-r--r--src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.rs2
-rw-r--r--src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.stderr4
-rw-r--r--src/test/ui/typeck/missing-private-fields-in-struct-literal.rs18
-rw-r--r--src/test/ui/typeck/missing-private-fields-in-struct-literal.stderr15
-rw-r--r--src/test/ui/typeck/point-at-type-parameter-definition.rs17
-rw-r--r--src/test/ui/typeck/point-at-type-parameter-definition.stderr12
-rw-r--r--src/test/ui/typeck/prim-with-args.fixed44
-rw-r--r--src/test/ui/typeck/prim-with-args.rs44
-rw-r--r--src/test/ui/typeck/prim-with-args.stderr88
-rw-r--r--src/test/ui/typeck/struct-enum-wrong-args.stderr16
-rw-r--r--src/test/ui/union/union-derive-clone.mirunsafeck.stderr4
-rw-r--r--src/test/ui/union/union-derive-clone.thirunsafeck.stderr4
-rw-r--r--src/test/ui/union/union-fields-1.mirunsafeck.stderr20
-rw-r--r--src/test/ui/union/union-fields-1.rs8
-rw-r--r--src/test/ui/union/union-fields-1.thirunsafeck.stderr20
-rw-r--r--src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr5
-rw-r--r--src/test/ui/union/union-lint-dead-code.rs2
-rw-r--r--src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr5
-rw-r--r--src/test/ui/unsafe/issue-3080.mir.stderr (renamed from src/test/ui/issues/issue-3080.mir.stderr)0
-rw-r--r--src/test/ui/unsafe/issue-3080.rs (renamed from src/test/ui/issues/issue-3080.rs)0
-rw-r--r--src/test/ui/unsafe/issue-3080.thir.stderr (renamed from src/test/ui/issues/issue-3080.thir.stderr)0
-rw-r--r--src/test/ui/unsafe/issue-47412.mir.stderr (renamed from src/test/ui/issues/issue-47412.mir.stderr)0
-rw-r--r--src/test/ui/unsafe/issue-47412.rs (renamed from src/test/ui/issues/issue-47412.rs)0
-rw-r--r--src/test/ui/unsafe/issue-47412.thir.stderr (renamed from src/test/ui/issues/issue-47412.thir.stderr)0
-rw-r--r--src/test/ui/use/use-self-type.rs2
-rw-r--r--src/test/ui/use/use-self-type.stderr6
-rw-r--r--src/test/ui/usize-generic-argument-parent.rs2
-rw-r--r--src/test/ui/usize-generic-argument-parent.stderr4
-rw-r--r--src/test/ui/wf/issue-95665.rs18
-rw-r--r--src/test/ui/wf/issue-95665.stderr15
m---------src/tools/cargo0
-rw-r--r--src/tools/compiletest/src/runtest.rs2
m---------src/tools/miri23
m---------src/tools/rls0
m---------src/tools/rust-analyzer16
-rw-r--r--src/tools/rustfmt/.github/workflows/linux.yml14
-rw-r--r--src/tools/rustfmt/.github/workflows/mac.yml10
-rw-r--r--src/tools/rustfmt/.github/workflows/windows.yml11
-rw-r--r--src/tools/rustfmt/CHANGELOG.md26
-rw-r--r--src/tools/rustfmt/Cargo.lock2
-rw-r--r--src/tools/rustfmt/Cargo.toml6
-rw-r--r--src/tools/rustfmt/Configurations.md8
-rwxr-xr-xsrc/tools/rustfmt/ci/build_and_test.bat14
-rwxr-xr-xsrc/tools/rustfmt/ci/build_and_test.sh18
-rwxr-xr-xsrc/tools/rustfmt/ci/integration.sh2
-rw-r--r--src/tools/rustfmt/config_proc_macro/Cargo.lock44
-rw-r--r--src/tools/rustfmt/config_proc_macro/src/lib.rs4
-rw-r--r--src/tools/rustfmt/rust-toolchain2
-rw-r--r--src/tools/rustfmt/src/cargo-fmt/main.rs3
-rw-r--r--src/tools/rustfmt/src/comment.rs4
-rw-r--r--src/tools/rustfmt/src/config/mod.rs3
-rw-r--r--src/tools/rustfmt/src/expr.rs51
-rw-r--r--src/tools/rustfmt/src/formatting.rs2
-rw-r--r--src/tools/rustfmt/src/imports.rs343
-rw-r--r--src/tools/rustfmt/src/reorder.rs10
-rw-r--r--src/tools/rustfmt/src/rewrite.rs13
-rw-r--r--src/tools/rustfmt/src/shape.rs4
-rw-r--r--src/tools/rustfmt/src/visitor.rs7
-rw-r--r--src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100.rs16
-rw-r--r--src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100_greater_max_width.rs17
-rw-r--r--src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/50.rs16
-rw-r--r--src/tools/rustfmt/tests/source/imports_raw_identifiers/version_One.rs5
-rw-r--r--src/tools/rustfmt/tests/source/imports_raw_identifiers/version_Two.rs5
-rw-r--r--src/tools/rustfmt/tests/source/performance/issue-4476.rs638
-rw-r--r--src/tools/rustfmt/tests/source/performance/issue-5128.rs5127
-rw-r--r--src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100.rs16
-rw-r--r--src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100_greater_max_width.rs29
-rw-r--r--src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/50.rs22
-rw-r--r--src/tools/rustfmt/tests/target/imports_raw_identifiers/version_One.rs5
-rw-r--r--src/tools/rustfmt/tests/target/imports_raw_identifiers/version_Two.rs5
-rw-r--r--src/tools/rustfmt/tests/target/issue_5399.rs48
-rw-r--r--src/tools/rustfmt/tests/target/performance/issue-4476.rs705
-rw-r--r--src/tools/rustfmt/tests/target/performance/issue-4867.rs13
-rw-r--r--src/tools/rustfmt/tests/target/performance/issue-5128.rs4898
-rw-r--r--src/tools/tidy/src/deps.rs25
-rw-r--r--src/tools/tidy/src/ui_tests.rs2
-rw-r--r--src/version2
566 files changed, 9123 insertions, 14460 deletions
diff --git a/src/bootstrap/CHANGELOG.md b/src/bootstrap/CHANGELOG.md
index add73ebd44b..206bc38efb3 100644
--- a/src/bootstrap/CHANGELOG.md
+++ b/src/bootstrap/CHANGELOG.md
@@ -7,9 +7,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 
 ## [Changes since the last major version]
 
+- Vendoring is no longer done automatically when building from git sources. To use vendoring, run `cargo vendor` manually, or use the pre-vendored `rustc-src` tarball.
 - `llvm-libunwind` now accepts `in-tree` (formerly true), `system` or `no` (formerly false) [#77703](https://github.com/rust-lang/rust/pull/77703)
 - The options `infodir`, `localstatedir`, and `gpg-password-file` are no longer allowed in config.toml. Previously, they were ignored without warning. Note that `infodir` and `localstatedir` are still accepted by `./configure`, with a warning. [#82451](https://github.com/rust-lang/rust/pull/82451)
-- Add options for enabling overflow checks, one for std (`overflow-checks-std`) and one for everything else (`overflow-checks`). Both default to false.
 - Change the names for `dist` commands to match the component they generate. [#90684](https://github.com/rust-lang/rust/pull/90684)
 - The `build.fast-submodules` option has been removed. Fast submodule checkouts are enabled unconditionally. Automatic submodule handling can still be disabled with `build.submodules = false`.
 
@@ -19,6 +19,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
 - The default bootstrap profiles are now located at `bootstrap/defaults/config.$PROFILE.toml` (previously they were located at `bootstrap/defaults/config.toml.$PROFILE`) [#77558](https://github.com/rust-lang/rust/pull/77558)
 - If you have Rust already installed, `x.py` will now infer the host target
   from the default rust toolchain. [#78513](https://github.com/rust-lang/rust/pull/78513)
+- Add options for enabling overflow checks, one for std (`overflow-checks-std`) and one for everything else (`overflow-checks`). Both default to false.
 
 
 ## [Version 2] - 2020-09-25
diff --git a/src/bootstrap/Cargo.lock b/src/bootstrap/Cargo.lock
new file mode 100644
index 00000000000..6fcbd7a2156
--- /dev/null
+++ b/src/bootstrap/Cargo.lock
@@ -0,0 +1,676 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+version = 3
+
+[[package]]
+name = "aho-corasick"
+version = "0.7.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
+name = "ansi_term"
+version = "0.12.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "autocfg"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+
+[[package]]
+name = "bitflags"
+version = "1.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
+
+[[package]]
+name = "block-buffer"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf7fe51849ea569fd452f37822f606a5cabb684dc918707a0193fd4664ff324"
+dependencies = [
+ "generic-array",
+]
+
+[[package]]
+name = "bootstrap"
+version = "0.0.0"
+dependencies = [
+ "cc",
+ "cmake",
+ "filetime",
+ "getopts",
+ "hex",
+ "ignore",
+ "libc",
+ "num_cpus",
+ "once_cell",
+ "opener",
+ "pretty_assertions",
+ "serde",
+ "serde_json",
+ "sha2",
+ "sysinfo",
+ "tar",
+ "toml",
+ "walkdir",
+ "winapi",
+ "xz2",
+]
+
+[[package]]
+name = "bstr"
+version = "0.2.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
+dependencies = [
+ "lazy_static",
+ "memchr",
+ "regex-automata",
+]
+
+[[package]]
+name = "cc"
+version = "1.0.73"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
+
+[[package]]
+name = "cfg-if"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
+
+[[package]]
+name = "cmake"
+version = "0.1.48"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e8ad8cef104ac57b68b89df3208164d228503abbdce70f6880ffa3d970e7443a"
+dependencies = [
+ "cc",
+]
+
+[[package]]
+name = "core-foundation-sys"
+version = "0.8.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5827cebf4670468b8772dd191856768aedcb1b0278a04f989f7766351917b9dc"
+
+[[package]]
+name = "cpufeatures"
+version = "0.2.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "59a6001667ab124aebae2a495118e11d30984c3a653e99d86d58971708cf5e4b"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "crossbeam-channel"
+version = "0.5.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aaa7bd5fb665c6864b5f963dd9097905c54125909c7aa94c9e18507cdbe6c53"
+dependencies = [
+ "cfg-if",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-deque"
+version = "0.8.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6455c0ca19f0d2fbf751b908d5c55c1f5cbc65e03c4225427254b46890bdde1e"
+dependencies = [
+ "cfg-if",
+ "crossbeam-epoch",
+ "crossbeam-utils",
+]
+
+[[package]]
+name = "crossbeam-epoch"
+version = "0.9.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1145cf131a2c6ba0615079ab6a638f7e1973ac9c2634fcbeaaad6114246efe8c"
+dependencies = [
+ "autocfg",
+ "cfg-if",
+ "crossbeam-utils",
+ "lazy_static",
+ "memoffset",
+ "scopeguard",
+]
+
+[[package]]
+name = "crossbeam-utils"
+version = "0.8.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38"
+dependencies = [
+ "cfg-if",
+ "lazy_static",
+]
+
+[[package]]
+name = "crypto-common"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "57952ca27b5e3606ff4dd79b0020231aaf9d6aa76dc05fd30137538c50bd3ce8"
+dependencies = [
+ "generic-array",
+ "typenum",
+]
+
+[[package]]
+name = "ctor"
+version = "0.1.22"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "diff"
+version = "0.1.12"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
+
+[[package]]
+name = "digest"
+version = "0.10.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f2fb860ca6fafa5552fb6d0e816a69c8e49f0908bf524e30a90d97c85892d506"
+dependencies = [
+ "block-buffer",
+ "crypto-common",
+]
+
+[[package]]
+name = "either"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
+
+[[package]]
+name = "filetime"
+version = "0.2.16"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c0408e2626025178a6a7f7ffc05a25bc47103229f19c113755de7bf63816290c"
+dependencies = [
+ "cfg-if",
+ "libc",
+ "redox_syscall",
+ "winapi",
+]
+
+[[package]]
+name = "fnv"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
+
+[[package]]
+name = "generic-array"
+version = "0.14.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fd48d33ec7f05fbfa152300fdad764757cbded343c1aa1cff2fbaf4134851803"
+dependencies = [
+ "typenum",
+ "version_check",
+]
+
+[[package]]
+name = "getopts"
+version = "0.2.21"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "14dbbfd5c71d70241ecf9e6f13737f7b5ce823821063188d7e46c41d371eebd5"
+dependencies = [
+ "unicode-width",
+]
+
+[[package]]
+name = "globset"
+version = "0.4.8"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10463d9ff00a2a068db14231982f5132edebad0d7660cd956a1c30292dbcbfbd"
+dependencies = [
+ "aho-corasick",
+ "bstr",
+ "fnv",
+ "log",
+ "regex",
+]
+
+[[package]]
+name = "hermit-abi"
+version = "0.1.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "hex"
+version = "0.4.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
+
+[[package]]
+name = "ignore"
+version = "0.4.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "713f1b139373f96a2e0ce3ac931cd01ee973c3c5dd7c40c0c2efe96ad2b6751d"
+dependencies = [
+ "crossbeam-utils",
+ "globset",
+ "lazy_static",
+ "log",
+ "memchr",
+ "regex",
+ "same-file",
+ "thread_local",
+ "walkdir",
+ "winapi-util",
+]
+
+[[package]]
+name = "itoa"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "112c678d4050afce233f4f2852bb2eb519230b3cf12f33585275537d7e41578d"
+
+[[package]]
+name = "lazy_static"
+version = "1.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
+
+[[package]]
+name = "libc"
+version = "0.2.126"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "349d5a591cd28b49e1d1037471617a32ddcda5731b99419008085f72d5a53836"
+
+[[package]]
+name = "log"
+version = "0.4.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
+dependencies = [
+ "cfg-if",
+]
+
+[[package]]
+name = "lzma-sys"
+version = "0.1.17"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bdb4b7c3eddad11d3af9e86c487607d2d2442d185d848575365c4856ba96d619"
+dependencies = [
+ "cc",
+ "libc",
+ "pkg-config",
+]
+
+[[package]]
+name = "memchr"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
+
+[[package]]
+name = "memoffset"
+version = "0.6.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce"
+dependencies = [
+ "autocfg",
+]
+
+[[package]]
+name = "ntapi"
+version = "0.3.7"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c28774a7fd2fbb4f0babd8237ce554b73af68021b5f695a3cebd6c59bac0980f"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "num_cpus"
+version = "1.13.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
+dependencies = [
+ "hermit-abi",
+ "libc",
+]
+
+[[package]]
+name = "once_cell"
+version = "1.12.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "7709cef83f0c1f58f666e746a08b21e0085f7440fa6a29cc194d68aac97a4225"
+
+[[package]]
+name = "opener"
+version = "0.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4ea3ebcd72a54701f56345f16785a6d3ac2df7e986d273eb4395c0b01db17952"
+dependencies = [
+ "bstr",
+ "winapi",
+]
+
+[[package]]
+name = "output_vt100"
+version = "0.1.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "628223faebab4e3e40667ee0b2336d34a5b960ff60ea743ddfdbcf7770bcfb66"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "pkg-config"
+version = "0.3.25"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
+
+[[package]]
+name = "pretty_assertions"
+version = "0.7.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1cab0e7c02cf376875e9335e0ba1da535775beb5450d21e1dffca068818ed98b"
+dependencies = [
+ "ansi_term",
+ "ctor",
+ "diff",
+ "output_vt100",
+]
+
+[[package]]
+name = "proc-macro2"
+version = "1.0.39"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c54b25569025b7fc9651de43004ae593a75ad88543b17178aa5e1b9c4f15f56f"
+dependencies = [
+ "unicode-ident",
+]
+
+[[package]]
+name = "quote"
+version = "1.0.18"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1"
+dependencies = [
+ "proc-macro2",
+]
+
+[[package]]
+name = "rayon"
+version = "1.5.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bd99e5772ead8baa5215278c9b15bf92087709e9c1b2d1f97cdb5a183c933a7d"
+dependencies = [
+ "autocfg",
+ "crossbeam-deque",
+ "either",
+ "rayon-core",
+]
+
+[[package]]
+name = "rayon-core"
+version = "1.9.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "258bcdb5ac6dad48491bb2992db6b7cf74878b0384908af124823d118c99683f"
+dependencies = [
+ "crossbeam-channel",
+ "crossbeam-deque",
+ "crossbeam-utils",
+ "num_cpus",
+]
+
+[[package]]
+name = "redox_syscall"
+version = "0.2.13"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42"
+dependencies = [
+ "bitflags",
+]
+
+[[package]]
+name = "regex"
+version = "1.5.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d83f127d94bdbcda4c8cc2e50f6f84f4b611f69c902699ca385a39c3a75f9ff1"
+dependencies = [
+ "aho-corasick",
+ "memchr",
+ "regex-syntax",
+]
+
+[[package]]
+name = "regex-automata"
+version = "0.1.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132"
+
+[[package]]
+name = "regex-syntax"
+version = "0.6.26"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49b3de9ec5dc0a3417da371aab17d729997c15010e7fd24ff707773a33bddb64"
+
+[[package]]
+name = "ryu"
+version = "1.0.10"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f3f6f92acf49d1b98f7a81226834412ada05458b7364277387724a237f062695"
+
+[[package]]
+name = "same-file"
+version = "1.0.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
+dependencies = [
+ "winapi-util",
+]
+
+[[package]]
+name = "scopeguard"
+version = "1.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
+
+[[package]]
+name = "serde"
+version = "1.0.137"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1"
+dependencies = [
+ "serde_derive",
+]
+
+[[package]]
+name = "serde_derive"
+version = "1.0.137"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "serde_json"
+version = "1.0.81"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c"
+dependencies = [
+ "itoa",
+ "ryu",
+ "serde",
+]
+
+[[package]]
+name = "sha2"
+version = "0.10.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "55deaec60f81eefe3cce0dc50bda92d6d8e88f2a27df7c5033b42afeb1ed2676"
+dependencies = [
+ "cfg-if",
+ "cpufeatures",
+ "digest",
+]
+
+[[package]]
+name = "syn"
+version = "1.0.95"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fbaf6116ab8924f39d52792136fb74fd60a80194cf1b1c6ffa6453eef1c3f942"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "unicode-ident",
+]
+
+[[package]]
+name = "sysinfo"
+version = "0.24.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9a2809487b962344ca55d9aea565f9ffbcb6929780802217acc82561f6746770"
+dependencies = [
+ "cfg-if",
+ "core-foundation-sys",
+ "libc",
+ "ntapi",
+ "once_cell",
+ "rayon",
+ "winapi",
+]
+
+[[package]]
+name = "tar"
+version = "0.4.38"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "4b55807c0344e1e6c04d7c965f5289c39a8d94ae23ed5c0b57aabac549f871c6"
+dependencies = [
+ "filetime",
+ "libc",
+ "xattr",
+]
+
+[[package]]
+name = "thread_local"
+version = "1.1.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5516c27b78311c50bf42c071425c560ac799b11c30b31f87e3081965fe5e0180"
+dependencies = [
+ "once_cell",
+]
+
+[[package]]
+name = "toml"
+version = "0.5.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8d82e1a7758622a465f8cee077614c73484dac5b836c02ff6a40d5d1010324d7"
+dependencies = [
+ "serde",
+]
+
+[[package]]
+name = "typenum"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "dcf81ac59edc17cc8697ff311e8f5ef2d99fcbd9817b34cec66f90b6c3dfd987"
+
+[[package]]
+name = "unicode-ident"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "d22af068fba1eb5edcb4aea19d382b2a3deb4c8f9d475c589b6ada9e0fd493ee"
+
+[[package]]
+name = "unicode-width"
+version = "0.1.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
+
+[[package]]
+name = "version_check"
+version = "0.9.4"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
+
+[[package]]
+name = "walkdir"
+version = "2.3.2"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56"
+dependencies = [
+ "same-file",
+ "winapi",
+ "winapi-util",
+]
+
+[[package]]
+name = "winapi"
+version = "0.3.9"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
+dependencies = [
+ "winapi-i686-pc-windows-gnu",
+ "winapi-x86_64-pc-windows-gnu",
+]
+
+[[package]]
+name = "winapi-i686-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
+
+[[package]]
+name = "winapi-util"
+version = "0.1.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178"
+dependencies = [
+ "winapi",
+]
+
+[[package]]
+name = "winapi-x86_64-pc-windows-gnu"
+version = "0.4.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
+
+[[package]]
+name = "xattr"
+version = "0.2.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc"
+dependencies = [
+ "libc",
+]
+
+[[package]]
+name = "xz2"
+version = "0.1.6"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "c179869f34fc7c01830d3ce7ea2086bc3a07e0d35289b667d0a8bf910258926c"
+dependencies = [
+ "lzma-sys",
+]
diff --git a/src/bootstrap/Cargo.toml b/src/bootstrap/Cargo.toml
index ed5c59a2595..b9bd3d0cf78 100644
--- a/src/bootstrap/Cargo.toml
+++ b/src/bootstrap/Cargo.toml
@@ -74,3 +74,11 @@ pretty_assertions = "0.7"
 
 [features]
 build-metrics = ["sysinfo"]
+
+# We care a lot about bootstrap's compile times, so don't include debuginfo for
+# dependencies, only bootstrap itself.
+[profile.dev]
+debug = 0
+[profile.dev.package]
+# Only use debuginfo=1 to further reduce compile times.
+bootstrap.debug = 1
diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py
index 3b2b507b062..8000e60f64d 100644
--- a/src/bootstrap/bootstrap.py
+++ b/src/bootstrap/bootstrap.py
@@ -743,7 +743,7 @@ class RustBuild(object):
         """
         return os.path.join(self.build_dir, "bootstrap", "debug", "bootstrap")
 
-    def build_bootstrap(self):
+    def build_bootstrap(self, color):
         """Build bootstrap"""
         print("Building rustbuild")
         build_dir = os.path.join(self.build_dir, "bootstrap")
@@ -800,6 +800,11 @@ class RustBuild(object):
         if self.get_toml("metrics", "build"):
             args.append("--features")
             args.append("build-metrics")
+        if color == "always":
+            args.append("--color=always")
+        elif color == "never":
+            args.append("--color=never")
+
         run(args, env=env, verbose=self.verbose)
 
     def build_triple(self):
@@ -813,110 +818,6 @@ class RustBuild(object):
             return config
         return default_build_triple(self.verbose)
 
-    def check_submodule(self, module):
-        checked_out = subprocess.Popen(["git", "rev-parse", "HEAD"],
-                                        cwd=os.path.join(self.rust_root, module),
-                                        stdout=subprocess.PIPE)
-        return checked_out
-
-    def update_submodule(self, module, checked_out, recorded_submodules):
-        module_path = os.path.join(self.rust_root, module)
-
-        default_encoding = sys.getdefaultencoding()
-        checked_out = checked_out.communicate()[0].decode(default_encoding).strip()
-        if recorded_submodules[module] == checked_out:
-            return
-
-        print("Updating submodule", module)
-
-        run(["git", "submodule", "-q", "sync", module],
-            cwd=self.rust_root, verbose=self.verbose)
-
-        update_args = ["git", "submodule", "update", "--init", "--recursive", "--depth=1"]
-        if self.git_version >= distutils.version.LooseVersion("2.11.0"):
-            update_args.append("--progress")
-        update_args.append(module)
-        try:
-            run(update_args, cwd=self.rust_root, verbose=self.verbose, exception=True)
-        except RuntimeError:
-            print("Failed updating submodule. This is probably due to uncommitted local changes.")
-            print('Either stash the changes by running "git stash" within the submodule\'s')
-            print('directory, reset them by running "git reset --hard", or commit them.')
-            print("To reset all submodules' changes run", end=" ")
-            print('"git submodule foreach --recursive git reset --hard".')
-            raise SystemExit(1)
-
-        run(["git", "reset", "-q", "--hard"],
-            cwd=module_path, verbose=self.verbose)
-        run(["git", "clean", "-qdfx"],
-            cwd=module_path, verbose=self.verbose)
-
-    def update_submodules(self):
-        """Update submodules"""
-        has_git = os.path.exists(os.path.join(self.rust_root, ".git"))
-        # This just arbitrarily checks for cargo, but any workspace member in
-        # a submodule would work.
-        has_submodules = os.path.exists(os.path.join(self.rust_root, "src/tools/cargo/Cargo.toml"))
-        if not has_git and not has_submodules:
-            print("This is not a git repository, and the requisite git submodules were not found.")
-            print("If you downloaded the source from https://github.com/rust-lang/rust/releases,")
-            print("those sources will not work. Instead, consider downloading from the source")
-            print("releases linked at")
-            print("https://forge.rust-lang.org/infra/other-installation-methods.html#source-code")
-            print("or clone the repository at https://github.com/rust-lang/rust/.")
-            raise SystemExit(1)
-        if not has_git or self.get_toml('submodules') == "false":
-            return
-
-        default_encoding = sys.getdefaultencoding()
-
-        # check the existence and version of 'git' command
-        git_version_str = require(['git', '--version']).split()[2].decode(default_encoding)
-        self.git_version = distutils.version.LooseVersion(git_version_str)
-
-        start_time = time()
-        print('Updating only changed submodules')
-        default_encoding = sys.getdefaultencoding()
-        # Only update submodules that are needed to build bootstrap.  These are needed because Cargo
-        # currently requires everything in a workspace to be "locally present" when starting a
-        # build, and will give a hard error if any Cargo.toml files are missing.
-        # FIXME: Is there a way to avoid cloning these eagerly? Bootstrap itself doesn't need to
-        #   share a workspace with any tools - maybe it could be excluded from the workspace?
-        #   That will still require cloning the submodules the second you check the standard
-        #   library, though...
-        # FIXME: Is there a way to avoid hard-coding the submodules required?
-        # WARNING: keep this in sync with the submodules hard-coded in bootstrap/lib.rs
-        submodules = [
-            "src/tools/rust-installer",
-            "src/tools/cargo",
-            "src/tools/rls",
-            "src/tools/miri",
-            "library/backtrace",
-            "library/stdarch"
-        ]
-        # If build.vendor is set in config.toml, we must update rust-analyzer also.
-        # Otherwise, the bootstrap will fail (#96456).
-        if self.use_vendored_sources:
-            submodules.append("src/tools/rust-analyzer")
-        filtered_submodules = []
-        submodules_names = []
-        for module in submodules:
-            check = self.check_submodule(module)
-            filtered_submodules.append((module, check))
-            submodules_names.append(module)
-        recorded = subprocess.Popen(["git", "ls-tree", "HEAD"] + submodules_names,
-                                    cwd=self.rust_root, stdout=subprocess.PIPE)
-        recorded = recorded.communicate()[0].decode(default_encoding).strip().splitlines()
-        # { filename: hash }
-        recorded_submodules = {}
-        for data in recorded:
-            # [mode, kind, hash, filename]
-            data = data.split()
-            recorded_submodules[data[3]] = data[2]
-        for module in filtered_submodules:
-            self.update_submodule(module[0], module[1], recorded_submodules)
-        print("  Submodules updated in %.2f seconds" % (time() - start_time))
-
     def set_dist_environment(self, url):
         """Set download URL for normal environment"""
         if 'RUSTUP_DIST_SERVER' in os.environ:
@@ -926,54 +827,32 @@ class RustBuild(object):
 
     def check_vendored_status(self):
         """Check that vendoring is configured properly"""
-        vendor_dir = os.path.join(self.rust_root, 'vendor')
         if 'SUDO_USER' in os.environ and not self.use_vendored_sources:
             if os.getuid() == 0:
                 self.use_vendored_sources = True
                 print('info: looks like you\'re trying to run this command as root')
                 print('      and so in order to preserve your $HOME this will now')
                 print('      use vendored sources by default.')
-                if not os.path.exists(vendor_dir):
-                    print('error: vendoring required, but vendor directory does not exist.')
-                    print('       Run `cargo vendor` without sudo to initialize the '
-                          'vendor directory.')
-                    raise Exception("{} not found".format(vendor_dir))
 
+        cargo_dir = os.path.join(self.rust_root, '.cargo')
         if self.use_vendored_sources:
-            config = ("[source.crates-io]\n"
-                      "replace-with = 'vendored-sources'\n"
-                      "registry = 'https://example.com'\n"
-                      "\n"
-                      "[source.vendored-sources]\n"
-                      "directory = '{}/vendor'\n"
-                      .format(self.rust_root))
-            if not os.path.exists('.cargo'):
-                os.makedirs('.cargo')
-                with output('.cargo/config') as cargo_config:
-                    cargo_config.write(config)
-            else:
-                print('info: using vendored source, but .cargo/config is already present.')
-                print('      Reusing the current configuration file. But you may want to '
-                      'configure vendoring like this:')
-                print(config)
+            vendor_dir = os.path.join(self.rust_root, 'vendor')
+            if not os.path.exists(vendor_dir):
+                sync_dirs = "--sync ./src/tools/rust-analyzer/Cargo.toml " \
+                            "--sync ./compiler/rustc_codegen_cranelift/Cargo.toml " \
+                            "--sync ./src/bootstrap/Cargo.toml "
+                print('error: vendoring required, but vendor directory does not exist.')
+                print('       Run `cargo vendor {}` to initialize the '
+                      'vendor directory.'.format(sync_dirs))
+                print('Alternatively, use the pre-vendored `rustc-src` dist component.')
+                raise Exception("{} not found".format(vendor_dir))
+
+            if not os.path.exists(cargo_dir):
+                print('error: vendoring required, but .cargo/config does not exist.')
+                raise Exception("{} not found".format(cargo_dir))
         else:
-            if os.path.exists('.cargo'):
-                shutil.rmtree('.cargo')
-
-    def ensure_vendored(self):
-        """Ensure that the vendored sources are available if needed"""
-        vendor_dir = os.path.join(self.rust_root, 'vendor')
-        # Note that this does not handle updating the vendored dependencies if
-        # the rust git repository is updated. Normal development usually does
-        # not use vendoring, so hopefully this isn't too much of a problem.
-        if self.use_vendored_sources and not os.path.exists(vendor_dir):
-            run([
-                self.cargo(),
-                "vendor",
-                "--sync=./src/tools/rust-analyzer/Cargo.toml",
-                "--sync=./compiler/rustc_codegen_cranelift/Cargo.toml",
-            ], verbose=self.verbose, cwd=self.rust_root)
-
+            if os.path.exists(cargo_dir):
+                shutil.rmtree(cargo_dir)
 
 def bootstrap(help_triggered):
     """Configure, fetch, build and run the initial bootstrap"""
@@ -988,6 +867,7 @@ def bootstrap(help_triggered):
     parser = argparse.ArgumentParser(description='Build rust')
     parser.add_argument('--config')
     parser.add_argument('--build')
+    parser.add_argument('--color', choices=['always', 'never', 'auto'])
     parser.add_argument('--clean', action='store_true')
     parser.add_argument('-v', '--verbose', action='count', default=0)
 
@@ -1052,13 +932,11 @@ def bootstrap(help_triggered):
     if not os.path.exists(build.build_dir):
         os.makedirs(build.build_dir)
     lock = acquire_lock(build.build_dir)
-    build.update_submodules()
 
     # Fetch/build the bootstrap
     build.download_toolchain()
     sys.stdout.flush()
-    build.ensure_vendored()
-    build.build_bootstrap()
+    build.build_bootstrap(args.color)
     sys.stdout.flush()
 
     # Run the bootstrap
diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs
index b1fae356d89..8182d2bf8fb 100644
--- a/src/bootstrap/dist.rs
+++ b/src/bootstrap/dist.rs
@@ -894,8 +894,19 @@ impl Step for PlainSourceTarball {
                 .arg(builder.src.join("./src/tools/rust-analyzer/Cargo.toml"))
                 .arg("--sync")
                 .arg(builder.src.join("./compiler/rustc_codegen_cranelift/Cargo.toml"))
+                .arg("--sync")
+                .arg(builder.src.join("./src/bootstrap/Cargo.toml"))
                 .current_dir(&plain_dst_src);
-            builder.run(&mut cmd);
+
+            let config = if !builder.config.dry_run {
+                t!(String::from_utf8(t!(cmd.output()).stdout))
+            } else {
+                String::new()
+            };
+
+            let cargo_config_dir = plain_dst_src.join(".cargo");
+            builder.create_dir(&cargo_config_dir);
+            builder.create(&cargo_config_dir.join("config.toml"), &config);
         }
 
         tarball.bare()
diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs
index 4ac857b470e..859d35b7d7b 100644
--- a/src/bootstrap/lib.rs
+++ b/src/bootstrap/lib.rs
@@ -537,6 +537,20 @@ impl Build {
             build.local_rebuild = true;
         }
 
+        // Make sure we update these before gathering metadata so we don't get an error about missing
+        // Cargo.toml files.
+        let rust_submodules = [
+            "src/tools/rust-installer",
+            "src/tools/cargo",
+            "src/tools/rls",
+            "src/tools/miri",
+            "library/backtrace",
+            "library/stdarch",
+        ];
+        for s in rust_submodules {
+            build.update_submodule(Path::new(s));
+        }
+
         build.verbose("learning about cargo");
         metadata::build(&mut build);
 
diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs
index 329bb68672e..ea410849694 100644
--- a/src/bootstrap/native.rs
+++ b/src/bootstrap/native.rs
@@ -150,6 +150,19 @@ pub(crate) fn maybe_download_ci_llvm(builder: &Builder<'_>) {
         for binary in ["llvm-config", "FileCheck"] {
             builder.fix_bin_or_dylib(&llvm_root.join("bin").join(binary));
         }
+
+        // Update the timestamp of llvm-config to force rustc_llvm to be
+        // rebuilt. This is a hacky workaround for a deficiency in Cargo where
+        // the rerun-if-changed directive doesn't handle changes very well.
+        // https://github.com/rust-lang/cargo/issues/10791
+        // Cargo only compares the timestamp of the file relative to the last
+        // time `rustc_llvm` build script ran. However, the timestamps of the
+        // files in the tarball are in the past, so it doesn't trigger a
+        // rebuild.
+        let now = filetime::FileTime::from_system_time(std::time::SystemTime::now());
+        let llvm_config = llvm_root.join("bin/llvm-config");
+        t!(filetime::set_file_times(&llvm_config, now, now));
+
         let llvm_lib = llvm_root.join("lib");
         for entry in t!(fs::read_dir(&llvm_lib)) {
             let lib = t!(entry).path();
diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version b/src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version
index 03834411d15..9cf038687f1 100644
--- a/src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version
+++ b/src/ci/docker/host-x86_64/x86_64-gnu-tools/browser-ui-test.version
@@ -1 +1 @@
-0.9.5
\ No newline at end of file
+0.9.6
\ No newline at end of file
diff --git a/src/ci/init_repo.sh b/src/ci/init_repo.sh
index ec45d9e8bc6..e8c1e2b0f59 100755
--- a/src/ci/init_repo.sh
+++ b/src/ci/init_repo.sh
@@ -48,7 +48,10 @@ function fetch_github_commit_archive {
     rm $cached
 }
 
-included="src/llvm-project src/doc/book src/doc/rust-by-example"
+# Archive downloads are temporarily disabled due to sudden 504
+# gateway timeout errors.
+# included="src/llvm-project src/doc/book src/doc/rust-by-example"
+included=""
 modules="$(git config --file .gitmodules --get-regexp '\.path$' | cut -d' ' -f2)"
 modules=($modules)
 use_git=""
@@ -71,10 +74,10 @@ for i in ${!modules[@]}; do
 done
 retry sh -c "git submodule deinit -f $use_git && \
     git submodule sync && \
-    git submodule update -j 16 --init --recursive $use_git"
-STATUS=0
-for pid in ${bg_pids[*]}
-do
-    wait $pid || STATUS=1
-done
-exit ${STATUS}
+    git submodule update -j 16 --init --recursive --depth 1 $use_git"
+# STATUS=0
+# for pid in ${bg_pids[*]}
+# do
+#     wait $pid || STATUS=1
+# done
+# exit ${STATUS}
diff --git a/src/doc/book b/src/doc/book
-Subproject 396fdb69de7fb18f24b15c7ad13491b1c1fa723
+Subproject efbafdba3618487fbc9305318fcab9775132ac1
diff --git a/src/doc/embedded-book b/src/doc/embedded-book
-Subproject cbb494f96da3268c2925bdadc65ca83d42f2d4e
+Subproject e17dcef5e96346ee3d7fa56820ddc7e5c39636b
diff --git a/src/doc/reference b/src/doc/reference
-Subproject 683bfe5cd64d589c6a1645312ab5f93b6385ccb
+Subproject 9fce337a55ee4a4629205f6094656195cecad23
diff --git a/src/doc/rust-by-example b/src/doc/rust-by-example
-Subproject dbb7e5e2345ee26199ffba218156b6009016a20
+Subproject 1095df2a5850f2d345fad43a30633133365875b
diff --git a/src/doc/rustc-dev-guide b/src/doc/rustc-dev-guide
-Subproject 6e4d6435db89bcc027b1bba9742e4f59666f541
+Subproject 048d925f0a955aac601c4160c0e7f05771bcf63
diff --git a/src/doc/unstable-book/src/compiler-flags/extern-options.md b/src/doc/unstable-book/src/compiler-flags/extern-options.md
new file mode 100644
index 00000000000..dfc1de77be4
--- /dev/null
+++ b/src/doc/unstable-book/src/compiler-flags/extern-options.md
@@ -0,0 +1,27 @@
+# `--extern` Options
+
+* Tracking issue for `--extern` crate modifiers: [#98405](https://github.com/rust-lang/rust/issues/98405)
+* Tracking issue for `noprelude`: [#98398](https://github.com/rust-lang/rust/issues/98398)
+* Tracking issue for `priv`: [#98399](https://github.com/rust-lang/rust/issues/98399)
+* Tracking issue for `nounused`: [#98400](https://github.com/rust-lang/rust/issues/98400)
+
+The behavior of the `--extern` flag can be modified with `noprelude`, `priv` or `nounused` options.
+
+This is unstable feature, so you have to provide `-Zunstable-options` to enable it.
+
+## Examples
+
+Use your own build of the `core` crate.
+
+`rustc main.rs -Z unstable-options --extern noprelude:core=libcore.rlib`
+
+To use multiple options, separate them with a comma:
+
+`rustc main.rs -Z unstable-options --extern noprelude,priv,nounused:mydep=mydep.rlib`
+
+## Options
+
+* `noprelude`: Do not add the crate to the external prelude. If used, it will need to be imported using `extern crate`.
+  This is used by the [build-std project](https://github.com/rust-lang/wg-cargo-std-aware/) to simulate compatibility with sysroot-only crates.
+* `priv`: Mark the crate as a private dependency for the [`exported_private_dependencies`](../../rustc/lints/listing/warn-by-default.html#exported-private-dependencies) lint.
+* `nounused`: Suppress [`unused-crate-dependencies`](../../rustc/lints/listing/allowed-by-default.html#unused-crate-dependencies) warnings for the crate.
diff --git a/src/doc/unstable-book/src/language-features/lang-items.md b/src/doc/unstable-book/src/language-features/lang-items.md
index 86bedb51538..39238dffa10 100644
--- a/src/doc/unstable-book/src/language-features/lang-items.md
+++ b/src/doc/unstable-book/src/language-features/lang-items.md
@@ -23,8 +23,10 @@ use core::panic::PanicInfo;
 
 extern crate libc;
 
+struct Unique<T>(*mut T);
+
 #[lang = "owned_box"]
-pub struct Box<T>(*mut T);
+pub struct Box<T>(Unique<T>);
 
 #[lang = "exchange_malloc"]
 unsafe fn allocate(size: usize, _align: usize) -> *mut u8 {
diff --git a/src/etc/cpu-usage-over-time-plot.sh b/src/etc/cpu-usage-over-time-plot.sh
index 0905789079a..1c342559194 100755
--- a/src/etc/cpu-usage-over-time-plot.sh
+++ b/src/etc/cpu-usage-over-time-plot.sh
@@ -7,13 +7,21 @@
 # commit SHA of the build you're interested in, and the second is the name of
 # the builder. For example:
 #
-#  ./src/etc/cpu-usage-over-time-plot.sh e699ea096fcc2fc9ce8e8bcf884e11496a31cc9f i686-mingw-1
+#  ./src/etc/cpu-usage-over-time-plot.sh 7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c x86_64-gnu
 #
 # That will generate `$builder.png` in the current directory which you can open
 # up to see a hopefully pretty graph.
 #
 # Improvements to this script are greatly appreciated!
 
+if [[ $# != 2 ]]; then
+    echo "expected 2 arguments, recieved $#"
+    echo "example usage: './src/etc/cpu-usage-over-time-plot.sh \
+7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c \
+x86_64-gnu'"
+    exit 1
+fi
+
 set -ex
 
 bucket=rust-lang-ci2
@@ -30,7 +38,7 @@ set ylabel "CPU Usage %"
 set xlabel "Time"
 set datafile sep ','
 set term png size 3000,1000
-set output "$builder.png"
+set output "$builder-$commit-cpu-usage-plot.png"
 set grid
 
 f(x) = mean_y
@@ -43,7 +51,9 @@ set ytics 10
 set boxwidth 0.5
 
 plot \\
-   mean_y with lines linetype 1 linecolor rgb "#ff0000" title "average", \\
-   "cpu-$builder.csv" using 1:(100-\$2) with points pointtype 7 pointsize 0.4 title "$builder", \\
-   "" using 1:(100-\$2) smooth bezier linewidth 3 title "bezier"
+    mean_y with lines linetype 1 linecolor rgb "#ff0000" title "average", "cpu-$builder.csv" \\
+    using 1:(100-\$2) with points pointtype 7 pointsize 0.4 title "$builder", "" \\
+    using 1:(100-\$2) smooth bezier linewidth 3 title "bezier"
 EOF
+
+rm "cpu-$builder.csv"
diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs
index fd30691c324..9e5c4afc717 100644
--- a/src/librustdoc/clean/mod.rs
+++ b/src/librustdoc/clean/mod.rs
@@ -222,10 +222,15 @@ impl<'tcx> Clean<'tcx, Option<Lifetime>> for ty::Region<'tcx> {
         match **self {
             ty::ReStatic => Some(Lifetime::statik()),
             ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name), .. }) => {
-                Some(Lifetime(name))
+                if name != kw::UnderscoreLifetime { Some(Lifetime(name)) } else { None }
+            }
+            ty::ReEarlyBound(ref data) => {
+                if data.name != kw::UnderscoreLifetime {
+                    Some(Lifetime(data.name))
+                } else {
+                    None
+                }
             }
-            ty::ReEarlyBound(ref data) => Some(Lifetime(data.name)),
-
             ty::ReLateBound(..)
             | ty::ReFree(..)
             | ty::ReVar(..)
@@ -530,29 +535,25 @@ fn clean_generic_param<'tcx>(
     GenericParamDef { name, kind }
 }
 
+/// Synthetic type-parameters are inserted after normal ones.
+/// In order for normal parameters to be able to refer to synthetic ones,
+/// scans them first.
+fn is_impl_trait(param: &hir::GenericParam<'_>) -> bool {
+    match param.kind {
+        hir::GenericParamKind::Type { synthetic, .. } => synthetic,
+        _ => false,
+    }
+}
+
+/// This can happen for `async fn`, e.g. `async fn f<'_>(&'_ self)`.
+///
+/// See `lifetime_to_generic_param` in `rustc_ast_lowering` for more information.
+fn is_elided_lifetime(param: &hir::GenericParam<'_>) -> bool {
+    matches!(param.kind, hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Elided })
+}
+
 impl<'tcx> Clean<'tcx, Generics> for hir::Generics<'tcx> {
     fn clean(&self, cx: &mut DocContext<'tcx>) -> Generics {
-        // Synthetic type-parameters are inserted after normal ones.
-        // In order for normal parameters to be able to refer to synthetic ones,
-        // scans them first.
-        fn is_impl_trait(param: &hir::GenericParam<'_>) -> bool {
-            match param.kind {
-                hir::GenericParamKind::Type { synthetic, .. } => synthetic,
-                _ => false,
-            }
-        }
-        /// This can happen for `async fn`, e.g. `async fn f<'_>(&'_ self)`.
-        ///
-        /// See [`lifetime_to_generic_param`] in [`rustc_ast_lowering`] for more information.
-        ///
-        /// [`lifetime_to_generic_param`]: rustc_ast_lowering::LoweringContext::lifetime_to_generic_param
-        fn is_elided_lifetime(param: &hir::GenericParam<'_>) -> bool {
-            matches!(
-                param.kind,
-                hir::GenericParamKind::Lifetime { kind: hir::LifetimeParamKind::Elided }
-            )
-        }
-
         let impl_trait_params = self
             .params
             .iter()
@@ -991,6 +992,7 @@ impl<'tcx> Clean<'tcx, PolyTrait> for hir::PolyTraitRef<'tcx> {
             generic_params: self
                 .bound_generic_params
                 .iter()
+                .filter(|p| !is_elided_lifetime(p))
                 .map(|x| clean_generic_param(cx, None, x))
                 .collect(),
         }
@@ -1865,8 +1867,12 @@ impl<'tcx> Clean<'tcx, BareFunctionDecl> for hir::BareFnTy<'tcx> {
     fn clean(&self, cx: &mut DocContext<'tcx>) -> BareFunctionDecl {
         let (generic_params, decl) = enter_impl_trait(cx, |cx| {
             // NOTE: generics must be cleaned before args
-            let generic_params =
-                self.generic_params.iter().map(|x| clean_generic_param(cx, None, x)).collect();
+            let generic_params = self
+                .generic_params
+                .iter()
+                .filter(|p| !is_elided_lifetime(p))
+                .map(|x| clean_generic_param(cx, None, x))
+                .collect();
             let args = clean_args_from_types_and_names(cx, self.decl.inputs, self.param_names);
             let decl = clean_fn_decl_with_args(cx, self.decl, args);
             (generic_params, decl)
diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs
index 41ab0e9377d..16574f94c00 100644
--- a/src/librustdoc/clean/utils.rs
+++ b/src/librustdoc/clean/utils.rs
@@ -84,12 +84,9 @@ pub(crate) fn substs_to_args<'tcx>(
     let mut ret_val =
         Vec::with_capacity(substs.len().saturating_sub(if skip_first { 1 } else { 0 }));
     ret_val.extend(substs.iter().filter_map(|kind| match kind.unpack() {
-        GenericArgKind::Lifetime(lt) => match *lt {
-            ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrAnon(_), .. }) => {
-                Some(GenericArg::Lifetime(Lifetime::elided()))
-            }
-            _ => lt.clean(cx).map(GenericArg::Lifetime),
-        },
+        GenericArgKind::Lifetime(lt) => {
+            Some(GenericArg::Lifetime(lt.clean(cx).unwrap_or(Lifetime::elided())))
+        }
         GenericArgKind::Type(_) if skip_first => {
             skip_first = false;
             None
diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs
index 5baa53d5554..056eda089c1 100644
--- a/src/librustdoc/html/format.rs
+++ b/src/librustdoc/html/format.rs
@@ -8,14 +8,16 @@
 use std::borrow::Cow;
 use std::cell::Cell;
 use std::fmt;
-use std::iter;
+use std::iter::{self, once};
 
+use rustc_ast as ast;
 use rustc_attr::{ConstStability, StabilityLevel};
 use rustc_data_structures::captures::Captures;
 use rustc_data_structures::fx::FxHashSet;
 use rustc_hir as hir;
 use rustc_hir::def::DefKind;
 use rustc_hir::def_id::DefId;
+use rustc_metadata::creader::{CStore, LoadedMacro};
 use rustc_middle::ty;
 use rustc_middle::ty::DefIdTree;
 use rustc_middle::ty::TyCtxt;
@@ -519,6 +521,7 @@ impl clean::GenericArgs {
 }
 
 // Possible errors when computing href link source for a `DefId`
+#[derive(PartialEq, Eq)]
 pub(crate) enum HrefError {
     /// This item is known to rustdoc, but from a crate that does not have documentation generated.
     ///
@@ -556,6 +559,79 @@ pub(crate) fn join_with_double_colon(syms: &[Symbol]) -> String {
     s
 }
 
+/// This function is to get the external macro path because they are not in the cache used in
+/// `href_with_root_path`.
+fn generate_macro_def_id_path(
+    def_id: DefId,
+    cx: &Context<'_>,
+    root_path: Option<&str>,
+) -> Result<(String, ItemType, Vec<Symbol>), HrefError> {
+    let tcx = cx.shared.tcx;
+    let crate_name = tcx.crate_name(def_id.krate).to_string();
+    let cache = cx.cache();
+
+    let fqp: Vec<Symbol> = tcx
+        .def_path(def_id)
+        .data
+        .into_iter()
+        .filter_map(|elem| {
+            // extern blocks (and a few others things) have an empty name.
+            match elem.data.get_opt_name() {
+                Some(s) if !s.is_empty() => Some(s),
+                _ => None,
+            }
+        })
+        .collect();
+    let relative = fqp.iter().map(|elem| elem.to_string());
+    let cstore = CStore::from_tcx(tcx);
+    // We need this to prevent a `panic` when this function is used from intra doc links...
+    if !cstore.has_crate_data(def_id.krate) {
+        debug!("No data for crate {}", crate_name);
+        return Err(HrefError::NotInExternalCache);
+    }
+    // Check to see if it is a macro 2.0 or built-in macro.
+    // More information in <https://rust-lang.github.io/rfcs/1584-macros.html>.
+    let is_macro_2 = match cstore.load_macro_untracked(def_id, tcx.sess) {
+        LoadedMacro::MacroDef(def, _) => {
+            // If `ast_def.macro_rules` is `true`, then it's not a macro 2.0.
+            matches!(&def.kind, ast::ItemKind::MacroDef(ast_def) if !ast_def.macro_rules)
+        }
+        _ => false,
+    };
+
+    let mut path = if is_macro_2 {
+        once(crate_name.clone()).chain(relative).collect()
+    } else {
+        vec![crate_name.clone(), relative.last().unwrap()]
+    };
+    if path.len() < 2 {
+        // The minimum we can have is the crate name followed by the macro name. If shorter, then
+        // it means that that `relative` was empty, which is an error.
+        debug!("macro path cannot be empty!");
+        return Err(HrefError::NotInExternalCache);
+    }
+
+    if let Some(last) = path.last_mut() {
+        *last = format!("macro.{}.html", last);
+    }
+
+    let url = match cache.extern_locations[&def_id.krate] {
+        ExternalLocation::Remote(ref s) => {
+            // `ExternalLocation::Remote` always end with a `/`.
+            format!("{}{}", s, path.join("/"))
+        }
+        ExternalLocation::Local => {
+            // `root_path` always end with a `/`.
+            format!("{}{}/{}", root_path.unwrap_or(""), crate_name, path.join("/"))
+        }
+        ExternalLocation::Unknown => {
+            debug!("crate {} not in cache when linkifying macros", crate_name);
+            return Err(HrefError::NotInExternalCache);
+        }
+    };
+    Ok((url, ItemType::Macro, fqp))
+}
+
 pub(crate) fn href_with_root_path(
     did: DefId,
     cx: &Context<'_>,
@@ -611,6 +687,8 @@ pub(crate) fn href_with_root_path(
                         ExternalLocation::Unknown => return Err(HrefError::DocumentationNotBuilt),
                     },
                 )
+            } else if matches!(def_kind, DefKind::Macro(_)) {
+                return generate_macro_def_id_path(did, cx, root_path);
             } else {
                 return Err(HrefError::NotInExternalCache);
             }
diff --git a/src/librustdoc/html/highlight.rs b/src/librustdoc/html/highlight.rs
index 480728b1797..d2ef89078bf 100644
--- a/src/librustdoc/html/highlight.rs
+++ b/src/librustdoc/html/highlight.rs
@@ -22,7 +22,7 @@ use super::format::{self, Buffer};
 use super::render::LinkFromSrc;
 
 /// This type is needed in case we want to render links on items to allow to go to their definition.
-pub(crate) struct ContextInfo<'a, 'b, 'c> {
+pub(crate) struct HrefContext<'a, 'b, 'c> {
     pub(crate) context: &'a Context<'b>,
     /// This span contains the current file we're going through.
     pub(crate) file_span: Span,
@@ -44,7 +44,7 @@ pub(crate) fn render_with_highlighting(
     tooltip: Option<(Option<Edition>, &str)>,
     edition: Edition,
     extra_content: Option<Buffer>,
-    context_info: Option<ContextInfo<'_, '_, '_>>,
+    href_context: Option<HrefContext<'_, '_, '_>>,
     decoration_info: Option<DecorationInfo>,
 ) {
     debug!("highlighting: ================\n{}\n==============", src);
@@ -62,7 +62,7 @@ pub(crate) fn render_with_highlighting(
     }
 
     write_header(out, class, extra_content);
-    write_code(out, src, edition, context_info, decoration_info);
+    write_code(out, src, edition, href_context, decoration_info);
     write_footer(out, playground_button);
 }
 
@@ -85,8 +85,8 @@ fn write_header(out: &mut Buffer, class: Option<&str>, extra_content: Option<Buf
 ///
 /// Some explanations on the last arguments:
 ///
-/// In case we are rendering a code block and not a source code file, `context_info` will be `None`.
-/// To put it more simply: if `context_info` is `None`, the code won't try to generate links to an
+/// In case we are rendering a code block and not a source code file, `href_context` will be `None`.
+/// To put it more simply: if `href_context` is `None`, the code won't try to generate links to an
 /// item definition.
 ///
 /// More explanations about spans and how we use them here are provided in the
@@ -94,22 +94,27 @@ fn write_code(
     out: &mut Buffer,
     src: &str,
     edition: Edition,
-    context_info: Option<ContextInfo<'_, '_, '_>>,
+    href_context: Option<HrefContext<'_, '_, '_>>,
     decoration_info: Option<DecorationInfo>,
 ) {
     // This replace allows to fix how the code source with DOS backline characters is displayed.
     let src = src.replace("\r\n", "\n");
+    let mut closing_tags: Vec<&'static str> = Vec::new();
     Classifier::new(
         &src,
         edition,
-        context_info.as_ref().map(|c| c.file_span).unwrap_or(DUMMY_SP),
+        href_context.as_ref().map(|c| c.file_span).unwrap_or(DUMMY_SP),
         decoration_info,
     )
     .highlight(&mut |highlight| {
         match highlight {
-            Highlight::Token { text, class } => string(out, Escape(text), class, &context_info),
-            Highlight::EnterSpan { class } => enter_span(out, class),
-            Highlight::ExitSpan => exit_span(out),
+            Highlight::Token { text, class } => string(out, Escape(text), class, &href_context),
+            Highlight::EnterSpan { class } => {
+                closing_tags.push(enter_span(out, class, &href_context))
+            }
+            Highlight::ExitSpan => {
+                exit_span(out, closing_tags.pop().expect("ExitSpan without EnterSpan"))
+            }
         };
     });
 }
@@ -129,7 +134,7 @@ enum Class {
     RefKeyWord,
     Self_(Span),
     Op,
-    Macro,
+    Macro(Span),
     MacroNonTerminal,
     String,
     Number,
@@ -153,7 +158,7 @@ impl Class {
             Class::RefKeyWord => "kw-2",
             Class::Self_(_) => "self",
             Class::Op => "op",
-            Class::Macro => "macro",
+            Class::Macro(_) => "macro",
             Class::MacroNonTerminal => "macro-nonterminal",
             Class::String => "string",
             Class::Number => "number",
@@ -171,8 +176,22 @@ impl Class {
     /// a "span" (a tuple representing `(lo, hi)` equivalent of `Span`).
     fn get_span(self) -> Option<Span> {
         match self {
-            Self::Ident(sp) | Self::Self_(sp) => Some(sp),
-            _ => None,
+            Self::Ident(sp) | Self::Self_(sp) | Self::Macro(sp) => Some(sp),
+            Self::Comment
+            | Self::DocComment
+            | Self::Attribute
+            | Self::KeyWord
+            | Self::RefKeyWord
+            | Self::Op
+            | Self::MacroNonTerminal
+            | Self::String
+            | Self::Number
+            | Self::Bool
+            | Self::Lifetime
+            | Self::PreludeTy
+            | Self::PreludeVal
+            | Self::QuestionMark
+            | Self::Decoration(_) => None,
         }
     }
 }
@@ -611,7 +630,7 @@ impl<'a> Classifier<'a> {
             },
             TokenKind::Ident | TokenKind::RawIdent if lookahead == Some(TokenKind::Bang) => {
                 self.in_macro = true;
-                sink(Highlight::EnterSpan { class: Class::Macro });
+                sink(Highlight::EnterSpan { class: Class::Macro(self.new_span(before, text)) });
                 sink(Highlight::Token { text, class: None });
                 return;
             }
@@ -658,13 +677,20 @@ impl<'a> Classifier<'a> {
 
 /// Called when we start processing a span of text that should be highlighted.
 /// The `Class` argument specifies how it should be highlighted.
-fn enter_span(out: &mut Buffer, klass: Class) {
-    write!(out, "<span class=\"{}\">", klass.as_html());
+fn enter_span(
+    out: &mut Buffer,
+    klass: Class,
+    href_context: &Option<HrefContext<'_, '_, '_>>,
+) -> &'static str {
+    string_without_closing_tag(out, "", Some(klass), href_context).expect(
+        "internal error: enter_span was called with Some(klass) but did not return a \
+            closing HTML tag",
+    )
 }
 
 /// Called at the end of a span of highlighted text.
-fn exit_span(out: &mut Buffer) {
-    out.write_str("</span>");
+fn exit_span(out: &mut Buffer, closing_tag: &str) {
+    out.write_str(closing_tag);
 }
 
 /// Called for a span of text. If the text should be highlighted differently
@@ -687,15 +713,39 @@ fn string<T: Display>(
     out: &mut Buffer,
     text: T,
     klass: Option<Class>,
-    context_info: &Option<ContextInfo<'_, '_, '_>>,
+    href_context: &Option<HrefContext<'_, '_, '_>>,
 ) {
+    if let Some(closing_tag) = string_without_closing_tag(out, text, klass, href_context) {
+        out.write_str(closing_tag);
+    }
+}
+
+/// This function writes `text` into `out` with some modifications depending on `klass`:
+///
+/// * If `klass` is `None`, `text` is written into `out` with no modification.
+/// * If `klass` is `Some` but `klass.get_span()` is `None`, it writes the text wrapped in a
+///   `<span>` with the provided `klass`.
+/// * If `klass` is `Some` and has a [`rustc_span::Span`], it then tries to generate a link (`<a>`
+///   element) by retrieving the link information from the `span_correspondance_map` that was filled
+///   in `span_map.rs::collect_spans_and_sources`. If it cannot retrieve the information, then it's
+///   the same as the second point (`klass` is `Some` but doesn't have a [`rustc_span::Span`]).
+fn string_without_closing_tag<T: Display>(
+    out: &mut Buffer,
+    text: T,
+    klass: Option<Class>,
+    href_context: &Option<HrefContext<'_, '_, '_>>,
+) -> Option<&'static str> {
     let Some(klass) = klass
-    else { return write!(out, "{}", text) };
+    else {
+        write!(out, "{}", text);
+        return None;
+    };
     let Some(def_span) = klass.get_span()
     else {
-        write!(out, "<span class=\"{}\">{}</span>", klass.as_html(), text);
-        return;
+        write!(out, "<span class=\"{}\">{}", klass.as_html(), text);
+        return Some("</span>");
     };
+
     let mut text_s = text.to_string();
     if text_s.contains("::") {
         text_s = text_s.split("::").intersperse("::").fold(String::new(), |mut path, t| {
@@ -715,10 +765,10 @@ fn string<T: Display>(
             path
         });
     }
-    if let Some(context_info) = context_info {
+    if let Some(href_context) = href_context {
         if let Some(href) =
-            context_info.context.shared.span_correspondance_map.get(&def_span).and_then(|href| {
-                let context = context_info.context;
+            href_context.context.shared.span_correspondance_map.get(&def_span).and_then(|href| {
+                let context = href_context.context;
                 // FIXME: later on, it'd be nice to provide two links (if possible) for all items:
                 // one to the documentation page and one to the source definition.
                 // FIXME: currently, external items only generate a link to their documentation,
@@ -727,27 +777,28 @@ fn string<T: Display>(
                 match href {
                     LinkFromSrc::Local(span) => context
                         .href_from_span(*span, true)
-                        .map(|s| format!("{}{}", context_info.root_path, s)),
+                        .map(|s| format!("{}{}", href_context.root_path, s)),
                     LinkFromSrc::External(def_id) => {
-                        format::href_with_root_path(*def_id, context, Some(context_info.root_path))
+                        format::href_with_root_path(*def_id, context, Some(href_context.root_path))
                             .ok()
                             .map(|(url, _, _)| url)
                     }
                     LinkFromSrc::Primitive(prim) => format::href_with_root_path(
                         PrimitiveType::primitive_locations(context.tcx())[prim],
                         context,
-                        Some(context_info.root_path),
+                        Some(href_context.root_path),
                     )
                     .ok()
                     .map(|(url, _, _)| url),
                 }
             })
         {
-            write!(out, "<a class=\"{}\" href=\"{}\">{}</a>", klass.as_html(), href, text_s);
-            return;
+            write!(out, "<a class=\"{}\" href=\"{}\">{}", klass.as_html(), href, text_s);
+            return Some("</a>");
         }
     }
-    write!(out, "<span class=\"{}\">{}</span>", klass.as_html(), text_s);
+    write!(out, "<span class=\"{}\">{}", klass.as_html(), text_s);
+    Some("</span>")
 }
 
 #[cfg(test)]
diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs
index de54347a0f7..7d6d4b71e2e 100644
--- a/src/librustdoc/html/layout.rs
+++ b/src/librustdoc/html/layout.rs
@@ -31,8 +31,6 @@ pub(crate) struct Page<'a> {
     pub(crate) description: &'a str,
     pub(crate) keywords: &'a str,
     pub(crate) resource_suffix: &'a str,
-    pub(crate) extra_scripts: &'a [&'a str],
-    pub(crate) static_extra_scripts: &'a [&'a str],
 }
 
 impl<'a> Page<'a> {
diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs
index 68e2f0cf9c0..bfdc44c7e45 100644
--- a/src/librustdoc/html/render/context.rs
+++ b/src/librustdoc/html/render/context.rs
@@ -211,8 +211,6 @@ impl<'tcx> Context<'tcx> {
                 description: &desc,
                 keywords: &keywords,
                 resource_suffix: &clone_shared.resource_suffix,
-                extra_scripts: &[],
-                static_extra_scripts: &[],
             };
             let mut page_buffer = Buffer::html();
             print_item(self, it, &mut page_buffer, &page);
@@ -568,8 +566,6 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
             description: "List of all items in this crate",
             keywords: BASIC_KEYWORDS,
             resource_suffix: &shared.resource_suffix,
-            extra_scripts: &[],
-            static_extra_scripts: &[],
         };
         let sidebar = if shared.cache.crate_version.is_some() {
             format!("<h2 class=\"location\">Crate {}</h2>", crate_name)
@@ -693,7 +689,7 @@ impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> {
             else { unreachable!() };
             let items = self.build_sidebar_items(module);
             let js_dst = self.dst.join(&format!("sidebar-items{}.js", self.shared.resource_suffix));
-            let v = format!("initSidebarItems({});", serde_json::to_string(&items).unwrap());
+            let v = format!("window.SIDEBAR_ITEMS = {};", serde_json::to_string(&items).unwrap());
             self.shared.fs.write(js_dst, v)?;
         }
         Ok(())
diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs
index cb887d16906..3f426ee93e7 100644
--- a/src/librustdoc/html/render/mod.rs
+++ b/src/librustdoc/html/render/mod.rs
@@ -56,7 +56,7 @@ use rustc_middle::middle::stability;
 use rustc_middle::ty;
 use rustc_middle::ty::TyCtxt;
 use rustc_span::{
-    symbol::{kw, sym, Symbol},
+    symbol::{sym, Symbol},
     BytePos, FileName, RealFileName,
 };
 use serde::ser::SerializeSeq;
@@ -1738,8 +1738,6 @@ pub(crate) fn render_impl_summary(
 }
 
 fn print_sidebar(cx: &Context<'_>, it: &clean::Item, buffer: &mut Buffer) {
-    let parentlen = cx.current.len() - if it.is_mod() { 1 } else { 0 };
-
     if it.is_struct()
         || it.is_trait()
         || it.is_primitive()
@@ -1800,21 +1798,6 @@ fn print_sidebar(cx: &Context<'_>, it: &clean::Item, buffer: &mut Buffer) {
         write!(buffer, "<h2 class=\"location\"><a href=\"index.html\">In {}</a></h2>", path);
     }
 
-    // Sidebar refers to the enclosing module, not this module.
-    let relpath = if it.is_mod() && parentlen != 0 { "./" } else { "" };
-    write!(
-        buffer,
-        "<div id=\"sidebar-vars\" data-name=\"{name}\" data-ty=\"{ty}\" data-relpath=\"{path}\">\
-        </div>",
-        name = it.name.unwrap_or(kw::Empty),
-        ty = it.type_(),
-        path = relpath
-    );
-    write!(
-        buffer,
-        "<script defer src=\"{}sidebar-items{}.js\"></script>",
-        relpath, cx.shared.resource_suffix
-    );
     // Closes sidebar-elems div.
     buffer.write_str("</div>");
 }
diff --git a/src/librustdoc/html/render/span_map.rs b/src/librustdoc/html/render/span_map.rs
index 86961dc3bf1..34d590fb244 100644
--- a/src/librustdoc/html/render/span_map.rs
+++ b/src/librustdoc/html/render/span_map.rs
@@ -8,7 +8,8 @@ use rustc_hir::intravisit::{self, Visitor};
 use rustc_hir::{ExprKind, HirId, Mod, Node};
 use rustc_middle::hir::nested_filter;
 use rustc_middle::ty::TyCtxt;
-use rustc_span::Span;
+use rustc_span::hygiene::MacroKind;
+use rustc_span::{BytePos, ExpnKind, Span};
 
 use std::path::{Path, PathBuf};
 
@@ -63,33 +64,72 @@ struct SpanMapVisitor<'tcx> {
 
 impl<'tcx> SpanMapVisitor<'tcx> {
     /// This function is where we handle `hir::Path` elements and add them into the "span map".
-    fn handle_path(&mut self, path: &rustc_hir::Path<'_>, path_span: Option<Span>) {
+    fn handle_path(&mut self, path: &rustc_hir::Path<'_>) {
         let info = match path.res {
-            // FIXME: For now, we only handle `DefKind` if it's not `DefKind::TyParam` or
-            // `DefKind::Macro`. Would be nice to support them too alongside the other `DefKind`
+            // FIXME: For now, we handle `DefKind` if it's not a `DefKind::TyParam`.
+            // Would be nice to support them too alongside the other `DefKind`
             // (such as primitive types!).
-            Res::Def(kind, def_id) if kind != DefKind::TyParam => {
-                if matches!(kind, DefKind::Macro(_)) {
-                    return;
-                }
-                Some(def_id)
-            }
+            Res::Def(kind, def_id) if kind != DefKind::TyParam => Some(def_id),
             Res::Local(_) => None,
             Res::PrimTy(p) => {
                 // FIXME: Doesn't handle "path-like" primitives like arrays or tuples.
-                let span = path_span.unwrap_or(path.span);
-                self.matches.insert(span, LinkFromSrc::Primitive(PrimitiveType::from(p)));
+                self.matches.insert(path.span, LinkFromSrc::Primitive(PrimitiveType::from(p)));
                 return;
             }
             Res::Err => return,
             _ => return,
         };
         if let Some(span) = self.tcx.hir().res_span(path.res) {
-            self.matches
-                .insert(path_span.unwrap_or(path.span), LinkFromSrc::Local(clean::Span::new(span)));
+            self.matches.insert(path.span, LinkFromSrc::Local(clean::Span::new(span)));
         } else if let Some(def_id) = info {
-            self.matches.insert(path_span.unwrap_or(path.span), LinkFromSrc::External(def_id));
+            self.matches.insert(path.span, LinkFromSrc::External(def_id));
+        }
+    }
+
+    /// Adds the macro call into the span map. Returns `true` if the `span` was inside a macro
+    /// expansion, whether or not it was added to the span map.
+    ///
+    /// The idea for the macro support is to check if the current `Span` comes from expansion. If
+    /// so, we loop until we find the macro definition by using `outer_expn_data` in a loop.
+    /// Finally, we get the information about the macro itself (`span` if "local", `DefId`
+    /// otherwise) and store it inside the span map.
+    fn handle_macro(&mut self, span: Span) -> bool {
+        if !span.from_expansion() {
+            return false;
+        }
+        // So if the `span` comes from a macro expansion, we need to get the original
+        // macro's `DefId`.
+        let mut data = span.ctxt().outer_expn_data();
+        let mut call_site = data.call_site;
+        // Macros can expand to code containing macros, which will in turn be expanded, etc.
+        // So the idea here is to "go up" until we're back to code that was generated from
+        // macro expansion so that we can get the `DefId` of the original macro that was at the
+        // origin of this expansion.
+        while call_site.from_expansion() {
+            data = call_site.ctxt().outer_expn_data();
+            call_site = data.call_site;
         }
+
+        let macro_name = match data.kind {
+            ExpnKind::Macro(MacroKind::Bang, macro_name) => macro_name,
+            // Even though we don't handle this kind of macro, this `data` still comes from
+            // expansion so we return `true` so we don't go any deeper in this code.
+            _ => return true,
+        };
+        let link_from_src = match data.macro_def_id {
+            Some(macro_def_id) if macro_def_id.is_local() => {
+                LinkFromSrc::Local(clean::Span::new(data.def_site))
+            }
+            Some(macro_def_id) => LinkFromSrc::External(macro_def_id),
+            None => return true,
+        };
+        let new_span = data.call_site;
+        let macro_name = macro_name.as_str();
+        // The "call_site" includes the whole macro with its "arguments". We only want
+        // the macro name.
+        let new_span = new_span.with_hi(new_span.lo() + BytePos(macro_name.len() as u32));
+        self.matches.insert(new_span, link_from_src);
+        true
     }
 }
 
@@ -101,7 +141,10 @@ impl<'tcx> Visitor<'tcx> for SpanMapVisitor<'tcx> {
     }
 
     fn visit_path(&mut self, path: &'tcx rustc_hir::Path<'tcx>, _id: HirId) {
-        self.handle_path(path, None);
+        if self.handle_macro(path.span) {
+            return;
+        }
+        self.handle_path(path);
         intravisit::walk_path(self, path);
     }
 
@@ -143,12 +186,18 @@ impl<'tcx> Visitor<'tcx> for SpanMapVisitor<'tcx> {
                     );
                 }
             }
+        } else if self.handle_macro(expr.span) {
+            // We don't want to go deeper into the macro.
+            return;
         }
         intravisit::walk_expr(self, expr);
     }
 
     fn visit_use(&mut self, path: &'tcx rustc_hir::Path<'tcx>, id: HirId) {
-        self.handle_path(path, None);
+        if self.handle_macro(path.span) {
+            return;
+        }
+        self.handle_path(path);
         intravisit::walk_use(self, path, id);
     }
 }
diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs
index 9bddee199c7..27ad91d09e0 100644
--- a/src/librustdoc/html/render/write_shared.rs
+++ b/src/librustdoc/html/render/write_shared.rs
@@ -475,8 +475,6 @@ if (typeof exports !== 'undefined') {exports.searchIndex = searchIndex};
                 description: "List of crates",
                 keywords: BASIC_KEYWORDS,
                 resource_suffix: &shared.resource_suffix,
-                extra_scripts: &[],
-                static_extra_scripts: &[],
             };
 
             let content = format!(
diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs
index 524c90e1f4d..d0fd637ba88 100644
--- a/src/librustdoc/html/sources.rs
+++ b/src/librustdoc/html/sources.rs
@@ -203,8 +203,6 @@ impl SourceCollector<'_, '_> {
             description: &desc,
             keywords: BASIC_KEYWORDS,
             resource_suffix: &shared.resource_suffix,
-            extra_scripts: &[&format!("source-files{}", shared.resource_suffix)],
-            static_extra_scripts: &[&format!("source-script{}", shared.resource_suffix)],
         };
         let v = layout::render(
             &shared.layout,
@@ -299,7 +297,7 @@ pub(crate) fn print_src(
         None,
         edition,
         Some(line_numbers),
-        Some(highlight::ContextInfo { context, file_span, root_path }),
+        Some(highlight::HrefContext { context, file_span, root_path }),
         decoration_info,
     );
 }
diff --git a/src/librustdoc/html/static/css/rustdoc.css b/src/librustdoc/html/static/css/rustdoc.css
index d0229bdb5f2..5d0756d30fb 100644
--- a/src/librustdoc/html/static/css/rustdoc.css
+++ b/src/librustdoc/html/static/css/rustdoc.css
@@ -387,16 +387,20 @@ nav.sub {
 	overflow-y: hidden;
 }
 
+.rustdoc.source .sidebar .sidebar-logo {
+	display: none;
+}
+
 .source .sidebar > *:not(#sidebar-toggle) {
 	opacity: 0;
 	visibility: hidden;
 }
 
-.source .sidebar.expanded {
+.source-sidebar-expanded .source .sidebar {
 	overflow-y: auto;
 }
 
-.source .sidebar.expanded > *:not(#sidebar-toggle) {
+.source-sidebar-expanded .source .sidebar > *:not(#sidebar-toggle) {
 	opacity: 1;
 	visibility: visible;
 }
@@ -979,42 +983,51 @@ table,
 	font-weight: normal;
 }
 
-body.blur > :not(#help) {
-	filter: blur(8px);
-	-webkit-filter: blur(8px);
-	opacity: .7;
+.popover {
+	font-size: 1rem;
+	position: absolute;
+	right: 0;
+	z-index: 2;
+	display: block;
+	margin-top: 7px;
+	border-radius: 3px;
+	border: 1px solid;
+	font-size: 1rem;
 }
 
-#help {
-	width: 100%;
-	height: 100vh;
-	position: fixed;
-	top: 0;
-	left: 0;
-	display: flex;
-	justify-content: center;
-	align-items: center;
+/* This rule is to draw the little arrow connecting the settings menu to the gear icon. */
+.popover::before {
+	content: '';
+	position: absolute;
+	right: 11px;
+	border: solid;
+	border-width: 1px 1px 0 0;
+	display: inline-block;
+	padding: 4px;
+	transform: rotate(-45deg);
+	top: -5px;
 }
-#help > div {
-	flex: 0 0 auto;
-	box-shadow: 0 0 6px rgba(0,0,0,.2);
-	width: 550px;
-	height: auto;
-	border: 1px solid;
+
+#help-button .popover {
+	max-width: 600px;
 }
-#help dt {
+
+#help-button .popover::before {
+	right: 48px;
+}
+
+#help-button dt {
 	float: left;
 	clear: left;
 	display: block;
 	margin-right: 0.5rem;
 }
-#help span.top, #help span.bottom {
+#help-button span.top, #help-button span.bottom {
 	text-align: center;
 	display: block;
 	font-size: 1.125rem;
-
 }
-#help span.top {
+#help-button span.top {
 	text-align: center;
 	display: block;
 	margin: 10px 0;
@@ -1022,17 +1035,17 @@ body.blur > :not(#help) {
 	padding-bottom: 4px;
 	margin-bottom: 6px;
 }
-#help span.bottom {
+#help-button span.bottom {
 	clear: both;
 	border-top: 1px solid;
 }
-#help dd { margin: 5px 35px; }
-#help .infos { padding-left: 0; }
-#help h1, #help h2 { margin-top: 0; }
-#help > div div {
+.side-by-side {
+	text-align: initial;
+}
+.side-by-side > div {
 	width: 50%;
 	float: left;
-	padding: 0 20px 20px 17px;;
+	padding: 0 20px 20px 17px;
 }
 
 .item-info .stab {
@@ -1387,7 +1400,7 @@ pre.rust {
 #copy-path {
 	height: 34px;
 }
-#settings-menu > a, #help-button, #copy-path {
+#settings-menu > a, #help-button > button, #copy-path {
 	padding: 5px;
 	width: 33px;
 	border: 1px solid;
@@ -1397,9 +1410,8 @@ pre.rust {
 #settings-menu {
 	padding: 0;
 }
-#settings-menu > a {
+#settings-menu > a, #help-button > button {
 	padding: 5px;
-	width: 100%;
 	height: 100%;
 	display: block;
 }
@@ -1416,7 +1428,7 @@ pre.rust {
 	animation: rotating 2s linear infinite;
 }
 
-#help-button {
+#help-button > button {
 	font-family: "Fira Sans", Arial, sans-serif;
 	text-align: center;
 	/* Rare exception to specifying font sizes in rem. Since this is acting
@@ -1682,11 +1694,11 @@ details.rustdoc-toggle[open] > summary.hideme::after {
 
 	/* When we expand the sidebar on the source code page, we hide the logo on the left of the
 	search bar to have more space. */
-	.sidebar.expanded + main .width-limiter .sub-logo-container.rust-logo {
+	.source-sidebar-expanded .source .sidebar + main .width-limiter .sub-logo-container.rust-logo {
 		display: none;
 	}
 
-	.source .sidebar.expanded {
+	.source-sidebar-expanded .source .sidebar {
 		width: 300px;
 	}
 }
@@ -1766,7 +1778,7 @@ details.rustdoc-toggle[open] > summary.hideme::after {
 	}
 
 	.sidebar.shown,
-	.sidebar.expanded,
+	.source-sidebar-expanded .source .sidebar,
 	.sidebar:focus-within {
 		left: 0;
 	}
@@ -1889,11 +1901,7 @@ details.rustdoc-toggle[open] > summary.hideme::after {
 		left: -11px;
 	}
 
-	.sidebar.expanded #sidebar-toggle {
-		font-size: 1.5rem;
-	}
-
-	.sidebar:not(.expanded) #sidebar-toggle {
+	#sidebar-toggle {
 		position: fixed;
 		left: 1px;
 		top: 100px;
@@ -1910,6 +1918,14 @@ details.rustdoc-toggle[open] > summary.hideme::after {
 		border-left: 0;
 	}
 
+	.source-sidebar-expanded #sidebar-toggle {
+		left: unset;
+		top: unset;
+		width: unset;
+		border-top-right-radius: unset;
+		border-bottom-right-radius: unset;
+	}
+
 	#source-sidebar {
 		z-index: 11;
 	}
@@ -1952,7 +1968,7 @@ details.rustdoc-toggle[open] > summary.hideme::after {
 		padding-left: 2em;
 	}
 
-	.source .sidebar.expanded {
+	.source-sidebar-expanded .source .sidebar {
 		max-width: 100vw;
 		width: 100vw;
 	}
@@ -2010,9 +2026,12 @@ details.rustdoc-toggle[open] > summary.hideme::after {
 		width: 35px;
 	}
 
-	.sidebar:not(.expanded) #sidebar-toggle {
+	#sidebar-toggle {
 		top: 10px;
 	}
+	.source-sidebar-expanded #sidebar-toggle {
+		top: unset;
+	}
 }
 
 .method-toggle summary,
diff --git a/src/librustdoc/html/static/css/settings.css b/src/librustdoc/html/static/css/settings.css
index 1cd8e39e036..e531e6ce6bb 100644
--- a/src/librustdoc/html/static/css/settings.css
+++ b/src/librustdoc/html/static/css/settings.css
@@ -86,27 +86,6 @@ input:checked + .slider:before {
 	display: block;
 }
 
-div#settings {
-	position: absolute;
-	right: 0;
-	z-index: 1;
-	display: block;
-	margin-top: 7px;
-	border-radius: 3px;
-	border: 1px solid;
-}
 #settings .setting-line {
 	margin: 1.2em 0.6em;
 }
-/* This rule is to draw the little arrow connecting the settings menu to the gear icon. */
-div#settings::before {
-	content: '';
-	position: absolute;
-	right: 11px;
-	border: solid;
-	border-width: 1px 1px 0 0;
-	display: inline-block;
-	padding: 4px;
-	transform: rotate(-45deg);
-	top: -5px;
-}
diff --git a/src/librustdoc/html/static/css/themes/ayu.css b/src/librustdoc/html/static/css/themes/ayu.css
index 8e0521d9ad6..b7d0db1f002 100644
--- a/src/librustdoc/html/static/css/themes/ayu.css
+++ b/src/librustdoc/html/static/css/themes/ayu.css
@@ -5,7 +5,7 @@ Original by Dempfi (https://github.com/dempfi/ayu)
 
 /* General structure and fonts */
 
-body, #settings-menu #settings, #settings-menu #settings::before {
+body, .popover, .popover::before {
 	background-color: #0f1419;
 	color: #c5c5c5;
 }
@@ -567,7 +567,7 @@ kbd {
 	box-shadow: inset 0 -1px 0 #5c6773;
 }
 
-#settings-menu > a, #help-button {
+#settings-menu > a, #help-button > button {
 	border-color: #5c6773;
 	background-color: #0f1419;
 	color: #fff;
@@ -577,7 +577,8 @@ kbd {
 	filter: invert(100);
 }
 
-#settings-menu #settings, #settings-menu #settings::before {
+.popover, .popover::before,
+#help-button span.top, #help-button span.bottom {
 	border-color: #5c6773;
 }
 
@@ -592,7 +593,7 @@ kbd {
 }
 
 #settings-menu > a:hover, #settings-menu > a:focus,
-#help-button:hover, #help-button:focus {
+#help-button > button:hover, #help-button > button:focus {
 	border-color: #e0e0e0;
 }
 
@@ -629,11 +630,11 @@ kbd {
 	color: #fff;
 	border-bottom-color: #5c6773;
 }
-div.files > a:hover, div.name:hover {
+#source-sidebar div.files > a:hover, div.name:hover {
 	background-color: #14191f;
 	color: #ffb44c;
 }
-div.files > .selected {
+#source-sidebar div.files > .selected {
 	background-color: #14191f;
 	color: #ffb44c;
 }
diff --git a/src/librustdoc/html/static/css/themes/dark.css b/src/librustdoc/html/static/css/themes/dark.css
index 071ad006ed3..eb64ef3e771 100644
--- a/src/librustdoc/html/static/css/themes/dark.css
+++ b/src/librustdoc/html/static/css/themes/dark.css
@@ -1,4 +1,4 @@
-body, #settings-menu #settings, #settings-menu #settings::before {
+body, .popover, .popover::before {
 	background-color: #353535;
 	color: #ddd;
 }
@@ -442,18 +442,19 @@ kbd {
 	box-shadow: inset 0 -1px 0 #c6cbd1;
 }
 
-#settings-menu > a, #help-button {
+#settings-menu > a, #help-button > button {
 	border-color: #e0e0e0;
 	background: #f0f0f0;
 	color: #000;
 }
 
 #settings-menu > a:hover, #settings-menu > a:focus,
-#help-button:hover, #help-button:focus {
+#help-button > button:hover, #help-button > button:focus {
 	border-color: #ffb900;
 }
 
-#settings-menu #settings, #settings-menu #settings::before {
+.popover, .popover::before,
+#help-button span.top, #help-button span.bottom {
 	border-color: #d2d2d2;
 }
 
@@ -499,10 +500,10 @@ kbd {
 #source-sidebar > .title {
 	border-bottom-color: #ccc;
 }
-div.files > a:hover, div.name:hover {
+#source-sidebar div.files > a:hover, div.name:hover {
 	background-color: #444;
 }
-div.files > .selected {
+#source-sidebar div.files > .selected {
 	background-color: #333;
 }
 
diff --git a/src/librustdoc/html/static/css/themes/light.css b/src/librustdoc/html/static/css/themes/light.css
index 5c3789bf463..00cdf835897 100644
--- a/src/librustdoc/html/static/css/themes/light.css
+++ b/src/librustdoc/html/static/css/themes/light.css
@@ -1,6 +1,6 @@
 /* General structure and fonts */
 
-body, #settings-menu #settings, #settings-menu #settings::before {
+body, .popover, .popover::before {
 	background-color: white;
 	color: black;
 }
@@ -427,17 +427,18 @@ kbd {
 	box-shadow: inset 0 -1px 0 #c6cbd1;
 }
 
-#settings-menu > a, #help-button {
+#settings-menu > a, #help-button > button {
 	border-color: #e0e0e0;
 	background-color: #fff;
 }
 
 #settings-menu > a:hover, #settings-menu > a:focus,
-#help-button:hover, #help-button:focus {
+#help-button > button:hover, #help-button > button:focus {
 	border-color: #717171;
 }
 
-#settings-menu #settings, #settings-menu #settings::before {
+.popover, .popover::before,
+#help-button span.top, #help-button span.bottom {
 	border-color: #DDDDDD;
 }
 
@@ -483,10 +484,10 @@ kbd {
 #source-sidebar > .title {
 	border-bottom-color: #ccc;
 }
-div.files > a:hover, div.name:hover {
+#source-sidebar div.files > a:hover, div.name:hover {
 	background-color: #E0E0E0;
 }
-div.files > .selected {
+#source-sidebar div.files > .selected {
 	background-color: #fff;
 }
 
diff --git a/src/librustdoc/html/static/js/main.js b/src/librustdoc/html/static/js/main.js
index 414bca850e3..70dbfd44425 100644
--- a/src/librustdoc/html/static/js/main.js
+++ b/src/librustdoc/html/static/js/main.js
@@ -63,29 +63,39 @@ function showMain() {
     removeClass(document.getElementById(MAIN_ID), "hidden");
 }
 
+function elemIsInParent(elem, parent) {
+    while (elem && elem !== document.body) {
+        if (elem === parent) {
+            return true;
+        }
+        elem = elem.parentElement;
+    }
+    return false;
+}
+
+function blurHandler(event, parentElem, hideCallback) {
+    if (!elemIsInParent(document.activeElement, parentElem) &&
+        !elemIsInParent(event.relatedTarget, parentElem)
+    ) {
+        hideCallback();
+    }
+}
+
 (function() {
     window.rootPath = getVar("root-path");
     window.currentCrate = getVar("current-crate");
-    window.searchJS =  resourcePath("search", ".js");
-    window.searchIndexJS = resourcePath("search-index", ".js");
-    window.settingsJS = resourcePath("settings", ".js");
-    const sidebarVars = document.getElementById("sidebar-vars");
-    if (sidebarVars) {
-        window.sidebarCurrent = {
-            name: sidebarVars.attributes["data-name"].value,
-            ty: sidebarVars.attributes["data-ty"].value,
-            relpath: sidebarVars.attributes["data-relpath"].value,
-        };
-        // FIXME: It would be nicer to generate this text content directly in HTML,
-        // but with the current code it's hard to get the right information in the right place.
-        const mobileLocationTitle = document.querySelector(".mobile-topbar h2.location");
-        const locationTitle = document.querySelector(".sidebar h2.location");
-        if (mobileLocationTitle && locationTitle) {
-            mobileLocationTitle.innerHTML = locationTitle.innerHTML;
-        }
-    }
 }());
 
+function setMobileTopbar() {
+    // FIXME: It would be nicer to generate this text content directly in HTML,
+    // but with the current code it's hard to get the right information in the right place.
+    const mobileLocationTitle = document.querySelector(".mobile-topbar h2.location");
+    const locationTitle = document.querySelector(".sidebar h2.location");
+    if (mobileLocationTitle && locationTitle) {
+        mobileLocationTitle.innerHTML = locationTitle.innerHTML;
+    }
+}
+
 // Gets the human-readable string for the virtual-key code of the
 // given KeyboardEvent, ev.
 //
@@ -112,20 +122,21 @@ const MAIN_ID = "main-content";
 const SETTINGS_BUTTON_ID = "settings-menu";
 const ALTERNATIVE_DISPLAY_ID = "alternative-display";
 const NOT_DISPLAYED_ID = "not-displayed";
+const HELP_BUTTON_ID = "help-button";
 
 function getSettingsButton() {
     return document.getElementById(SETTINGS_BUTTON_ID);
 }
 
+function getHelpButton() {
+    return document.getElementById(HELP_BUTTON_ID);
+}
+
 // Returns the current URL without any query parameter or hash.
 function getNakedUrl() {
     return window.location.href.split("?")[0].split("#")[0];
 }
 
-window.hideSettings = () => {
-    // Does nothing by default.
-};
-
 /**
  * This function inserts `newNode` after `referenceNode`. It doesn't work if `referenceNode`
  * doesn't have a parent node.
@@ -227,7 +238,7 @@ function loadCss(cssFileName) {
         // Sending request for the CSS and the JS files at the same time so it will
         // hopefully be loaded when the JS will generate the settings content.
         loadCss("settings");
-        loadScript(window.settingsJS);
+        loadScript(resourcePath("settings", ".js"));
     };
 
     window.searchState = {
@@ -304,8 +315,8 @@ function loadCss(cssFileName) {
             function loadSearch() {
                 if (!searchLoaded) {
                     searchLoaded = true;
-                    loadScript(window.searchJS);
-                    loadScript(window.searchIndexJS);
+                    loadScript(resourcePath("search", ".js"));
+                    loadScript(resourcePath("search-index", ".js"));
                 }
             }
 
@@ -389,55 +400,16 @@ function loadCss(cssFileName) {
         openParentDetails(document.getElementById(id));
     }
 
-    function getHelpElement(build) {
-        if (build) {
-            buildHelperPopup();
-        }
-        return document.getElementById("help");
-    }
-
-    /**
-     * Show the help popup.
-     *
-     * @param {boolean} display    - Whether to show or hide the popup
-     * @param {Event}   ev         - The event that triggered this call
-     * @param {Element} [help]     - The help element if it already exists
-     */
-    function displayHelp(display, ev, help) {
-        if (display) {
-            help = help ? help : getHelpElement(true);
-            if (hasClass(help, "hidden")) {
-                ev.preventDefault();
-                removeClass(help, "hidden");
-                addClass(document.body, "blur");
-            }
-        } else {
-            // No need to build the help popup if we want to hide it in case it hasn't been
-            // built yet...
-            help = help ? help : getHelpElement(false);
-            if (help && !hasClass(help, "hidden")) {
-                ev.preventDefault();
-                addClass(help, "hidden");
-                removeClass(document.body, "blur");
-            }
-        }
-    }
-
     function handleEscape(ev) {
         searchState.clearInputTimeout();
-        const help = getHelpElement(false);
-        if (help && !hasClass(help, "hidden")) {
-            displayHelp(false, ev, help);
-        } else {
-            switchDisplayedElement(null);
-            if (browserSupportsHistoryApi()) {
-                history.replaceState(null, window.currentCrate + " - Rust",
-                    getNakedUrl() + window.location.hash);
-            }
-            ev.preventDefault();
+        switchDisplayedElement(null);
+        if (browserSupportsHistoryApi()) {
+            history.replaceState(null, window.currentCrate + " - Rust",
+                getNakedUrl() + window.location.hash);
         }
+        ev.preventDefault();
         searchState.defocus();
-        window.hideSettings();
+        window.hidePopoverMenus();
     }
 
     const disableShortcuts = getSettingValue("disable-shortcuts") === "true";
@@ -461,7 +433,6 @@ function loadCss(cssFileName) {
 
             case "s":
             case "S":
-                displayHelp(false, ev);
                 ev.preventDefault();
                 searchState.focus();
                 break;
@@ -473,7 +444,7 @@ function loadCss(cssFileName) {
                 break;
 
             case "?":
-                displayHelp(true, ev);
+                showHelp();
                 break;
 
             default:
@@ -485,40 +456,11 @@ function loadCss(cssFileName) {
     document.addEventListener("keypress", handleShortcut);
     document.addEventListener("keydown", handleShortcut);
 
-    // delayed sidebar rendering.
-    window.initSidebarItems = items => {
-        const sidebar = document.getElementsByClassName("sidebar-elems")[0];
-        let others;
-        const current = window.sidebarCurrent;
-
-        function addSidebarCrates(crates) {
-            if (!hasClass(document.body, "crate")) {
-                // We only want to list crates on the crate page.
-                return;
-            }
-            // Draw a convenient sidebar of known crates if we have a listing
-            const div = document.createElement("div");
-            div.className = "block crate";
-            div.innerHTML = "<h3>Crates</h3>";
-            const ul = document.createElement("ul");
-            div.appendChild(ul);
-
-            for (const crate of crates) {
-                let klass = "crate";
-                if (window.rootPath !== "./" && crate === window.currentCrate) {
-                    klass += " current";
-                }
-                const link = document.createElement("a");
-                link.href = window.rootPath + crate + "/index.html";
-                link.className = klass;
-                link.textContent = crate;
-
-                const li = document.createElement("li");
-                li.appendChild(link);
-                ul.appendChild(li);
-            }
-            others.appendChild(div);
+    function addSidebarItems() {
+        if (!window.SIDEBAR_ITEMS) {
+            return;
         }
+        const sidebar = document.getElementsByClassName("sidebar-elems")[0];
 
         /**
          * Append to the sidebar a "block" of links - a heading along with a list (`<ul>`) of items.
@@ -529,7 +471,7 @@ function loadCss(cssFileName) {
          *                          "Modules", or "Macros".
          */
         function block(shortty, id, longty) {
-            const filtered = items[shortty];
+            const filtered = window.SIDEBAR_ITEMS[shortty];
             if (!filtered) {
                 return;
             }
@@ -546,17 +488,18 @@ function loadCss(cssFileName) {
                 const desc = item[1]; // can be null
 
                 let klass = shortty;
-                if (name === current.name && shortty === current.ty) {
-                    klass += " current";
-                }
                 let path;
                 if (shortty === "mod") {
                     path = name + "/index.html";
                 } else {
                     path = shortty + "." + name + ".html";
                 }
+                const current_page = document.location.href.split("/").pop();
+                if (path === current_page) {
+                    klass += " current";
+                }
                 const link = document.createElement("a");
-                link.href = current.relpath + path;
+                link.href = path;
                 link.title = desc;
                 link.className = klass;
                 link.textContent = name;
@@ -565,14 +508,10 @@ function loadCss(cssFileName) {
                 ul.appendChild(li);
             }
             div.appendChild(ul);
-            others.appendChild(div);
+            sidebar.appendChild(div);
         }
 
         if (sidebar) {
-            others = document.createElement("div");
-            others.className = "others";
-            sidebar.appendChild(others);
-
             const isModule = hasClass(document.body, "mod");
             if (!isModule) {
                 block("primitive", "primitives", "Primitive Types");
@@ -590,12 +529,8 @@ function loadCss(cssFileName) {
                 block("keyword", "keywords", "Keywords");
                 block("traitalias", "trait-aliases", "Trait Aliases");
             }
-
-            // `crates{version}.js` should always be loaded before this script, so we can use
-            // it safely.
-            addSidebarCrates(window.ALL_CRATES);
         }
-    };
+    }
 
     window.register_implementors = imp => {
         const implementors = document.getElementById("implementors-list");
@@ -680,6 +615,39 @@ function loadCss(cssFileName) {
         window.register_implementors(window.pending_implementors);
     }
 
+    function addSidebarCrates() {
+        if (!window.ALL_CRATES) {
+            return;
+        }
+        const sidebarElems = document.getElementsByClassName("sidebar-elems")[0];
+        if (!sidebarElems) {
+            return;
+        }
+        // Draw a convenient sidebar of known crates if we have a listing
+        const div = document.createElement("div");
+        div.className = "block crate";
+        div.innerHTML = "<h3>Crates</h3>";
+        const ul = document.createElement("ul");
+        div.appendChild(ul);
+
+        for (const crate of window.ALL_CRATES) {
+            let klass = "crate";
+            if (window.rootPath !== "./" && crate === window.currentCrate) {
+                klass += " current";
+            }
+            const link = document.createElement("a");
+            link.href = window.rootPath + crate + "/index.html";
+            link.className = klass;
+            link.textContent = crate;
+
+            const li = document.createElement("li");
+            li.appendChild(link);
+            ul.appendChild(li);
+        }
+        sidebarElems.appendChild(div);
+    }
+
+
     function labelForToggleButton(sectionIsCollapsed) {
         if (sectionIsCollapsed) {
             // button will expand the section
@@ -807,9 +775,6 @@ function loadCss(cssFileName) {
             elem.addEventListener("click", f);
         }
     }
-    handleClick("help-button", ev => {
-        displayHelp(true, ev);
-    });
     handleClick(MAIN_ID, () => {
         hideSidebar();
     });
@@ -853,24 +818,16 @@ function loadCss(cssFileName) {
         });
     }
 
-    let buildHelperPopup = () => {
-        const popup = document.createElement("aside");
-        addClass(popup, "hidden");
-        popup.id = "help";
-
-        popup.addEventListener("click", ev => {
-            if (ev.target === popup) {
-                // Clicked the blurred zone outside the help popup; dismiss help.
-                displayHelp(false, ev);
-            }
-        });
+    function helpBlurHandler(event) {
+        blurHandler(event, getHelpButton(), window.hidePopoverMenus);
+    }
 
+    function buildHelpMenu() {
         const book_info = document.createElement("span");
         book_info.className = "top";
         book_info.innerHTML = "You can find more information in \
             <a href=\"https://doc.rust-lang.org/rustdoc/\">the rustdoc book</a>.";
 
-        const container = document.createElement("div");
         const shortcuts = [
             ["?", "Show this help dialog"],
             ["S", "Focus the search field"],
@@ -906,24 +863,88 @@ function loadCss(cssFileName) {
         addClass(div_infos, "infos");
         div_infos.innerHTML = "<h2>Search Tricks</h2>" + infos;
 
-        container.appendChild(book_info);
-        container.appendChild(div_shortcuts);
-        container.appendChild(div_infos);
-
         const rustdoc_version = document.createElement("span");
         rustdoc_version.className = "bottom";
         const rustdoc_version_code = document.createElement("code");
         rustdoc_version_code.innerText = "rustdoc " + getVar("rustdoc-version");
         rustdoc_version.appendChild(rustdoc_version_code);
 
+        const container = document.createElement("div");
+        container.className = "popover";
+        container.style.display = "none";
+
+        const side_by_side = document.createElement("div");
+        side_by_side.className = "side-by-side";
+        side_by_side.appendChild(div_shortcuts);
+        side_by_side.appendChild(div_infos);
+
+        container.appendChild(book_info);
+        container.appendChild(side_by_side);
         container.appendChild(rustdoc_version);
 
-        popup.appendChild(container);
-        insertAfter(popup, document.querySelector("main"));
-        // So that it's only built once and then it'll do nothing when called!
-        buildHelperPopup = () => {};
+        const help_button = getHelpButton();
+        help_button.appendChild(container);
+
+        container.onblur = helpBlurHandler;
+        container.onclick = event => {
+            event.preventDefault();
+        };
+        help_button.onblur = helpBlurHandler;
+        help_button.children[0].onblur = helpBlurHandler;
+
+        return container;
+    }
+
+    /**
+     * Hide all the popover menus.
+     */
+    window.hidePopoverMenus = function() {
+        onEachLazy(document.querySelectorAll(".search-container .popover"), elem => {
+            elem.style.display = "none";
+        });
     };
 
+    /**
+     * Returns the help menu element (not the button).
+     *
+     * @param {boolean} buildNeeded - If this argument is `false`, the help menu element won't be
+     *                                built if it doesn't exist.
+     *
+     * @return {HTMLElement}
+     */
+    function getHelpMenu(buildNeeded) {
+        let menu = getHelpButton().querySelector(".popover");
+        if (!menu && buildNeeded) {
+            menu = buildHelpMenu();
+        }
+        return menu;
+    }
+
+    /**
+     * Show the help popup menu.
+     */
+    function showHelp() {
+        const menu = getHelpMenu(true);
+        if (menu.style.display === "none") {
+            menu.style.display = "";
+        }
+    }
+
+    document.querySelector(`#${HELP_BUTTON_ID} > button`).addEventListener("click", event => {
+        const target = event.target;
+        if (target.tagName !== "BUTTON" || target.parentElement.id !== HELP_BUTTON_ID) {
+            return;
+        }
+        const menu = getHelpMenu(true);
+        const shouldShowHelp = menu.style.display === "none";
+        if (shouldShowHelp) {
+            showHelp();
+        }
+    });
+
+    setMobileTopbar();
+    addSidebarItems();
+    addSidebarCrates();
     onHashChange(null);
     window.addEventListener("hashchange", onHashChange);
     searchState.setup();
diff --git a/src/librustdoc/html/static/js/search.js b/src/librustdoc/html/static/js/search.js
index c0b274c0a3f..cb1609d4983 100644
--- a/src/librustdoc/html/static/js/search.js
+++ b/src/librustdoc/html/static/js/search.js
@@ -1719,10 +1719,11 @@ function initSearch(rawSearchIndex) {
         }
 
         let crates = "";
-        if (window.ALL_CRATES.length > 1) {
+        const crates_list = Object.keys(rawSearchIndex);
+        if (crates_list.length > 1) {
             crates = " in <select id=\"crate-search\"><option value=\"All crates\">" +
                 "All crates</option>";
-            for (const c of window.ALL_CRATES) {
+            for (const c of crates_list) {
                 crates += `<option value="${c}" ${c === filterCrates && "selected"}>${c}</option>`;
             }
             crates += "</select>";
diff --git a/src/librustdoc/html/static/js/settings.js b/src/librustdoc/html/static/js/settings.js
index 41bf0ec8955..797b931afc6 100644
--- a/src/librustdoc/html/static/js/settings.js
+++ b/src/librustdoc/html/static/js/settings.js
@@ -1,6 +1,6 @@
 // Local js definitions:
 /* global getSettingValue, getVirtualKey, updateLocalStorage, updateSystemTheme */
-/* global addClass, removeClass, onEach, onEachLazy */
+/* global addClass, removeClass, onEach, onEachLazy, blurHandler, elemIsInParent */
 /* global MAIN_ID, getVar, getSettingsButton */
 
 "use strict";
@@ -209,6 +209,7 @@
         const innerHTML = `<div class="settings">${buildSettingsPageSections(settings)}</div>`;
         const el = document.createElement(elementKind);
         el.id = "settings";
+        el.className = "popover";
         el.innerHTML = innerHTML;
 
         if (isSettingsPage) {
@@ -226,23 +227,8 @@
         settingsMenu.style.display = "";
     }
 
-    function elemIsInParent(elem, parent) {
-        while (elem && elem !== document.body) {
-            if (elem === parent) {
-                return true;
-            }
-            elem = elem.parentElement;
-        }
-        return false;
-    }
-
-    function blurHandler(event) {
-        const settingsButton = getSettingsButton();
-        if (!elemIsInParent(document.activeElement, settingsButton) &&
-            !elemIsInParent(event.relatedTarget, settingsButton)
-        ) {
-            window.hideSettings();
-        }
+    function settingsBlurHandler(event) {
+        blurHandler(event, getSettingsButton(), window.hidePopoverMenus);
     }
 
     if (isSettingsPage) {
@@ -254,26 +240,24 @@
         // We replace the existing "onclick" callback.
         const settingsButton = getSettingsButton();
         const settingsMenu = document.getElementById("settings");
-        window.hideSettings = function() {
-            settingsMenu.style.display = "none";
-        };
         settingsButton.onclick = function(event) {
             if (elemIsInParent(event.target, settingsMenu)) {
                 return;
             }
             event.preventDefault();
-            if (settingsMenu.style.display !== "none") {
-                window.hideSettings();
-            } else {
+            const shouldDisplaySettings = settingsMenu.style.display === "none";
+
+            window.hidePopoverMenus();
+            if (shouldDisplaySettings) {
                 displaySettings();
             }
         };
-        settingsButton.onblur = blurHandler;
-        settingsButton.querySelector("a").onblur = blurHandler;
+        settingsButton.onblur = settingsBlurHandler;
+        settingsButton.querySelector("a").onblur = settingsBlurHandler;
         onEachLazy(settingsMenu.querySelectorAll("input"), el => {
-            el.onblur = blurHandler;
+            el.onblur = settingsBlurHandler;
         });
-        settingsMenu.onblur = blurHandler;
+        settingsMenu.onblur = settingsBlurHandler;
     }
 
     // We now wait a bit for the web browser to end re-computing the DOM...
diff --git a/src/librustdoc/html/static/js/source-script.js b/src/librustdoc/html/static/js/source-script.js
index 14d8a942977..290c29d3141 100644
--- a/src/librustdoc/html/static/js/source-script.js
+++ b/src/librustdoc/html/static/js/source-script.js
@@ -9,33 +9,19 @@
 
 (function() {
 
-function getCurrentFilePath() {
-    const parts = window.location.pathname.split("/");
-    const rootPathParts = window.rootPath.split("/");
+const rootPath = document.getElementById("rustdoc-vars").attributes["data-root-path"].value;
 
-    for (const rootPathPart of rootPathParts) {
-        if (rootPathPart === "..") {
-            parts.pop();
-        }
-    }
-    let file = window.location.pathname.substring(parts.join("/").length);
-    if (file.startsWith("/")) {
-        file = file.substring(1);
-    }
-    return file.substring(0, file.length - 5);
-}
-
-function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
+function createDirEntry(elem, parent, fullPath, hasFoundFile) {
     const name = document.createElement("div");
     name.className = "name";
 
     fullPath += elem["name"] + "/";
 
-    name.onclick = () => {
-        if (hasClass(name, "expand")) {
-            removeClass(name, "expand");
+    name.onclick = ev => {
+        if (hasClass(ev.target, "expand")) {
+            removeClass(ev.target, "expand");
         } else {
-            addClass(name, "expand");
+            addClass(ev.target, "expand");
         }
     };
     name.innerText = elem["name"];
@@ -46,7 +32,7 @@ function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
     folders.className = "folders";
     if (elem.dirs) {
         for (const dir of elem.dirs) {
-            if (createDirEntry(dir, folders, fullPath, currentFile, hasFoundFile)) {
+            if (createDirEntry(dir, folders, fullPath, hasFoundFile)) {
                 addClass(name, "expand");
                 hasFoundFile = true;
             }
@@ -60,8 +46,9 @@ function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
         for (const file_text of elem.files) {
             const file = document.createElement("a");
             file.innerText = file_text;
-            file.href = window.rootPath + "src/" + fullPath + file_text + ".html";
-            if (!hasFoundFile && currentFile === fullPath + file_text) {
+            file.href = rootPath + "src/" + fullPath + file_text + ".html";
+            const w = window.location.href.split("#")[0];
+            if (!hasFoundFile && w === file.href) {
                 file.className = "selected";
                 addClass(name, "expand");
                 hasFoundFile = true;
@@ -72,18 +59,17 @@ function createDirEntry(elem, parent, fullPath, currentFile, hasFoundFile) {
     children.appendChild(files);
     parent.appendChild(name);
     parent.appendChild(children);
-    return hasFoundFile && currentFile.startsWith(fullPath);
+    return hasFoundFile;
 }
 
 function toggleSidebar() {
-    const sidebar = document.querySelector("nav.sidebar");
     const child = this.children[0];
     if (child.innerText === ">") {
-        sidebar.classList.add("expanded");
+        addClass(document.documentElement, "source-sidebar-expanded");
         child.innerText = "<";
         updateLocalStorage("source-sidebar-show", "true");
     } else {
-        sidebar.classList.remove("expanded");
+        removeClass(document.documentElement, "source-sidebar-expanded");
         child.innerText = ">";
         updateLocalStorage("source-sidebar-show", "false");
     }
@@ -109,9 +95,6 @@ function createSidebarToggle() {
 // This function is called from "source-files.js", generated in `html/render/mod.rs`.
 // eslint-disable-next-line no-unused-vars
 function createSourceSidebar() {
-    if (!window.rootPath.endsWith("/")) {
-        window.rootPath += "/";
-    }
     const container = document.querySelector("nav.sidebar");
 
     const sidebarToggle = createSidebarToggle();
@@ -119,13 +102,7 @@ function createSourceSidebar() {
 
     const sidebar = document.createElement("div");
     sidebar.id = "source-sidebar";
-    if (getCurrentValue("source-sidebar-show") !== "true") {
-        container.classList.remove("expanded");
-    } else {
-        container.classList.add("expanded");
-    }
 
-    const currentFile = getCurrentFilePath();
     let hasFoundFile = false;
 
     const title = document.createElement("div");
@@ -135,7 +112,7 @@ function createSourceSidebar() {
     Object.keys(sourcesIndex).forEach(key => {
         sourcesIndex[key].name = key;
         hasFoundFile = createDirEntry(sourcesIndex[key], sidebar, "",
-                                      currentFile, hasFoundFile);
+            hasFoundFile);
     });
 
     container.appendChild(sidebar);
diff --git a/src/librustdoc/html/static/js/storage.js b/src/librustdoc/html/static/js/storage.js
index 4fcf0499234..1c4c8834488 100644
--- a/src/librustdoc/html/static/js/storage.js
+++ b/src/librustdoc/html/static/js/storage.js
@@ -1,3 +1,8 @@
+// storage.js is loaded in the `<head>` of all rustdoc pages and doesn't
+// use `async` or `defer`. That means it blocks further parsing and rendering
+// of the page: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/script.
+// This makes it the correct place to act on settings that affect the display of
+// the page, so we don't see major layout changes during the load of the page.
 "use strict";
 
 const darkThemes = ["dark", "ayu"];
@@ -236,6 +241,12 @@ if (getSettingValue("use-system-theme") !== "false" && window.matchMedia) {
     switchToSavedTheme();
 }
 
+if (getSettingValue("source-sidebar-show") === "true") {
+    // At this point in page load, `document.body` is not available yet.
+    // Set a class on the `<html>` element instead.
+    addClass(document.documentElement, "source-sidebar-expanded");
+}
+
 // If we navigate away (for example to a settings page), and then use the back or
 // forward button to get back to a page, the theme may have changed in the meantime.
 // But scripts may not be re-loaded in such a case due to the bfcache
diff --git a/src/librustdoc/html/templates/page.html b/src/librustdoc/html/templates/page.html
index cd672aadd7e..dfb3e4e6a2c 100644
--- a/src/librustdoc/html/templates/page.html
+++ b/src/librustdoc/html/templates/page.html
@@ -34,17 +34,18 @@
       {%- endfor -%}
     ></script> {#- -#}
     <script src="{{static_root_path|safe}}storage{{page.resource_suffix}}.js"></script> {#- -#}
-    <script src="{{page.root_path|safe}}crates{{page.resource_suffix}}.js"></script> {#- -#}
+    {%- if page.css_class.contains("crate") -%}
+    <script defer src="{{page.root_path|safe}}crates{{page.resource_suffix}}.js"></script> {#- -#}
+    {%- else if page.css_class == "source" -%}
+    <script defer src="{{static_root_path|safe}}source-script{{page.resource_suffix}}.js"></script> {#- -#}
+    <script defer src="{{page.root_path|safe}}source-files{{page.resource_suffix}}.js"></script> {#- -#}
+    {%- else -%}
+    <script defer src="sidebar-items{{page.resource_suffix}}.js"></script> {#- -#}
+    {%- endif -%}
     <script defer src="{{static_root_path|safe}}main{{page.resource_suffix}}.js"></script> {#- -#}
-    {%- for script in page.static_extra_scripts -%}
-    <script defer src="{{static_root_path|safe}}{{script}}.js"></script> {#- -#}
-    {% endfor %}
     {%- if layout.scrape_examples_extension -%}
     <script defer src="{{page.root_path|safe}}scrape-examples{{page.resource_suffix}}.js"></script> {#- -#}
     {%- endif -%}
-    {%- for script in page.extra_scripts -%}
-    <script defer src="{{page.root_path|safe}}{{script}}.js"></script> {#- -#}
-    {% endfor %}
     <noscript> {#- -#}
         <link rel="stylesheet" {# -#}
            href="{{static_root_path|safe}}noscript{{page.resource_suffix}}.css"> {#- -#}
@@ -118,7 +119,9 @@
                                 spellcheck="false" {# -#}
                                 placeholder="Click or press ‘S’ to search, ‘?’ for more options…" {# -#}
                                 type="search"> {#- -#}
-                            <button type="button" id="help-button" title="help">?</button> {#- -#}
+                            <div id="help-button" title="help" tabindex="-1"> {#- -#}
+                                <button type="button">?</button> {#- -#}
+                            </div> {#- -#}
                             <div id="settings-menu" tabindex="-1">
                                 <a href="{{page.root_path|safe}}settings.html" title="settings"> {#- -#}
                                     <img width="22" height="22" alt="Change settings" {# -#}
diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs
index 4fde63c99d4..c627dcc30d6 100644
--- a/src/librustdoc/json/conversions.rs
+++ b/src/librustdoc/json/conversions.rs
@@ -43,7 +43,7 @@ impl JsonRenderer<'_> {
         let span = item.span(self.tcx);
         let clean::Item { name, attrs: _, kind: _, visibility, item_id, cfg: _ } = item;
         let inner = match *item.kind {
-            clean::StrippedItem(_) => return None,
+            clean::StrippedItem(_) | clean::KeywordItem(_) => return None,
             _ => from_clean_item(item, self.tcx),
         };
         Some(Item {
@@ -254,11 +254,8 @@ fn from_clean_item(item: clean::Item, tcx: TyCtxt<'_>) -> ItemEnum {
         },
         // FIXME: do not map to Typedef but to a custom variant
         AssocTypeItem(t, _) => ItemEnum::Typedef(t.into_tcx(tcx)),
-        // `convert_item` early returns `None` for striped items
-        StrippedItem(_) => unreachable!(),
-        KeywordItem(_) => {
-            panic!("{:?} is not supported for JSON output", item)
-        }
+        // `convert_item` early returns `None` for striped items and keywords.
+        StrippedItem(_) | KeywordItem(_) => unreachable!(),
         ExternCrateItem { ref src } => ItemEnum::ExternCrate {
             name: name.as_ref().unwrap().to_string(),
             rename: src.map(|x| x.to_string()),
@@ -764,7 +761,7 @@ impl FromWithTcx<ItemType> for ItemKind {
 fn ids(items: impl IntoIterator<Item = clean::Item>, tcx: TyCtxt<'_>) -> Vec<Id> {
     items
         .into_iter()
-        .filter(|x| !x.is_stripped())
+        .filter(|x| !x.is_stripped() && !x.is_keyword())
         .map(|i| from_item_id_with_name(i.item_id, tcx, i.name))
         .collect()
 }
diff --git a/src/test/codegen/loads.rs b/src/test/codegen/loads.rs
index 07de385193f..f448306ba1b 100644
--- a/src/test/codegen/loads.rs
+++ b/src/test/codegen/loads.rs
@@ -28,93 +28,93 @@ pub fn ptr_alignment_helper(x: &&()) {}
 // CHECK-LABEL: @load_ref
 #[no_mangle]
 pub fn load_ref<'a>(x: &&'a i32) -> &'a i32 {
-// CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META:[0-9]+]], !noundef !{{[0-9]+}}
+    // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META:[0-9]+]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_ref_higher_alignment
 #[no_mangle]
 pub fn load_ref_higher_alignment<'a>(x: &&'a Align16) -> &'a Align16 {
-// CHECK: load {{%Align16\*|i128\*|ptr}}, {{%Align16\*\*|i128\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_16_META:[0-9]+]], !noundef !{{[0-9]+}}
+    // CHECK: load {{%Align16\*|i128\*|ptr}}, {{%Align16\*\*|i128\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_16_META:[0-9]+]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_scalar_pair
 #[no_mangle]
 pub fn load_scalar_pair<'a>(x: &(&'a i32, &'a Align16)) -> (&'a i32, &'a Align16) {
-// CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %{{.+}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META]], !noundef !{{[0-9]+}}
-// CHECK: load {{i64\*|ptr}}, {{i64\*\*|ptr}} %{{.+}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_16_META]], !noundef !{{[0-9]+}}
+    // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %{{.+}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META]], !noundef !{{[0-9]+}}
+    // CHECK: load {{i64\*|ptr}}, {{i64\*\*|ptr}} %{{.+}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_16_META]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_raw_pointer
 #[no_mangle]
 pub fn load_raw_pointer<'a>(x: &*const i32) -> *const i32 {
-// loaded raw pointer should not have !nonnull, !align, or !noundef metadata
-// CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]]{{$}}
+    // loaded raw pointer should not have !nonnull, !align, or !noundef metadata
+    // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]]{{$}}
     *x
 }
 
 // CHECK-LABEL: @load_box
 #[no_mangle]
 pub fn load_box<'a>(x: Box<Box<i32>>) -> Box<i32> {
-// CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META]], !noundef !{{[0-9]+}}
+    // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %{{.*}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_bool
 #[no_mangle]
 pub fn load_bool(x: &bool) -> bool {
-// CHECK: load i8, {{i8\*|ptr}} %x, align 1, !range ![[BOOL_RANGE:[0-9]+]], !noundef !{{[0-9]+}}
+    // CHECK: load i8, {{i8\*|ptr}} %x, align 1, !range ![[BOOL_RANGE:[0-9]+]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_maybeuninit_bool
 #[no_mangle]
 pub fn load_maybeuninit_bool(x: &MaybeUninit<bool>) -> MaybeUninit<bool> {
-// CHECK: load i8, {{i8\*|ptr}} %x, align 1{{$}}
+    // CHECK: load i8, {{i8\*|ptr}} %x, align 1{{$}}
     *x
 }
 
 // CHECK-LABEL: @load_enum_bool
 #[no_mangle]
 pub fn load_enum_bool(x: &MyBool) -> MyBool {
-// CHECK: load i8, {{i8\*|ptr}} %x, align 1, !range ![[BOOL_RANGE]], !noundef !{{[0-9]+}}
+    // CHECK: load i8, {{i8\*|ptr}} %x, align 1, !range ![[BOOL_RANGE]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_maybeuninit_enum_bool
 #[no_mangle]
 pub fn load_maybeuninit_enum_bool(x: &MaybeUninit<MyBool>) -> MaybeUninit<MyBool> {
-// CHECK: load i8, {{i8\*|ptr}} %x, align 1{{$}}
+    // CHECK: load i8, {{i8\*|ptr}} %x, align 1{{$}}
     *x
 }
 
 // CHECK-LABEL: @load_int
 #[no_mangle]
 pub fn load_int(x: &u16) -> u16 {
-// CHECK: load i16, {{i16\*|ptr}} %x, align 2{{$}}
+    // CHECK: load i16, {{i16\*|ptr}} %x, align 2{{$}}
     *x
 }
 
 // CHECK-LABEL: @load_nonzero_int
 #[no_mangle]
 pub fn load_nonzero_int(x: &NonZeroU16) -> NonZeroU16 {
-// CHECK: load i16, {{i16\*|ptr}} %x, align 2, !range ![[NONZEROU16_RANGE:[0-9]+]], !noundef !{{[0-9]+}}
+    // CHECK: load i16, {{i16\*|ptr}} %x, align 2, !range ![[NONZEROU16_RANGE:[0-9]+]], !noundef !{{[0-9]+}}
     *x
 }
 
 // CHECK-LABEL: @load_option_nonzero_int
 #[no_mangle]
 pub fn load_option_nonzero_int(x: &Option<NonZeroU16>) -> Option<NonZeroU16> {
-// CHECK: load i16, {{i16\*|ptr}} %x, align 2{{$}}
+    // CHECK: load i16, {{i16\*|ptr}} %x, align 2{{$}}
     *x
 }
 
 // CHECK-LABEL: @borrow
 #[no_mangle]
 pub fn borrow(x: &i32) -> &i32 {
-// CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x{{.*}}, !nonnull
+    // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x{{.*}}, !nonnull
     &x; // keep variable in an alloca
     x
 }
@@ -122,7 +122,7 @@ pub fn borrow(x: &i32) -> &i32 {
 // CHECK-LABEL: @_box
 #[no_mangle]
 pub fn _box(x: Box<i32>) -> i32 {
-// CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x{{.*}}, !nonnull
+    // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x{{.*}}, align [[PTR_ALIGNMENT]]
     *x
 }
 
@@ -131,8 +131,8 @@ pub fn _box(x: Box<i32>) -> i32 {
 // dependent alignment
 #[no_mangle]
 pub fn small_array_alignment(x: [i8; 4]) -> [i8; 4] {
-// CHECK: [[VAR:%[0-9]+]] = load i32, {{i32\*|ptr}} %{{.*}}, align 1
-// CHECK: ret i32 [[VAR]]
+    // CHECK: [[VAR:%[0-9]+]] = load i32, {{i32\*|ptr}} %{{.*}}, align 1
+    // CHECK: ret i32 [[VAR]]
     x
 }
 
@@ -141,8 +141,8 @@ pub fn small_array_alignment(x: [i8; 4]) -> [i8; 4] {
 // dependent alignment
 #[no_mangle]
 pub fn small_struct_alignment(x: Bytes) -> Bytes {
-// CHECK: [[VAR:%[0-9]+]] = load i32, {{i32\*|ptr}} %{{.*}}, align 1
-// CHECK: ret i32 [[VAR]]
+    // CHECK: [[VAR:%[0-9]+]] = load i32, {{i32\*|ptr}} %{{.*}}, align 1
+    // CHECK: ret i32 [[VAR]]
     x
 }
 
diff --git a/src/test/codegen/noalias-rwlockreadguard.rs b/src/test/codegen/noalias-rwlockreadguard.rs
new file mode 100644
index 00000000000..7f7b46c85a8
--- /dev/null
+++ b/src/test/codegen/noalias-rwlockreadguard.rs
@@ -0,0 +1,14 @@
+// compile-flags: -O -C no-prepopulate-passes -Z mutable-noalias=yes
+
+#![crate_type = "lib"]
+
+use std::sync::{RwLock, RwLockReadGuard};
+
+// Make sure that `RwLockReadGuard` does not get a `noalias` attribute, because
+// the `RwLock` might alias writes after it is dropped.
+
+// CHECK-LABEL: @maybe_aliased(
+// CHECK-NOT: noalias
+// CHECK-SAME: %_data
+#[no_mangle]
+pub unsafe fn maybe_aliased(_: RwLockReadGuard<'_, i32>, _data: &RwLock<i32>) {}
diff --git a/src/test/debuginfo/rwlock-read.rs b/src/test/debuginfo/rwlock-read.rs
index e1c10a4d37f..ed9aae16b0d 100644
--- a/src/test/debuginfo/rwlock-read.rs
+++ b/src/test/debuginfo/rwlock-read.rs
@@ -15,11 +15,8 @@
 //
 // cdb-command:dx r
 // cdb-check:r                [Type: std::sync::rwlock::RwLockReadGuard<i32>]
-// cdb-check:    [...] lock             : [...] [Type: std::sync::rwlock::RwLock<i32> *]
-//
-// cdb-command:dx r.lock->data,d
-// cdb-check:r.lock->data,d   : 0 [Type: core::cell::UnsafeCell<i32>]
-// cdb-check:    [<Raw View>]     [Type: core::cell::UnsafeCell<i32>]
+// cdb-check:    [...] data             : NonNull([...]: 0) [Type: core::ptr::non_null::NonNull<i32>]
+// cdb-check:    [...] inner_lock       : [...] [Type: std::sys_common::rwlock::MovableRwLock *]
 
 #[allow(unused_variables)]
 
diff --git a/src/test/mir-opt/const_prop/boxes.main.ConstProp.diff b/src/test/mir-opt/const_prop/boxes.main.ConstProp.diff
index 342c987343e..87302424914 100644
--- a/src/test/mir-opt/const_prop/boxes.main.ConstProp.diff
+++ b/src/test/mir-opt/const_prop/boxes.main.ConstProp.diff
@@ -10,6 +10,10 @@
       let mut _5: usize;                   // in scope 0 at $DIR/boxes.rs:12:14: 12:22
       let mut _6: *mut u8;                 // in scope 0 at $DIR/boxes.rs:12:14: 12:22
       let mut _7: std::boxed::Box<i32>;    // in scope 0 at $DIR/boxes.rs:12:14: 12:22
+      let mut _8: *const i32;              // in scope 0 at $DIR/boxes.rs:12:14: 12:22
+      let mut _9: *const i32;              // in scope 0 at $DIR/boxes.rs:12:14: 12:22
+      let mut _10: *const i32;             // in scope 0 at $DIR/boxes.rs:12:14: 12:22
+      let mut _11: *const i32;             // in scope 0 at $DIR/boxes.rs:12:14: 12:22
       scope 1 {
           debug x => _1;                   // in scope 1 at $DIR/boxes.rs:12:9: 12:10
       }
@@ -34,10 +38,16 @@
       bb1: {
           StorageLive(_7);                 // scope 0 at $DIR/boxes.rs:12:14: 12:22
           _7 = ShallowInitBox(move _6, i32); // scope 0 at $DIR/boxes.rs:12:14: 12:22
-          (*_7) = const 42_i32;            // scope 0 at $DIR/boxes.rs:12:19: 12:21
+          StorageLive(_8);                 // scope 0 at $DIR/boxes.rs:12:19: 12:21
+          _8 = (((_7.0: std::ptr::Unique<i32>).0: std::ptr::NonNull<i32>).0: *const i32); // scope 0 at $DIR/boxes.rs:12:19: 12:21
+          (*_8) = const 42_i32;            // scope 0 at $DIR/boxes.rs:12:19: 12:21
+          StorageDead(_8);                 // scope 0 at $DIR/boxes.rs:12:14: 12:22
           _3 = move _7;                    // scope 0 at $DIR/boxes.rs:12:14: 12:22
           StorageDead(_7);                 // scope 0 at $DIR/boxes.rs:12:21: 12:22
-          _2 = (*_3);                      // scope 0 at $DIR/boxes.rs:12:13: 12:22
+          StorageLive(_9);                 // scope 0 at $DIR/boxes.rs:12:13: 12:22
+          _9 = (((_3.0: std::ptr::Unique<i32>).0: std::ptr::NonNull<i32>).0: *const i32); // scope 0 at $DIR/boxes.rs:12:13: 12:22
+          _2 = (*_9);                      // scope 0 at $DIR/boxes.rs:12:13: 12:22
+          StorageDead(_9);                 // scope 0 at $DIR/boxes.rs:12:13: 12:26
           _1 = Add(move _2, const 0_i32);  // scope 0 at $DIR/boxes.rs:12:13: 12:26
           StorageDead(_2);                 // scope 0 at $DIR/boxes.rs:12:25: 12:26
           drop(_3) -> [return: bb2, unwind: bb3]; // scope 0 at $DIR/boxes.rs:12:26: 12:27
diff --git a/src/test/mir-opt/inline/inline_into_box_place.main.Inline.32bit.diff b/src/test/mir-opt/inline/inline_into_box_place.main.Inline.32bit.diff
index 5b2b9f7e3a9..89414574898 100644
--- a/src/test/mir-opt/inline/inline_into_box_place.main.Inline.32bit.diff
+++ b/src/test/mir-opt/inline/inline_into_box_place.main.Inline.32bit.diff
@@ -9,14 +9,16 @@
       let mut _4: *mut u8;                 // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
       let mut _5: std::boxed::Box<std::vec::Vec<u32>>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
       let mut _6: ();                      // in scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
-+     let mut _7: &mut std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+      let mut _7: *const std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
+      let mut _8: *const std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
++     let mut _9: &mut std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
       scope 1 {
           debug _x => _1;                  // in scope 1 at $DIR/inline-into-box-place.rs:8:9: 8:11
       }
       scope 2 {
       }
 +     scope 3 (inlined Vec::<u32>::new) {  // at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         let mut _8: alloc::raw_vec::RawVec<u32>; // in scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         let mut _10: alloc::raw_vec::RawVec<u32>; // in scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
 +     }
   
       bb0: {
@@ -32,11 +34,13 @@
       bb1: {
           StorageLive(_5);                 // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
           _5 = ShallowInitBox(move _4, std::vec::Vec<u32>); // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
--         (*_5) = Vec::<u32>::new() -> [return: bb2, unwind: bb5]; // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         StorageLive(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         _7 = &mut (*_5);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         StorageLive(_8);                 // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         _8 = const alloc::raw_vec::RawVec::<u32>::NEW; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
+          StorageLive(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+          _7 = (((_5.0: std::ptr::Unique<std::vec::Vec<u32>>).0: std::ptr::NonNull<std::vec::Vec<u32>>).0: *const std::vec::Vec<u32>); // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+-         (*_7) = Vec::<u32>::new() -> [return: bb2, unwind: bb4]; // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         StorageLive(_9);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         _9 = &mut (*_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         StorageLive(_10);                // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         _10 = const alloc::raw_vec::RawVec::<u32>::NEW; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
                                            // mir::Constant
 -                                          // + span: $DIR/inline-into-box-place.rs:8:33: 8:41
 -                                          // + user_ty: UserType(1)
@@ -47,15 +51,16 @@
 +                                          // + span: $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
 +                                          // + user_ty: UserType(0)
 +                                          // + literal: Const { ty: alloc::raw_vec::RawVec<u32>, val: Unevaluated(alloc::raw_vec::RawVec::<T>::NEW, [u32], None) }
-+         Deinit((*_7));                   // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         ((*_7).0: alloc::raw_vec::RawVec<u32>) = move _8; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         ((*_7).1: usize) = const 0_usize; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         StorageDead(_8);                 // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         StorageDead(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         Deinit((*_9));                   // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         ((*_9).0: alloc::raw_vec::RawVec<u32>) = move _10; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         ((*_9).1: usize) = const 0_usize; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         StorageDead(_10);                // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         StorageDead(_9);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+          StorageDead(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
           _1 = move _5;                    // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
           StorageDead(_5);                 // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
           _0 = const ();                   // scope 0 at $DIR/inline-into-box-place.rs:7:11: 9:2
--         drop(_1) -> [return: bb3, unwind: bb4]; // scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
+-         drop(_1) -> [return: bb3, unwind: bb5]; // scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
 +         drop(_1) -> [return: bb2, unwind: bb3]; // scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
       }
   
@@ -66,15 +71,16 @@
       }
   
 -     bb4 (cleanup): {
-+     bb3 (cleanup): {
-          resume;                          // scope 0 at $DIR/inline-into-box-place.rs:7:1: 9:2
--     }
-- 
--     bb5 (cleanup): {
--         _6 = alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>(move (_5.0: std::ptr::Unique<std::vec::Vec<u32>>), move (_5.1: std::alloc::Global)) -> bb4; // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
+-         StorageDead(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+-         _6 = alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>(move (_5.0: std::ptr::Unique<std::vec::Vec<u32>>), move (_5.1: std::alloc::Global)) -> bb5; // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
 -                                          // mir::Constant
 -                                          // + span: $DIR/inline-into-box-place.rs:8:42: 8:43
 -                                          // + literal: Const { ty: unsafe fn(Unique<Vec<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>}, val: Value(Scalar(<ZST>)) }
+-     }
+- 
+-     bb5 (cleanup): {
++     bb3 (cleanup): {
+          resume;                          // scope 0 at $DIR/inline-into-box-place.rs:7:1: 9:2
       }
   }
   
diff --git a/src/test/mir-opt/inline/inline_into_box_place.main.Inline.64bit.diff b/src/test/mir-opt/inline/inline_into_box_place.main.Inline.64bit.diff
index 5b2b9f7e3a9..89414574898 100644
--- a/src/test/mir-opt/inline/inline_into_box_place.main.Inline.64bit.diff
+++ b/src/test/mir-opt/inline/inline_into_box_place.main.Inline.64bit.diff
@@ -9,14 +9,16 @@
       let mut _4: *mut u8;                 // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
       let mut _5: std::boxed::Box<std::vec::Vec<u32>>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
       let mut _6: ();                      // in scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
-+     let mut _7: &mut std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+      let mut _7: *const std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
+      let mut _8: *const std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
++     let mut _9: &mut std::vec::Vec<u32>; // in scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
       scope 1 {
           debug _x => _1;                  // in scope 1 at $DIR/inline-into-box-place.rs:8:9: 8:11
       }
       scope 2 {
       }
 +     scope 3 (inlined Vec::<u32>::new) {  // at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         let mut _8: alloc::raw_vec::RawVec<u32>; // in scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         let mut _10: alloc::raw_vec::RawVec<u32>; // in scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
 +     }
   
       bb0: {
@@ -32,11 +34,13 @@
       bb1: {
           StorageLive(_5);                 // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
           _5 = ShallowInitBox(move _4, std::vec::Vec<u32>); // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
--         (*_5) = Vec::<u32>::new() -> [return: bb2, unwind: bb5]; // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         StorageLive(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         _7 = &mut (*_5);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
-+         StorageLive(_8);                 // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         _8 = const alloc::raw_vec::RawVec::<u32>::NEW; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
+          StorageLive(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+          _7 = (((_5.0: std::ptr::Unique<std::vec::Vec<u32>>).0: std::ptr::NonNull<std::vec::Vec<u32>>).0: *const std::vec::Vec<u32>); // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+-         (*_7) = Vec::<u32>::new() -> [return: bb2, unwind: bb4]; // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         StorageLive(_9);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         _9 = &mut (*_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         StorageLive(_10);                // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         _10 = const alloc::raw_vec::RawVec::<u32>::NEW; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
                                            // mir::Constant
 -                                          // + span: $DIR/inline-into-box-place.rs:8:33: 8:41
 -                                          // + user_ty: UserType(1)
@@ -47,15 +51,16 @@
 +                                          // + span: $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
 +                                          // + user_ty: UserType(0)
 +                                          // + literal: Const { ty: alloc::raw_vec::RawVec<u32>, val: Unevaluated(alloc::raw_vec::RawVec::<T>::NEW, [u32], None) }
-+         Deinit((*_7));                   // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         ((*_7).0: alloc::raw_vec::RawVec<u32>) = move _8; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         ((*_7).1: usize) = const 0_usize; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         StorageDead(_8);                 // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
-+         StorageDead(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
++         Deinit((*_9));                   // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         ((*_9).0: alloc::raw_vec::RawVec<u32>) = move _10; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         ((*_9).1: usize) = const 0_usize; // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         StorageDead(_10);                // scope 3 at $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
++         StorageDead(_9);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+          StorageDead(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
           _1 = move _5;                    // scope 0 at $DIR/inline-into-box-place.rs:8:29: 8:43
           StorageDead(_5);                 // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
           _0 = const ();                   // scope 0 at $DIR/inline-into-box-place.rs:7:11: 9:2
--         drop(_1) -> [return: bb3, unwind: bb4]; // scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
+-         drop(_1) -> [return: bb3, unwind: bb5]; // scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
 +         drop(_1) -> [return: bb2, unwind: bb3]; // scope 0 at $DIR/inline-into-box-place.rs:9:1: 9:2
       }
   
@@ -66,15 +71,16 @@
       }
   
 -     bb4 (cleanup): {
-+     bb3 (cleanup): {
-          resume;                          // scope 0 at $DIR/inline-into-box-place.rs:7:1: 9:2
--     }
-- 
--     bb5 (cleanup): {
--         _6 = alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>(move (_5.0: std::ptr::Unique<std::vec::Vec<u32>>), move (_5.1: std::alloc::Global)) -> bb4; // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
+-         StorageDead(_7);                 // scope 0 at $DIR/inline-into-box-place.rs:8:33: 8:43
+-         _6 = alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>(move (_5.0: std::ptr::Unique<std::vec::Vec<u32>>), move (_5.1: std::alloc::Global)) -> bb5; // scope 0 at $DIR/inline-into-box-place.rs:8:42: 8:43
 -                                          // mir::Constant
 -                                          // + span: $DIR/inline-into-box-place.rs:8:42: 8:43
 -                                          // + literal: Const { ty: unsafe fn(Unique<Vec<u32>>, std::alloc::Global) {alloc::alloc::box_free::<Vec<u32>, std::alloc::Global>}, val: Value(Scalar(<ZST>)) }
+-     }
+- 
+-     bb5 (cleanup): {
++     bb3 (cleanup): {
+          resume;                          // scope 0 at $DIR/inline-into-box-place.rs:7:1: 9:2
       }
   }
   
diff --git a/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.b.Inline.after.mir b/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.b.Inline.after.mir
index 0bb3445a2d0..11a205eb415 100644
--- a/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.b.Inline.after.mir
+++ b/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.b.Inline.after.mir
@@ -11,6 +11,7 @@ fn b(_1: &mut Box<T>) -> &mut T {
         let mut _5: &mut T;              // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         let mut _6: &mut T;              // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         let mut _7: std::boxed::Box<T>;  // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        let mut _8: *const T;            // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
     }
 
     bb0: {
@@ -22,7 +23,10 @@ fn b(_1: &mut Box<T>) -> &mut T {
         StorageLive(_6);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         StorageLive(_7);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         _7 = move (*_4);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
-        _6 = &mut (*_7);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        StorageLive(_8);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        _8 = (((_7.0: std::ptr::Unique<T>).0: std::ptr::NonNull<T>).0: *const T); // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        _6 = &mut (*_8);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        StorageDead(_8);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         StorageDead(_7);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         _5 = &mut (*_6);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         _3 = &mut (*_5);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
diff --git a/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.d.Inline.after.mir b/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.d.Inline.after.mir
index c22852b99f4..b04a91d7c95 100644
--- a/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.d.Inline.after.mir
+++ b/src/test/mir-opt/inline/issue_58867_inline_as_ref_as_mut.d.Inline.after.mir
@@ -8,6 +8,7 @@ fn d(_1: &Box<T>) -> &T {
     scope 1 (inlined <Box<T> as AsRef<T>>::as_ref) { // at $DIR/issue-58867-inline-as-ref-as-mut.rs:18:5: 18:15
         debug self => _3;                // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         let mut _4: std::boxed::Box<T>;  // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        let mut _5: *const T;            // in scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
     }
 
     bb0: {
@@ -16,7 +17,10 @@ fn d(_1: &Box<T>) -> &T {
         _3 = &(*_1);                     // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:18:5: 18:15
         StorageLive(_4);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         _4 = move (*_3);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
-        _2 = &(*_4);                     // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        StorageLive(_5);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        _5 = (((_4.0: std::ptr::Unique<T>).0: std::ptr::NonNull<T>).0: *const T); // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        _2 = &(*_5);                     // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
+        StorageDead(_5);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         StorageDead(_4);                 // scope 1 at $SRC_DIR/alloc/src/boxed.rs:LL:COL
         _0 = &(*_2);                     // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:18:5: 18:15
         StorageDead(_3);                 // scope 0 at $DIR/issue-58867-inline-as-ref-as-mut.rs:18:14: 18:15
diff --git a/src/test/pretty/where-clauses.rs b/src/test/pretty/where-clauses.rs
index 5614a81b0eb..4183799457b 100644
--- a/src/test/pretty/where-clauses.rs
+++ b/src/test/pretty/where-clauses.rs
@@ -2,4 +2,7 @@
 
 fn f<'a, 'b, T>(t: T) -> isize where T: 'a, 'a: 'b, T: Eq { 0 }
 
+// This is legal syntax, sometimes generated by macros. `where T: $($bound+)*`
+fn zero_bounds<'a, T>() where 'a:, T: {}
+
 fn main() {}
diff --git a/src/test/rustdoc-gui/duplicate-macro-reexport.goml b/src/test/rustdoc-gui/duplicate-macro-reexport.goml
index c79b3a220c4..9ea5990622a 100644
--- a/src/test/rustdoc-gui/duplicate-macro-reexport.goml
+++ b/src/test/rustdoc-gui/duplicate-macro-reexport.goml
@@ -1,14 +1,14 @@
 // This test ensures that there is no macro duplicates in the sidebar.
 goto: file://|DOC_PATH|/test_docs/macro.a.html
 // Waiting for the elements in the sidebar to be rendered.
-wait-for: ".sidebar-elems .others .macro"
+wait-for: ".sidebar-elems .macro"
 // Check there is only one macro named "a" listed in the sidebar.
 assert-count: (
-    "//*[@class='sidebar-elems']//*[@class='others']/*[@class='block macro']//li/a[text()='a']",
+    "//*[@class='sidebar-elems']//*[@class='block macro']//li/a[text()='a']",
     1,
 )
 // Check there is only one macro named "b" listed in the sidebar.
 assert-count: (
-    "//*[@class='sidebar-elems']//*[@class='others']/*[@class='block macro']//li/a[text()='b']",
+    "//*[@class='sidebar-elems']//*[@class='block macro']//li/a[text()='b']",
     1,
 )
diff --git a/src/test/rustdoc-gui/escape-key.goml b/src/test/rustdoc-gui/escape-key.goml
index 8713bf65c84..d083b0ae0c9 100644
--- a/src/test/rustdoc-gui/escape-key.goml
+++ b/src/test/rustdoc-gui/escape-key.goml
@@ -21,17 +21,6 @@ wait-for: "#alternative-display #search"
 assert-attribute: ("#main-content", {"class": "content hidden"})
 assert-document-property: ({"URL": "index.html?search=test"}, ENDS_WITH)
 
-// Now let's check that when the help popup is displayed and we press Escape, it doesn't
-// hide the search results too.
-click: "#help-button"
-assert-document-property: ({"URL": "index.html?search=test"}, [ENDS_WITH])
-assert-attribute: ("#help", {"class": ""})
-press-key: "Escape"
-wait-for: "#alternative-display #search"
-assert-attribute: ("#help", {"class": "hidden"})
-assert-attribute: ("#main-content", {"class": "content hidden"})
-assert-document-property: ({"URL": "index.html?search=test"}, [ENDS_WITH])
-
 // Check that Escape hides the search results when a search result is focused.
 focus: ".search-input"
 assert: ".search-input:focus"
@@ -39,7 +28,6 @@ press-key: "ArrowDown"
 assert-false: ".search-input:focus"
 assert: "#results a:focus"
 press-key: "Escape"
-assert-attribute: ("#help", {"class": "hidden"})
 wait-for: "#not-displayed #search"
 assert-false: "#alternative-display #search"
 assert-attribute: ("#main-content", {"class": "content"})
diff --git a/src/test/rustdoc-gui/headings.goml b/src/test/rustdoc-gui/headings.goml
index 8f126d98fe4..67e97eb686e 100644
--- a/src/test/rustdoc-gui/headings.goml
+++ b/src/test/rustdoc-gui/headings.goml
@@ -106,8 +106,8 @@ assert-css: ("h6#sub-heading-for-enum-impl-item-doc", {"border-bottom-width": "0
 assert-css: ("h6#sub-sub-heading-for-enum-impl-item-doc", {"font-size": "14px"})
 assert-css: ("h6#sub-sub-heading-for-enum-impl-item-doc", {"border-bottom-width": "0px"})
 
-assert-text: (".sidebar .others h3", "Modules")
-assert-css: (".sidebar .others h3", {"border-bottom-width": "0px"}, ALL)
+assert-text: (".sidebar .mod h3", "Modules")
+assert-css: (".sidebar .mod h3", {"border-bottom-width": "0px"}, ALL)
 
 goto: file://|DOC_PATH|/test_docs/union.HeavilyDocumentedUnion.html
 
diff --git a/src/test/rustdoc-gui/pocket-menu.goml b/src/test/rustdoc-gui/pocket-menu.goml
new file mode 100644
index 00000000000..ba2986e969a
--- /dev/null
+++ b/src/test/rustdoc-gui/pocket-menu.goml
@@ -0,0 +1,72 @@
+// This test ensures that the "pocket menus" are working as expected.
+goto: file://|DOC_PATH|/test_docs/index.html
+// First we check that the help menu doesn't exist yet.
+assert-false: "#help-button .popover"
+// Then we display the help menu.
+click: "#help-button"
+assert: "#help-button .popover"
+assert-css: ("#help-button .popover", {"display": "block"})
+
+// Now we click somewhere else on the page to ensure it is handling the blur event
+// correctly.
+click: ".sidebar"
+assert-css: ("#help-button .popover", {"display": "none"})
+
+// Now we will check that we cannot have two "pocket menus" displayed at the same time.
+click: "#help-button"
+assert-css: ("#help-button .popover", {"display": "block"})
+click: "#settings-menu"
+assert-css: ("#help-button .popover", {"display": "none"})
+assert-css: ("#settings-menu .popover", {"display": "block"})
+
+// Now the other way.
+click: "#help-button"
+assert-css: ("#help-button .popover", {"display": "block"})
+assert-css: ("#settings-menu .popover", {"display": "none"})
+
+// We check the borders color now:
+
+// Ayu theme
+local-storage: {
+    "rustdoc-theme": "ayu",
+    "rustdoc-use-system-theme": "false",
+}
+reload:
+
+click: "#help-button"
+assert-css: (
+    "#help-button .popover",
+    {"display": "block", "border-color": "rgb(92, 103, 115)"},
+)
+compare-elements-css: ("#help-button .popover", "#help-button .top", ["border-color"])
+compare-elements-css: ("#help-button .popover", "#help-button .bottom", ["border-color"])
+
+// Dark theme
+local-storage: {
+    "rustdoc-theme": "dark",
+    "rustdoc-use-system-theme": "false",
+}
+reload:
+
+click: "#help-button"
+assert-css: (
+    "#help-button .popover",
+    {"display": "block", "border-color": "rgb(210, 210, 210)"},
+)
+compare-elements-css: ("#help-button .popover", "#help-button .top", ["border-color"])
+compare-elements-css: ("#help-button .popover", "#help-button .bottom", ["border-color"])
+
+// Light theme
+local-storage: {
+    "rustdoc-theme": "light",
+    "rustdoc-use-system-theme": "false",
+}
+reload:
+
+click: "#help-button"
+assert-css: (
+    "#help-button .popover",
+    {"display": "block", "border-color": "rgb(221, 221, 221)"},
+)
+compare-elements-css: ("#help-button .popover", "#help-button .top", ["border-color"])
+compare-elements-css: ("#help-button .popover", "#help-button .bottom", ["border-color"])
diff --git a/src/test/rustdoc-gui/shortcuts.goml b/src/test/rustdoc-gui/shortcuts.goml
index 37a7c166294..1f20a0eaa99 100644
--- a/src/test/rustdoc-gui/shortcuts.goml
+++ b/src/test/rustdoc-gui/shortcuts.goml
@@ -8,7 +8,6 @@ press-key: "Escape"
 assert-false: "input.search-input:focus"
 // We now check for the help popup.
 press-key: "?"
-assert-css: ("#help", {"display": "flex"})
-assert-false: "#help.hidden"
+assert-css: ("#help-button .popover", {"display": "block"})
 press-key: "Escape"
-assert-css: ("#help.hidden", {"display": "none"})
+assert-css: ("#help-button .popover", {"display": "none"})
diff --git a/src/test/rustdoc-gui/sidebar-source-code-display.goml b/src/test/rustdoc-gui/sidebar-source-code-display.goml
index 0066a38eaa5..8f53e8627ee 100644
--- a/src/test/rustdoc-gui/sidebar-source-code-display.goml
+++ b/src/test/rustdoc-gui/sidebar-source-code-display.goml
@@ -17,3 +17,102 @@ assert-css: (".sidebar > *:not(#sidebar-toggle)", {"visibility": "hidden", "opac
 click: "#sidebar-toggle"
 // Because of the transition CSS, we check by using `wait-for-css` instead of `assert-css`.
 wait-for-css: ("#sidebar-toggle", {"visibility": "visible", "opacity": 1})
+
+// Now we check the display of the sidebar items.
+show-text: true
+
+// First we start with the light theme.
+local-storage: {"rustdoc-theme": "light", "rustdoc-use-system-theme": "false"}
+reload:
+// Waiting for the sidebar to be displayed...
+wait-for-css: ("#sidebar-toggle", {"visibility": "visible", "opacity": 1})
+assert-css: (
+    "#source-sidebar .expand + .children a.selected",
+    {"color": "rgb(0, 0, 0)", "background-color": "rgb(255, 255, 255)"},
+)
+// Without hover.
+assert-css: (
+    "#source-sidebar .expand + .children > .files a:not(.selected)",
+    {"color": "rgb(0, 0, 0)", "background-color": "rgba(0, 0, 0, 0)"},
+)
+// With hover.
+move-cursor-to: "#source-sidebar .expand + .children > .files a:not(.selected)"
+assert-css: (
+    "#source-sidebar .expand + .children > .files a:not(.selected)",
+    {"color": "rgb(0, 0, 0)", "background-color": "rgb(224, 224, 224)"},
+)
+// Without hover.
+assert-css: (
+    "#source-sidebar .expand + .children .folders .name",
+    {"color": "rgb(0, 0, 0)", "background-color": "rgba(0, 0, 0, 0)"},
+)
+// With hover.
+move-cursor-to: "#source-sidebar .expand + .children .folders .name"
+assert-css: (
+    "#source-sidebar .expand + .children .folders .name",
+    {"color": "rgb(0, 0, 0)", "background-color": "rgb(224, 224, 224)"},
+)
+
+// Now with the dark theme.
+local-storage: {"rustdoc-theme": "dark", "rustdoc-use-system-theme": "false"}
+reload:
+// Waiting for the sidebar to be displayed...
+wait-for-css: ("#sidebar-toggle", {"visibility": "visible", "opacity": 1})
+assert-css: (
+    "#source-sidebar .expand + .children a.selected",
+    {"color": "rgb(221, 221, 221)", "background-color": "rgb(51, 51, 51)"},
+)
+// Without hover.
+assert-css: (
+    "#source-sidebar .expand + .children > .files a:not(.selected)",
+    {"color": "rgb(221, 221, 221)", "background-color": "rgba(0, 0, 0, 0)"},
+)
+// With hover.
+move-cursor-to: "#source-sidebar .expand + .children > .files a:not(.selected)"
+assert-css: (
+    "#source-sidebar .expand + .children > .files a:not(.selected)",
+    {"color": "rgb(221, 221, 221)", "background-color": "rgb(68, 68, 68)"},
+)
+// Without hover.
+assert-css: (
+    "#source-sidebar .expand + .children .folders .name",
+    {"color": "rgb(221, 221, 221)", "background-color": "rgba(0, 0, 0, 0)"},
+)
+// With hover.
+move-cursor-to: "#source-sidebar .expand + .children .folders .name"
+assert-css: (
+    "#source-sidebar .expand + .children .folders .name",
+    {"color": "rgb(221, 221, 221)", "background-color": "rgb(68, 68, 68)"},
+)
+
+// And finally with the ayu theme.
+local-storage: {"rustdoc-theme": "ayu", "rustdoc-use-system-theme": "false"}
+reload:
+// Waiting for the sidebar to be displayed...
+wait-for-css: ("#sidebar-toggle", {"visibility": "visible", "opacity": 1})
+assert-css: (
+    "#source-sidebar .expand + .children a.selected",
+    {"color": "rgb(255, 180, 76)", "background-color": "rgb(20, 25, 31)"},
+)
+// Without hover.
+assert-css: (
+    "#source-sidebar .expand + .children > .files a:not(.selected)",
+    {"color": "rgb(197, 197, 197)", "background-color": "rgba(0, 0, 0, 0)"},
+)
+// With hover.
+move-cursor-to: "#source-sidebar .expand + .children > .files a:not(.selected)"
+assert-css: (
+    "#source-sidebar .expand + .children > .files a:not(.selected)",
+    {"color": "rgb(255, 180, 76)", "background-color": "rgb(20, 25, 31)"},
+)
+// Without hover.
+assert-css: (
+    "#source-sidebar .expand + .children .folders .name",
+    {"color": "rgb(197, 197, 197)", "background-color": "rgba(0, 0, 0, 0)"},
+)
+// With hover.
+move-cursor-to: "#source-sidebar .expand + .children .folders .name"
+assert-css: (
+    "#source-sidebar .expand + .children .folders .name",
+    {"color": "rgb(255, 180, 76)", "background-color": "rgb(20, 25, 31)"},
+)
diff --git a/src/test/rustdoc-gui/sidebar-source-code.goml b/src/test/rustdoc-gui/sidebar-source-code.goml
index 8b4a8bd40dd..724520bc399 100644
--- a/src/test/rustdoc-gui/sidebar-source-code.goml
+++ b/src/test/rustdoc-gui/sidebar-source-code.goml
@@ -8,12 +8,12 @@ assert-css: ("nav.sidebar", {"width": "50px"})
 // We now click on the button to expand the sidebar.
 click: (10, 10)
 // We wait for the sidebar to be expanded.
-wait-for-css: ("nav.sidebar.expanded", {"width": "300px"})
-assert-css: ("nav.sidebar.expanded a", {"font-size": "14px"})
+wait-for-css: (".source-sidebar-expanded nav.sidebar", {"width": "300px"})
+assert-css: (".source-sidebar-expanded nav.sidebar a", {"font-size": "14px"})
 // We collapse the sidebar.
 click: (10, 10)
 // We ensure that the class has been removed.
-wait-for: "nav.sidebar:not(.expanded)"
+wait-for: "html:not(.expanded)"
 assert: "nav.sidebar"
 
 // We now switch to mobile mode.
@@ -22,11 +22,11 @@ size: (600, 600)
 assert-css: ("nav.sidebar", {"width": "1px"})
 // We expand the sidebar.
 click: "#sidebar-toggle"
-assert-css: ("nav.sidebar.expanded", {"width": "600px"})
+assert-css: (".source-sidebar-expanded nav.sidebar", {"width": "600px"})
 // We collapse the sidebar.
 click: (10, 10)
 // We ensure that the class has been removed.
-assert-false: "nav.sidebar.expanded"
+assert-false: ".source-sidebar-expanded"
 assert: "nav.sidebar"
 
 // Check that the topbar is not visible
diff --git a/src/test/rustdoc-gui/source-code-page.goml b/src/test/rustdoc-gui/source-code-page.goml
index 188b2605f0f..b45512601f2 100644
--- a/src/test/rustdoc-gui/source-code-page.goml
+++ b/src/test/rustdoc-gui/source-code-page.goml
@@ -32,7 +32,7 @@ assert-document-property: ({"URL": "/lib.rs.html"}, ENDS_WITH)
 
 // First we "open" it.
 click: "#sidebar-toggle"
-assert: ".sidebar.expanded"
+assert: ".source-sidebar-expanded"
 
 // We check that the first entry of the sidebar is collapsed (which, for whatever reason,
 // is number 2 and not 1...).
diff --git a/src/test/rustdoc-json/keyword.rs b/src/test/rustdoc-json/keyword.rs
new file mode 100644
index 00000000000..78a843aca7b
--- /dev/null
+++ b/src/test/rustdoc-json/keyword.rs
@@ -0,0 +1,21 @@
+// Regression test for <https://github.com/rust-lang/rust/issues/98002>.
+
+// Keywords should not be generated in rustdoc JSON output and this test
+// ensures it.
+
+#![feature(rustdoc_internals)]
+#![no_std]
+
+// @has keyword.json
+// @!has - "$.index[*][?(@.name=='match')]"
+// @has - "$.index[*][?(@.name=='foo')]"
+
+#[doc(keyword = "match")]
+/// this is a test!
+pub mod foo {}
+
+// @!has - "$.index[*][?(@.name=='hello')]"
+// @!has - "$.index[*][?(@.name=='bar')]"
+#[doc(keyword = "hello")]
+/// hello
+mod bar {}
diff --git a/src/test/rustdoc-ui/display-output.stdout b/src/test/rustdoc-ui/display-output.stdout
index 51d638b31a8..ad25d1ce541 100644
--- a/src/test/rustdoc-ui/display-output.stdout
+++ b/src/test/rustdoc-ui/display-output.stdout
@@ -24,7 +24,7 @@ warning: unused variable: `x`
 LL | fn foo(x: &dyn std::fmt::Display) {}
    |        ^ help: if this is intentional, prefix it with an underscore: `_x`
 
-warning: function is never used: `foo`
+warning: function `foo` is never used
   --> $DIR/display-output.rs:13:4
    |
 LL | fn foo(x: &dyn std::fmt::Display) {}
diff --git a/src/test/rustdoc/check-source-code-urls-to-def-std.rs b/src/test/rustdoc/check-source-code-urls-to-def-std.rs
index b129ceb5b73..3396b234a77 100644
--- a/src/test/rustdoc/check-source-code-urls-to-def-std.rs
+++ b/src/test/rustdoc/check-source-code-urls-to-def-std.rs
@@ -15,3 +15,28 @@ pub fn foo(a: u32, b: &str, c: String) {
     let y: bool = true;
     babar();
 }
+
+macro_rules! yolo { () => {}}
+
+fn bar(a: i32) {}
+
+macro_rules! bar {
+    ($a:ident) => { bar($a) }
+}
+
+macro_rules! data {
+    ($x:expr) => { $x * 2 }
+}
+
+pub fn another_foo() {
+    // This is known limitation: if the macro doesn't generate anything, the visitor
+    // can't find any item or anything that could tell us that it comes from expansion.
+    // @!has - '//a[@href="../../src/foo/check-source-code-urls-to-def-std.rs.html#19"]' 'yolo!'
+    yolo!();
+    // @has - '//a[@href="{{channel}}/std/macro.eprintln.html"]' 'eprintln!'
+    eprintln!();
+    // @has - '//a[@href="../../src/foo/check-source-code-urls-to-def-std.rs.html#27-29"]' 'data!'
+    let x = data!(4);
+    // @has - '//a[@href="../../src/foo/check-source-code-urls-to-def-std.rs.html#23-25"]' 'bar!'
+    bar!(x);
+}
diff --git a/src/test/rustdoc/generic_const_exprs.rs b/src/test/rustdoc/generic_const_exprs.rs
new file mode 100644
index 00000000000..6ff59163975
--- /dev/null
+++ b/src/test/rustdoc/generic_const_exprs.rs
@@ -0,0 +1,24 @@
+// Regression test for <https://github.com/rust-lang/rust/issues/92859>.
+
+#![allow(incomplete_features)]
+#![feature(generic_const_exprs)]
+
+#![crate_name = "foo"]
+
+// @has 'foo/trait.Foo.html'
+
+pub trait Foo: Sized {
+    const WIDTH: usize;
+
+    fn arrayify(self) -> [Self; Self::WIDTH];
+}
+
+impl<T: Sized> Foo for T {
+    const WIDTH: usize = 1;
+
+    // @has - '//*[@id="tymethod.arrayify"]/*[@class="code-header"]' \
+    // 'fn arrayify(self) -> [Self; Self::WIDTH]'
+    fn arrayify(self) -> [Self; Self::WIDTH] {
+        [self]
+    }
+}
diff --git a/src/test/ui-fulldeps/internal-lints/diagnostics.rs b/src/test/ui-fulldeps/internal-lints/diagnostics.rs
index 817d8531da9..d6f63d44ba6 100644
--- a/src/test/ui-fulldeps/internal-lints/diagnostics.rs
+++ b/src/test/ui-fulldeps/internal-lints/diagnostics.rs
@@ -16,14 +16,14 @@ use rustc_session::{parse::ParseSess, SessionDiagnostic};
 use rustc_span::Span;
 
 #[derive(SessionDiagnostic)]
-#[error(slug = "parser-expect-path")]
+#[error(parser::expect_path)]
 struct DeriveSessionDiagnostic {
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[note(slug = "note")]
+#[note(parser::add_paren)]
 struct Note {
     #[primary_span]
     span: Span,
diff --git a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs
index 84d5de17309..7bec1897fa5 100644
--- a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs
+++ b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.rs
@@ -26,15 +26,15 @@ use rustc_errors::Applicability;
 extern crate rustc_session;
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "hello-world")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct Hello {}
 
 #[derive(SessionDiagnostic)]
-#[warning(code = "E0123", slug = "hello-world")]
+#[warning(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct HelloWarn {}
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 //~^ ERROR `#[derive(SessionDiagnostic)]` can only be used on structs
 enum SessionDiagnosticOnEnum {
     Foo,
@@ -42,13 +42,13 @@ enum SessionDiagnosticOnEnum {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 #[error = "E0123"]
 //~^ ERROR `#[error = ...]` is not a valid attribute
 struct WrongStructAttrStyle {}
 
 #[derive(SessionDiagnostic)]
-#[nonsense(code = "E0123", slug = "foo")]
+#[nonsense(typeck::ambiguous_lifetime_bound, code = "E0123")]
 //~^ ERROR `#[nonsense(...)]` is not a valid attribute
 //~^^ ERROR diagnostic kind not specified
 //~^^^ ERROR cannot find attribute `nonsense` in this scope
@@ -57,31 +57,39 @@ struct InvalidStructAttr {}
 #[derive(SessionDiagnostic)]
 #[error("E0123")]
 //~^ ERROR `#[error("...")]` is not a valid attribute
-//~^^ ERROR `slug` not specified
+//~^^ ERROR diagnostic slug not specified
 struct InvalidLitNestedAttr {}
 
 #[derive(SessionDiagnostic)]
-#[error(nonsense, code = "E0123", slug = "foo")]
-//~^ ERROR `#[error(nonsense)]` is not a valid attribute
+#[error(nonsense, code = "E0123")]
+//~^ ERROR cannot find value `nonsense` in module `rustc_errors::fluent`
 struct InvalidNestedStructAttr {}
 
 #[derive(SessionDiagnostic)]
 #[error(nonsense("foo"), code = "E0123", slug = "foo")]
 //~^ ERROR `#[error(nonsense(...))]` is not a valid attribute
+//~^^ ERROR diagnostic slug not specified
 struct InvalidNestedStructAttr1 {}
 
 #[derive(SessionDiagnostic)]
 #[error(nonsense = "...", code = "E0123", slug = "foo")]
 //~^ ERROR `#[error(nonsense = ...)]` is not a valid attribute
+//~^^ ERROR diagnostic slug not specified
 struct InvalidNestedStructAttr2 {}
 
 #[derive(SessionDiagnostic)]
 #[error(nonsense = 4, code = "E0123", slug = "foo")]
 //~^ ERROR `#[error(nonsense = ...)]` is not a valid attribute
+//~^^ ERROR diagnostic slug not specified
 struct InvalidNestedStructAttr3 {}
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123", slug = "foo")]
+//~^ ERROR `#[error(slug = ...)]` is not a valid attribute
+struct InvalidNestedStructAttr4 {}
+
+#[derive(SessionDiagnostic)]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct WrongPlaceField {
     #[suggestion = "bar"]
     //~^ ERROR `#[suggestion = ...]` is not a valid attribute
@@ -89,44 +97,45 @@ struct WrongPlaceField {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
-#[error(code = "E0456", slug = "bar")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0456")]
 //~^ ERROR specified multiple times
 //~^^ ERROR specified multiple times
 //~^^^ ERROR specified multiple times
 struct ErrorSpecifiedTwice {}
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
-#[warning(code = "E0293", slug = "bar")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+#[warning(typeck::ambiguous_lifetime_bound, code = "E0293")]
 //~^ ERROR specified multiple times
 //~^^ ERROR specified multiple times
 //~^^^ ERROR specified multiple times
 struct WarnSpecifiedAfterError {}
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0456", code = "E0457", slug = "bar")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0456", code = "E0457")]
 //~^ ERROR specified multiple times
 struct CodeSpecifiedTwice {}
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0456", slug = "foo", slug = "bar")]
-//~^ ERROR specified multiple times
+#[error(typeck::ambiguous_lifetime_bound, typeck::ambiguous_lifetime_bound, code = "E0456")]
+//~^ ERROR `#[error(typeck::ambiguous_lifetime_bound)]` is not a valid attribute
 struct SlugSpecifiedTwice {}
 
 #[derive(SessionDiagnostic)]
 struct KindNotProvided {} //~ ERROR diagnostic kind not specified
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0456")] //~ ERROR `slug` not specified
+#[error(code = "E0456")]
+//~^ ERROR diagnostic slug not specified
 struct SlugNotProvided {}
 
 #[derive(SessionDiagnostic)]
-#[error(slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound)]
 struct CodeNotProvided {}
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct MessageWrongType {
     #[primary_span]
     //~^ ERROR `#[primary_span]` attribute can only be applied to fields of type `Span`
@@ -134,7 +143,7 @@ struct MessageWrongType {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct InvalidPathFieldAttr {
     #[nonsense]
     //~^ ERROR `#[nonsense]` is not a valid attribute
@@ -143,34 +152,34 @@ struct InvalidPathFieldAttr {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithField {
     name: String,
-    #[label = "bar"]
+    #[label(typeck::label)]
     span: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithMessageAppliedToField {
-    #[label = "bar"]
-    //~^ ERROR the `#[label = ...]` attribute can only be applied to fields of type `Span`
+    #[label(typeck::label)]
+    //~^ ERROR the `#[label(...)]` attribute can only be applied to fields of type `Span`
     name: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithNonexistentField {
-    #[suggestion(message = "bar", code = "{name}")]
+    #[suggestion(typeck::suggestion, code = "{name}")]
     //~^ ERROR `name` doesn't refer to a field on this type
     suggestion: (Span, Applicability),
 }
 
 #[derive(SessionDiagnostic)]
 //~^ ERROR invalid format string: expected `'}'`
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorMissingClosingBrace {
-    #[suggestion(message = "bar", code = "{name")]
+    #[suggestion(typeck::suggestion, code = "{name")]
     suggestion: (Span, Applicability),
     name: String,
     val: usize,
@@ -178,48 +187,48 @@ struct ErrorMissingClosingBrace {
 
 #[derive(SessionDiagnostic)]
 //~^ ERROR invalid format string: unmatched `}`
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorMissingOpeningBrace {
-    #[suggestion(message = "bar", code = "name}")]
+    #[suggestion(typeck::suggestion, code = "name}")]
     suggestion: (Span, Applicability),
     name: String,
     val: usize,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct LabelOnSpan {
-    #[label = "bar"]
+    #[label(typeck::label)]
     sp: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct LabelOnNonSpan {
-    #[label = "bar"]
-    //~^ ERROR the `#[label = ...]` attribute can only be applied to fields of type `Span`
+    #[label(typeck::label)]
+    //~^ ERROR the `#[label(...)]` attribute can only be applied to fields of type `Span`
     id: u32,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct Suggest {
-    #[suggestion(message = "bar", code = "This is the suggested code")]
-    #[suggestion_short(message = "qux", code = "This is the suggested code")]
-    #[suggestion_hidden(message = "foobar", code = "This is the suggested code")]
-    #[suggestion_verbose(message = "fooqux", code = "This is the suggested code")]
+    #[suggestion(typeck::suggestion, code = "This is the suggested code")]
+    #[suggestion_short(typeck::suggestion, code = "This is the suggested code")]
+    #[suggestion_hidden(typeck::suggestion, code = "This is the suggested code")]
+    #[suggestion_verbose(typeck::suggestion, code = "This is the suggested code")]
     suggestion: (Span, Applicability),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithoutCode {
-    #[suggestion(message = "bar")]
+    #[suggestion(typeck::suggestion)]
     suggestion: (Span, Applicability),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithBadKey {
     #[suggestion(nonsense = "bar")]
     //~^ ERROR `#[suggestion(nonsense = ...)]` is not a valid attribute
@@ -227,7 +236,7 @@ struct SuggestWithBadKey {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithShorthandMsg {
     #[suggestion(msg = "bar")]
     //~^ ERROR `#[suggestion(msg = ...)]` is not a valid attribute
@@ -235,91 +244,91 @@ struct SuggestWithShorthandMsg {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithoutMsg {
     #[suggestion(code = "bar")]
     suggestion: (Span, Applicability),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithTypesSwapped {
-    #[suggestion(message = "bar", code = "This is suggested code")]
+    #[suggestion(typeck::suggestion, code = "This is suggested code")]
     suggestion: (Applicability, Span),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithWrongTypeApplicabilityOnly {
-    #[suggestion(message = "bar", code = "This is suggested code")]
+    #[suggestion(typeck::suggestion, code = "This is suggested code")]
     //~^ ERROR wrong field type for suggestion
     suggestion: Applicability,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithSpanOnly {
-    #[suggestion(message = "bar", code = "This is suggested code")]
+    #[suggestion(typeck::suggestion, code = "This is suggested code")]
     suggestion: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithDuplicateSpanAndApplicability {
-    #[suggestion(message = "bar", code = "This is suggested code")]
+    #[suggestion(typeck::suggestion, code = "This is suggested code")]
     //~^ ERROR type of field annotated with `#[suggestion(...)]` contains more than one `Span`
     suggestion: (Span, Span, Applicability),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct SuggestWithDuplicateApplicabilityAndSpan {
-    #[suggestion(message = "bar", code = "This is suggested code")]
+    #[suggestion(typeck::suggestion, code = "This is suggested code")]
     //~^ ERROR type of field annotated with `#[suggestion(...)]` contains more than one
     suggestion: (Applicability, Applicability, Span),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct WrongKindOfAnnotation {
-    #[label("bar")]
-    //~^ ERROR `#[label(...)]` is not a valid attribute
+    #[label = "bar"]
+    //~^ ERROR `#[label = ...]` is not a valid attribute
     z: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct OptionsInErrors {
-    #[label = "bar"]
+    #[label(typeck::label)]
     label: Option<Span>,
-    #[suggestion(message = "bar")]
+    #[suggestion(typeck::suggestion)]
     opt_sugg: Option<(Span, Applicability)>,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0456", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0456")]
 struct MoveOutOfBorrowError<'tcx> {
     name: Ident,
     ty: Ty<'tcx>,
     #[primary_span]
-    #[label = "bar"]
+    #[label(typeck::label)]
     span: Span,
-    #[label = "qux"]
+    #[label(typeck::label)]
     other_span: Span,
-    #[suggestion(message = "bar", code = "{name}.clone()")]
+    #[suggestion(typeck::suggestion, code = "{name}.clone()")]
     opt_sugg: Option<(Span, Applicability)>,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithLifetime<'a> {
-    #[label = "bar"]
+    #[label(typeck::label)]
     span: Span,
     name: &'a str,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithDefaultLabelAttr<'a> {
     #[label]
     span: Span,
@@ -328,7 +337,7 @@ struct ErrorWithDefaultLabelAttr<'a> {
 
 #[derive(SessionDiagnostic)]
 //~^ ERROR the trait bound `Hello: IntoDiagnosticArg` is not satisfied
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ArgFieldWithoutSkip {
     #[primary_span]
     span: Span,
@@ -336,7 +345,7 @@ struct ArgFieldWithoutSkip {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ArgFieldWithSkip {
     #[primary_span]
     span: Span,
@@ -347,132 +356,132 @@ struct ArgFieldWithSkip {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithSpannedNote {
     #[note]
     span: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithSpannedNoteCustom {
-    #[note = "bar"]
+    #[note(typeck::note)]
     span: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 #[note]
 struct ErrorWithNote {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
-#[note = "bar"]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+#[note(typeck::note)]
 struct ErrorWithNoteCustom {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithSpannedHelp {
     #[help]
     span: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithSpannedHelpCustom {
-    #[help = "bar"]
+    #[help(typeck::help)]
     span: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 #[help]
 struct ErrorWithHelp {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
-#[help = "bar"]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+#[help(typeck::help)]
 struct ErrorWithHelpCustom {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
 #[help]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithHelpWrongOrder {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[help = "bar"]
-#[error(code = "E0123", slug = "foo")]
+#[help(typeck::help)]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithHelpCustomWrongOrder {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
 #[note]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithNoteWrongOrder {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[note = "bar"]
-#[error(code = "E0123", slug = "foo")]
+#[note(typeck::note)]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ErrorWithNoteCustomWrongOrder {
     val: String,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ApplicabilityInBoth {
-    #[suggestion(message = "bar", code = "...", applicability = "maybe-incorrect")]
+    #[suggestion(typeck::suggestion, code = "...", applicability = "maybe-incorrect")]
     //~^ ERROR applicability cannot be set in both the field and attribute
     suggestion: (Span, Applicability),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct InvalidApplicability {
-    #[suggestion(message = "bar", code = "...", applicability = "batman")]
+    #[suggestion(typeck::suggestion, code = "...", applicability = "batman")]
     //~^ ERROR invalid applicability
     suggestion: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct ValidApplicability {
-    #[suggestion(message = "bar", code = "...", applicability = "maybe-incorrect")]
+    #[suggestion(typeck::suggestion, code = "...", applicability = "maybe-incorrect")]
     suggestion: Span,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct NoApplicability {
-    #[suggestion(message = "bar", code = "...")]
+    #[suggestion(typeck::suggestion, code = "...")]
     suggestion: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[note(slug = "note")]
+#[note(parser::add_paren)]
 struct Note;
 
 #[derive(SessionDiagnostic)]
-#[error(slug = "subdiagnostic")]
+#[error(typeck::ambiguous_lifetime_bound)]
 struct Subdiagnostic {
     #[subdiagnostic]
     note: Note,
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct VecField {
     #[primary_span]
     #[label]
@@ -480,23 +489,47 @@ struct VecField {
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct UnitField {
     #[primary_span]
     spans: Span,
     #[help]
     foo: (),
-    #[help = "a"]
+    #[help(typeck::help)]
     bar: (),
 }
 
 #[derive(SessionDiagnostic)]
-#[error(code = "E0123", slug = "foo")]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 struct OptUnitField {
     #[primary_span]
     spans: Span,
     #[help]
     foo: Option<()>,
-    #[help = "a"]
+    #[help(typeck::help)]
     bar: Option<()>,
 }
+
+#[derive(SessionDiagnostic)]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+struct LabelWithTrailingPath {
+    #[label(typeck::label, foo)]
+    //~^ ERROR `#[label(...)]` is not a valid attribute
+    span: Span,
+}
+
+#[derive(SessionDiagnostic)]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+struct LabelWithTrailingNameValue {
+    #[label(typeck::label, foo = "...")]
+    //~^ ERROR `#[label(...)]` is not a valid attribute
+    span: Span,
+}
+
+#[derive(SessionDiagnostic)]
+#[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+struct LabelWithTrailingList {
+    #[label(typeck::label, foo("..."))]
+    //~^ ERROR `#[label(...)]` is not a valid attribute
+    span: Span,
+}
diff --git a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr
index 85ea44ec278..0d9690e1f5a 100644
--- a/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr
+++ b/src/test/ui-fulldeps/session-diagnostic/diagnostic-derive.stderr
@@ -1,7 +1,7 @@
 error: `#[derive(SessionDiagnostic)]` can only be used on structs
   --> $DIR/diagnostic-derive.rs:37:1
    |
-LL | / #[error(code = "E0123", slug = "foo")]
+LL | / #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
 LL | |
 LL | | enum SessionDiagnosticOnEnum {
 LL | |     Foo,
@@ -18,15 +18,15 @@ LL | #[error = "E0123"]
 error: `#[nonsense(...)]` is not a valid attribute
   --> $DIR/diagnostic-derive.rs:51:1
    |
-LL | #[nonsense(code = "E0123", slug = "foo")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[nonsense(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
-   = help: only `error` and `warning` are valid attributes
+   = help: only `error`, `warning`, `help` and `note` are valid attributes
 
 error: diagnostic kind not specified
   --> $DIR/diagnostic-derive.rs:51:1
    |
-LL | / #[nonsense(code = "E0123", slug = "foo")]
+LL | / #[nonsense(typeck::ambiguous_lifetime_bound, code = "E0123")]
 LL | |
 LL | |
 LL | |
@@ -40,8 +40,10 @@ error: `#[error("...")]` is not a valid attribute
    |
 LL | #[error("E0123")]
    |         ^^^^^^^
+   |
+   = help: first argument of the attribute should be the diagnostic slug
 
-error: `slug` not specified
+error: diagnostic slug not specified
   --> $DIR/diagnostic-derive.rs:58:1
    |
 LL | / #[error("E0123")]
@@ -50,183 +52,215 @@ LL | |
 LL | | struct InvalidLitNestedAttr {}
    | |______________________________^
    |
-   = help: use the `#[error(slug = "...")]` attribute to set this diagnostic's slug
-
-error: `#[error(nonsense)]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:64:9
-   |
-LL | #[error(nonsense, code = "E0123", slug = "foo")]
-   |         ^^^^^^^^
+   = help: specify the slug as the first argument to the attribute, such as `#[error(typeck::example_error)]`
 
 error: `#[error(nonsense(...))]` is not a valid attribute
   --> $DIR/diagnostic-derive.rs:69:9
    |
 LL | #[error(nonsense("foo"), code = "E0123", slug = "foo")]
    |         ^^^^^^^^^^^^^^^
+   |
+   = help: first argument of the attribute should be the diagnostic slug
+
+error: diagnostic slug not specified
+  --> $DIR/diagnostic-derive.rs:69:1
+   |
+LL | / #[error(nonsense("foo"), code = "E0123", slug = "foo")]
+LL | |
+LL | |
+LL | | struct InvalidNestedStructAttr1 {}
+   | |__________________________________^
+   |
+   = help: specify the slug as the first argument to the attribute, such as `#[error(typeck::example_error)]`
 
 error: `#[error(nonsense = ...)]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:74:9
+  --> $DIR/diagnostic-derive.rs:75:9
    |
 LL | #[error(nonsense = "...", code = "E0123", slug = "foo")]
    |         ^^^^^^^^^^^^^^^^
    |
-   = help: only `slug` and `code` are valid nested attributes
+   = help: first argument of the attribute should be the diagnostic slug
+
+error: diagnostic slug not specified
+  --> $DIR/diagnostic-derive.rs:75:1
+   |
+LL | / #[error(nonsense = "...", code = "E0123", slug = "foo")]
+LL | |
+LL | |
+LL | | struct InvalidNestedStructAttr2 {}
+   | |__________________________________^
+   |
+   = help: specify the slug as the first argument to the attribute, such as `#[error(typeck::example_error)]`
 
 error: `#[error(nonsense = ...)]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:79:9
+  --> $DIR/diagnostic-derive.rs:81:9
    |
 LL | #[error(nonsense = 4, code = "E0123", slug = "foo")]
    |         ^^^^^^^^^^^^
+   |
+   = help: first argument of the attribute should be the diagnostic slug
 
-error: `#[suggestion = ...]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:86:5
+error: diagnostic slug not specified
+  --> $DIR/diagnostic-derive.rs:81:1
    |
-LL |     #[suggestion = "bar"]
-   |     ^^^^^^^^^^^^^^^^^^^^^
+LL | / #[error(nonsense = 4, code = "E0123", slug = "foo")]
+LL | |
+LL | |
+LL | | struct InvalidNestedStructAttr3 {}
+   | |__________________________________^
    |
-   = help: only `label`, `note` and `help` are valid field attributes
+   = help: specify the slug as the first argument to the attribute, such as `#[error(typeck::example_error)]`
 
-error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:93:1
+error: `#[error(slug = ...)]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:87:59
    |
-LL | #[error(code = "E0456", slug = "bar")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123", slug = "foo")]
+   |                                                           ^^^^^^^^^^^^
    |
-note: previously specified here
-  --> $DIR/diagnostic-derive.rs:92:1
+   = help: only `code` is a valid nested attributes following the slug
+
+error: `#[suggestion = ...]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:94:5
    |
-LL | #[error(code = "E0123", slug = "foo")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[suggestion = "bar"]
+   |     ^^^^^^^^^^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:93:16
+  --> $DIR/diagnostic-derive.rs:101:1
    |
-LL | #[error(code = "E0456", slug = "bar")]
-   |                ^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0456")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:92:16
+  --> $DIR/diagnostic-derive.rs:100:1
    |
-LL | #[error(code = "E0123", slug = "foo")]
-   |                ^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:93:32
+  --> $DIR/diagnostic-derive.rs:101:1
    |
-LL | #[error(code = "E0456", slug = "bar")]
-   |                                ^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0456")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:92:32
+  --> $DIR/diagnostic-derive.rs:100:1
    |
-LL | #[error(code = "E0123", slug = "foo")]
-   |                                ^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:101:1
+  --> $DIR/diagnostic-derive.rs:101:50
    |
-LL | #[warning(code = "E0293", slug = "bar")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0456")]
+   |                                                  ^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:100:1
+  --> $DIR/diagnostic-derive.rs:100:50
    |
-LL | #[error(code = "E0123", slug = "foo")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   |                                                  ^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:101:18
+  --> $DIR/diagnostic-derive.rs:109:1
    |
-LL | #[warning(code = "E0293", slug = "bar")]
-   |                  ^^^^^^^
+LL | #[warning(typeck::ambiguous_lifetime_bound, code = "E0293")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:100:16
+  --> $DIR/diagnostic-derive.rs:108:1
    |
-LL | #[error(code = "E0123", slug = "foo")]
-   |                ^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:101:34
+  --> $DIR/diagnostic-derive.rs:109:1
    |
-LL | #[warning(code = "E0293", slug = "bar")]
-   |                                  ^^^^^
+LL | #[warning(typeck::ambiguous_lifetime_bound, code = "E0293")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:100:32
+  --> $DIR/diagnostic-derive.rs:108:1
    |
-LL | #[error(code = "E0123", slug = "foo")]
-   |                                ^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:108:32
+  --> $DIR/diagnostic-derive.rs:109:52
    |
-LL | #[error(code = "E0456", code = "E0457", slug = "bar")]
-   |                                ^^^^^^^
+LL | #[warning(typeck::ambiguous_lifetime_bound, code = "E0293")]
+   |                                                    ^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:108:16
+  --> $DIR/diagnostic-derive.rs:108:50
    |
-LL | #[error(code = "E0456", code = "E0457", slug = "bar")]
-   |                ^^^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0123")]
+   |                                                  ^^^^^^^
 
 error: specified multiple times
-  --> $DIR/diagnostic-derive.rs:113:46
+  --> $DIR/diagnostic-derive.rs:116:66
    |
-LL | #[error(code = "E0456", slug = "foo", slug = "bar")]
-   |                                              ^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0456", code = "E0457")]
+   |                                                                  ^^^^^^^
    |
 note: previously specified here
-  --> $DIR/diagnostic-derive.rs:113:32
+  --> $DIR/diagnostic-derive.rs:116:50
    |
-LL | #[error(code = "E0456", slug = "foo", slug = "bar")]
-   |                                ^^^^^
+LL | #[error(typeck::ambiguous_lifetime_bound, code = "E0456", code = "E0457")]
+   |                                                  ^^^^^^^
+
+error: `#[error(typeck::ambiguous_lifetime_bound)]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:121:43
+   |
+LL | #[error(typeck::ambiguous_lifetime_bound, typeck::ambiguous_lifetime_bound, code = "E0456")]
+   |                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: diagnostic kind not specified
-  --> $DIR/diagnostic-derive.rs:118:1
+  --> $DIR/diagnostic-derive.rs:126:1
    |
 LL | struct KindNotProvided {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: use the `#[error(...)]` attribute to create an error
 
-error: `slug` not specified
-  --> $DIR/diagnostic-derive.rs:121:1
+error: diagnostic slug not specified
+  --> $DIR/diagnostic-derive.rs:129:1
    |
 LL | / #[error(code = "E0456")]
+LL | |
 LL | | struct SlugNotProvided {}
    | |_________________________^
    |
-   = help: use the `#[error(slug = "...")]` attribute to set this diagnostic's slug
+   = help: specify the slug as the first argument to the attribute, such as `#[error(typeck::example_error)]`
 
 error: the `#[primary_span]` attribute can only be applied to fields of type `Span`
-  --> $DIR/diagnostic-derive.rs:131:5
+  --> $DIR/diagnostic-derive.rs:140:5
    |
 LL |     #[primary_span]
    |     ^^^^^^^^^^^^^^^
 
 error: `#[nonsense]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:139:5
+  --> $DIR/diagnostic-derive.rs:148:5
    |
 LL |     #[nonsense]
    |     ^^^^^^^^^^^
    |
    = help: only `skip_arg`, `primary_span`, `label`, `note`, `help` and `subdiagnostic` are valid field attributes
 
-error: the `#[label = ...]` attribute can only be applied to fields of type `Span`
-  --> $DIR/diagnostic-derive.rs:156:5
+error: the `#[label(...)]` attribute can only be applied to fields of type `Span`
+  --> $DIR/diagnostic-derive.rs:165:5
    |
-LL |     #[label = "bar"]
-   |     ^^^^^^^^^^^^^^^^
+LL |     #[label(typeck::label)]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^
 
 error: `name` doesn't refer to a field on this type
-  --> $DIR/diagnostic-derive.rs:164:42
+  --> $DIR/diagnostic-derive.rs:173:45
    |
-LL |     #[suggestion(message = "bar", code = "{name}")]
-   |                                          ^^^^^^^^
+LL |     #[suggestion(typeck::suggestion, code = "{name}")]
+   |                                             ^^^^^^^^
 
 error: invalid format string: expected `'}'` but string was terminated
-  --> $DIR/diagnostic-derive.rs:169:16
+  --> $DIR/diagnostic-derive.rs:178:16
    |
 LL | #[derive(SessionDiagnostic)]
    |           -    ^ expected `'}'` in format string
@@ -237,7 +271,7 @@ LL | #[derive(SessionDiagnostic)]
    = note: this error originates in the derive macro `SessionDiagnostic` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: invalid format string: unmatched `}` found
-  --> $DIR/diagnostic-derive.rs:179:15
+  --> $DIR/diagnostic-derive.rs:188:15
    |
 LL | #[derive(SessionDiagnostic)]
    |               ^ unmatched `}` in format string
@@ -245,14 +279,14 @@ LL | #[derive(SessionDiagnostic)]
    = note: if you intended to print `}`, you can escape it using `}}`
    = note: this error originates in the derive macro `SessionDiagnostic` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: the `#[label = ...]` attribute can only be applied to fields of type `Span`
-  --> $DIR/diagnostic-derive.rs:199:5
+error: the `#[label(...)]` attribute can only be applied to fields of type `Span`
+  --> $DIR/diagnostic-derive.rs:208:5
    |
-LL |     #[label = "bar"]
-   |     ^^^^^^^^^^^^^^^^
+LL |     #[label(typeck::label)]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^
 
 error: `#[suggestion(nonsense = ...)]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:224:18
+  --> $DIR/diagnostic-derive.rs:233:18
    |
 LL |     #[suggestion(nonsense = "bar")]
    |                  ^^^^^^^^^^^^^^^^
@@ -260,7 +294,7 @@ LL |     #[suggestion(nonsense = "bar")]
    = help: only `message`, `code` and `applicability` are valid field attributes
 
 error: `#[suggestion(msg = ...)]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:232:18
+  --> $DIR/diagnostic-derive.rs:241:18
    |
 LL |     #[suggestion(msg = "bar")]
    |                  ^^^^^^^^^^^
@@ -268,9 +302,9 @@ LL |     #[suggestion(msg = "bar")]
    = help: only `message`, `code` and `applicability` are valid field attributes
 
 error: wrong field type for suggestion
-  --> $DIR/diagnostic-derive.rs:254:5
+  --> $DIR/diagnostic-derive.rs:263:5
    |
-LL | /     #[suggestion(message = "bar", code = "This is suggested code")]
+LL | /     #[suggestion(typeck::suggestion, code = "This is suggested code")]
 LL | |
 LL | |     suggestion: Applicability,
    | |_____________________________^
@@ -278,55 +312,77 @@ LL | |     suggestion: Applicability,
    = help: `#[suggestion(...)]` should be applied to fields of type `Span` or `(Span, Applicability)`
 
 error: type of field annotated with `#[suggestion(...)]` contains more than one `Span`
-  --> $DIR/diagnostic-derive.rs:269:5
+  --> $DIR/diagnostic-derive.rs:278:5
    |
-LL | /     #[suggestion(message = "bar", code = "This is suggested code")]
+LL | /     #[suggestion(typeck::suggestion, code = "This is suggested code")]
 LL | |
 LL | |     suggestion: (Span, Span, Applicability),
    | |___________________________________________^
 
 error: type of field annotated with `#[suggestion(...)]` contains more than one Applicability
-  --> $DIR/diagnostic-derive.rs:277:5
+  --> $DIR/diagnostic-derive.rs:286:5
    |
-LL | /     #[suggestion(message = "bar", code = "This is suggested code")]
+LL | /     #[suggestion(typeck::suggestion, code = "This is suggested code")]
 LL | |
 LL | |     suggestion: (Applicability, Applicability, Span),
    | |____________________________________________________^
 
-error: `#[label(...)]` is not a valid attribute
-  --> $DIR/diagnostic-derive.rs:285:5
-   |
-LL |     #[label("bar")]
-   |     ^^^^^^^^^^^^^^^
+error: `#[label = ...]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:294:5
    |
-   = help: only `suggestion{,_short,_hidden,_verbose}` are valid field attributes
+LL |     #[label = "bar"]
+   |     ^^^^^^^^^^^^^^^^
 
 error: applicability cannot be set in both the field and attribute
-  --> $DIR/diagnostic-derive.rs:436:49
+  --> $DIR/diagnostic-derive.rs:445:52
    |
-LL |     #[suggestion(message = "bar", code = "...", applicability = "maybe-incorrect")]
-   |                                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[suggestion(typeck::suggestion, code = "...", applicability = "maybe-incorrect")]
+   |                                                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: invalid applicability
-  --> $DIR/diagnostic-derive.rs:444:49
+  --> $DIR/diagnostic-derive.rs:453:52
+   |
+LL |     #[suggestion(typeck::suggestion, code = "...", applicability = "batman")]
+   |                                                    ^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `#[label(...)]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:516:5
+   |
+LL |     #[label(typeck::label, foo)]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `#[label(...)]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:524:5
+   |
+LL |     #[label(typeck::label, foo = "...")]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `#[label(...)]` is not a valid attribute
+  --> $DIR/diagnostic-derive.rs:532:5
    |
-LL |     #[suggestion(message = "bar", code = "...", applicability = "batman")]
-   |                                                 ^^^^^^^^^^^^^^^^^^^^^^^^
+LL |     #[label(typeck::label, foo("..."))]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: cannot find attribute `nonsense` in this scope
   --> $DIR/diagnostic-derive.rs:51:3
    |
-LL | #[nonsense(code = "E0123", slug = "foo")]
+LL | #[nonsense(typeck::ambiguous_lifetime_bound, code = "E0123")]
    |   ^^^^^^^^
 
 error: cannot find attribute `nonsense` in this scope
-  --> $DIR/diagnostic-derive.rs:139:7
+  --> $DIR/diagnostic-derive.rs:148:7
    |
 LL |     #[nonsense]
    |       ^^^^^^^^
 
+error[E0425]: cannot find value `nonsense` in module `rustc_errors::fluent`
+  --> $DIR/diagnostic-derive.rs:64:9
+   |
+LL | #[error(nonsense, code = "E0123")]
+   |         ^^^^^^^^ not found in `rustc_errors::fluent`
+
 error[E0277]: the trait bound `Hello: IntoDiagnosticArg` is not satisfied
-  --> $DIR/diagnostic-derive.rs:329:10
+  --> $DIR/diagnostic-derive.rs:338:10
    |
 LL | #[derive(SessionDiagnostic)]
    |          ^^^^^^^^^^^^^^^^^ the trait `IntoDiagnosticArg` is not implemented for `Hello`
@@ -345,6 +401,7 @@ LL |         arg: impl IntoDiagnosticArg,
    |                   ^^^^^^^^^^^^^^^^^ required by this bound in `DiagnosticBuilder::<'a, G>::set_arg`
    = note: this error originates in the derive macro `SessionDiagnostic` (in Nightly builds, run with -Z macro-backtrace for more info)
 
-error: aborting due to 39 previous errors
+error: aborting due to 46 previous errors
 
-For more information about this error, try `rustc --explain E0277`.
+Some errors have detailed explanations: E0277, E0425.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.rs b/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.rs
index bb406c35c0e..6f4b6105b3e 100644
--- a/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.rs
+++ b/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.rs
@@ -20,7 +20,7 @@ use rustc_span::Span;
 use rustc_macros::SessionSubdiagnostic;
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "label-a")]
+#[label(parser::add_paren)]
 struct A {
     #[primary_span]
     span: Span,
@@ -29,13 +29,13 @@ struct A {
 
 #[derive(SessionSubdiagnostic)]
 enum B {
-    #[label(slug = "label-b-a")]
+    #[label(parser::add_paren)]
     A {
         #[primary_span]
         span: Span,
         var: String,
     },
-    #[label(slug = "label-b-b")]
+    #[label(parser::add_paren)]
     B {
         #[primary_span]
         span: Span,
@@ -44,7 +44,7 @@ enum B {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "label-c")]
+#[label(parser::add_paren)]
 //~^ ERROR label without `#[primary_span]` field
 struct C {
     var: String,
@@ -116,7 +116,8 @@ struct K {
 
 #[derive(SessionSubdiagnostic)]
 #[label(slug)]
-//~^ ERROR `#[label(slug)]` is not a valid attribute
+//~^ ERROR cannot find value `slug` in module `rustc_errors::fluent`
+//~^^ NOTE not found in `rustc_errors::fluent`
 struct L {
     #[primary_span]
     span: Span,
@@ -125,7 +126,7 @@ struct L {
 
 #[derive(SessionSubdiagnostic)]
 #[label()]
-//~^ ERROR `slug` must be set in a `#[label(...)]` attribute
+//~^ ERROR diagnostic slug must be first argument of a `#[label(...)]` attribute
 struct M {
     #[primary_span]
     span: Span,
@@ -133,7 +134,7 @@ struct M {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(code = "...")]
+#[label(parser::add_paren, code = "...")]
 //~^ ERROR `code` is not a valid nested attribute of a `label` attribute
 struct N {
     #[primary_span]
@@ -142,11 +143,20 @@ struct N {
 }
 
 #[derive(SessionSubdiagnostic)]
+#[label(parser::add_paren, applicability = "machine-applicable")]
+//~^ ERROR `applicability` is not a valid nested attribute of a `label` attribute
+struct O {
+    #[primary_span]
+    span: Span,
+    var: String,
+}
+
+#[derive(SessionSubdiagnostic)]
 #[foo]
 //~^ ERROR cannot find attribute `foo` in this scope
 //~^^ ERROR unsupported type attribute for subdiagnostic enum
-enum O {
-    #[label(slug = "...")]
+enum P {
+    #[label(parser::add_paren)]
     A {
         #[primary_span]
         span: Span,
@@ -155,7 +165,7 @@ enum O {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum P {
+enum Q {
     #[bar]
 //~^ ERROR `#[bar]` is not a valid attribute
 //~^^ ERROR cannot find attribute `bar` in this scope
@@ -167,7 +177,7 @@ enum P {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum Q {
+enum R {
     #[bar = "..."]
 //~^ ERROR `#[bar = ...]` is not a valid attribute
 //~^^ ERROR cannot find attribute `bar` in this scope
@@ -179,7 +189,7 @@ enum Q {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum R {
+enum S {
     #[bar = 4]
 //~^ ERROR `#[bar = ...]` is not a valid attribute
 //~^^ ERROR cannot find attribute `bar` in this scope
@@ -191,7 +201,7 @@ enum R {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum S {
+enum T {
     #[bar("...")]
 //~^ ERROR `#[bar("...")]` is not a valid attribute
 //~^^ ERROR cannot find attribute `bar` in this scope
@@ -203,9 +213,9 @@ enum S {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum T {
+enum U {
     #[label(code = "...")]
-//~^ ERROR `code` is not a valid nested attribute of a `label`
+//~^ ERROR diagnostic slug must be first argument of a `#[label(...)]` attribute
     A {
         #[primary_span]
         span: Span,
@@ -214,8 +224,8 @@ enum T {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum U {
-    #[label(slug = "label-u")]
+enum V {
+    #[label(parser::add_paren)]
     A {
         #[primary_span]
         span: Span,
@@ -230,17 +240,17 @@ enum U {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "...")]
+#[label(parser::add_paren)]
 //~^ ERROR label without `#[primary_span]` field
-struct V {
+struct W {
     #[primary_span]
     //~^ ERROR the `#[primary_span]` attribute can only be applied to fields of type `Span`
     span: String,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "...")]
-struct W {
+#[label(parser::add_paren)]
+struct X {
     #[primary_span]
     span: Span,
     #[applicability]
@@ -249,8 +259,8 @@ struct W {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "...")]
-struct X {
+#[label(parser::add_paren)]
+struct Y {
     #[primary_span]
     span: Span,
     #[bar]
@@ -260,8 +270,8 @@ struct X {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "...")]
-struct Y {
+#[label(parser::add_paren)]
+struct Z {
     #[primary_span]
     span: Span,
     #[bar = "..."]
@@ -271,8 +281,8 @@ struct Y {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "...")]
-struct Z {
+#[label(parser::add_paren)]
+struct AA {
     #[primary_span]
     span: Span,
     #[bar("...")]
@@ -282,8 +292,8 @@ struct Z {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "label-aa")]
-struct AA {
+#[label(parser::add_paren)]
+struct AB {
     #[primary_span]
     span: Span,
     #[skip_arg]
@@ -291,36 +301,35 @@ struct AA {
 }
 
 #[derive(SessionSubdiagnostic)]
-union AB {
+union AC {
 //~^ ERROR unexpected unsupported untagged union
     span: u32,
     b: u64
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "label-ac-1")]
+#[label(parser::add_paren)]
 //~^ NOTE previously specified here
 //~^^ NOTE previously specified here
-#[label(slug = "label-ac-2")]
+#[label(parser::add_paren)]
 //~^ ERROR specified multiple times
 //~^^ ERROR specified multiple times
-struct AC {
+struct AD {
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "label-ad-1", slug = "label-ad-2")]
-//~^ ERROR specified multiple times
-//~^^ NOTE previously specified here
-struct AD {
+#[label(parser::add_paren, parser::add_paren)]
+//~^ ERROR `#[label(parser::add_paren)]` is not a valid attribute
+struct AE {
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[label(slug = "label-ad-1")]
-struct AE {
+#[label(parser::add_paren)]
+struct AF {
     #[primary_span]
 //~^ NOTE previously specified here
     span_a: Span,
@@ -330,15 +339,15 @@ struct AE {
 }
 
 #[derive(SessionSubdiagnostic)]
-struct AF {
+struct AG {
 //~^ ERROR subdiagnostic kind not specified
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "suggestion-af", code = "...")]
-struct AG {
+#[suggestion(parser::add_paren, code = "...")]
+struct AH {
     #[primary_span]
     span: Span,
     #[applicability]
@@ -347,8 +356,8 @@ struct AG {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum AH {
-    #[suggestion(slug = "suggestion-ag-a", code = "...")]
+enum AI {
+    #[suggestion(parser::add_paren, code = "...")]
     A {
         #[primary_span]
         span: Span,
@@ -356,7 +365,7 @@ enum AH {
         applicability: Applicability,
         var: String,
     },
-    #[suggestion(slug = "suggestion-ag-b", code = "...")]
+    #[suggestion(parser::add_paren, code = "...")]
     B {
         #[primary_span]
         span: Span,
@@ -367,10 +376,10 @@ enum AH {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code = "...", code = "...")]
+#[suggestion(parser::add_paren, code = "...", code = "...")]
 //~^ ERROR specified multiple times
 //~^^ NOTE previously specified here
-struct AI {
+struct AJ {
     #[primary_span]
     span: Span,
     #[applicability]
@@ -378,8 +387,8 @@ struct AI {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code = "...")]
-struct AJ {
+#[suggestion(parser::add_paren, code = "...")]
+struct AK {
     #[primary_span]
     span: Span,
     #[applicability]
@@ -391,9 +400,9 @@ struct AJ {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code = "...")]
+#[suggestion(parser::add_paren, code = "...")]
 //~^ ERROR suggestion without `applicability`
-struct AK {
+struct AL {
     #[primary_span]
     span: Span,
     #[applicability]
@@ -402,17 +411,17 @@ struct AK {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code = "...")]
+#[suggestion(parser::add_paren, code = "...")]
 //~^ ERROR suggestion without `applicability`
-struct AL {
+struct AM {
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...")]
+#[suggestion(parser::add_paren)]
 //~^ ERROR suggestion without `code = "..."`
-struct AM {
+struct AN {
     #[primary_span]
     span: Span,
     #[applicability]
@@ -420,34 +429,34 @@ struct AM {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code ="...", applicability = "foo")]
+#[suggestion(parser::add_paren, code ="...", applicability = "foo")]
 //~^ ERROR invalid applicability
-struct AN {
+struct AO {
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[help(slug = "label-am")]
-struct AO {
+#[help(parser::add_paren)]
+struct AP {
     var: String
 }
 
 #[derive(SessionSubdiagnostic)]
-#[note(slug = "label-an")]
-struct AP;
+#[note(parser::add_paren)]
+struct AQ;
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code = "...")]
+#[suggestion(parser::add_paren, code = "...")]
 //~^ ERROR suggestion without `applicability`
 //~^^ ERROR suggestion without `#[primary_span]` field
-struct AQ {
+struct AR {
     var: String,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code ="...", applicability = "machine-applicable")]
-struct AR {
+#[suggestion(parser::add_paren, code ="...", applicability = "machine-applicable")]
+struct AS {
     #[primary_span]
     span: Span,
 }
@@ -455,8 +464,8 @@ struct AR {
 #[derive(SessionSubdiagnostic)]
 #[label]
 //~^ ERROR unsupported type attribute for subdiagnostic enum
-enum AS {
-    #[label(slug = "...")]
+enum AT {
+    #[label(parser::add_paren)]
     A {
         #[primary_span]
         span: Span,
@@ -465,24 +474,24 @@ enum AS {
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code ="{var}", applicability = "machine-applicable")]
-struct AT {
+#[suggestion(parser::add_paren, code ="{var}", applicability = "machine-applicable")]
+struct AU {
     #[primary_span]
     span: Span,
     var: String,
 }
 
 #[derive(SessionSubdiagnostic)]
-#[suggestion(slug = "...", code ="{var}", applicability = "machine-applicable")]
+#[suggestion(parser::add_paren, code ="{var}", applicability = "machine-applicable")]
 //~^ ERROR `var` doesn't refer to a field on this type
-struct AU {
+struct AV {
     #[primary_span]
     span: Span,
 }
 
 #[derive(SessionSubdiagnostic)]
-enum AV {
-    #[suggestion(slug = "...", code ="{var}", applicability = "machine-applicable")]
+enum AW {
+    #[suggestion(parser::add_paren, code ="{var}", applicability = "machine-applicable")]
     A {
         #[primary_span]
         span: Span,
@@ -491,8 +500,8 @@ enum AV {
 }
 
 #[derive(SessionSubdiagnostic)]
-enum AW {
-    #[suggestion(slug = "...", code ="{var}", applicability = "machine-applicable")]
+enum AX {
+    #[suggestion(parser::add_paren, code ="{var}", applicability = "machine-applicable")]
 //~^ ERROR `var` doesn't refer to a field on this type
     A {
         #[primary_span]
diff --git a/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.stderr b/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.stderr
index 4984cc4b318..f833bd210f7 100644
--- a/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.stderr
+++ b/src/test/ui-fulldeps/session-diagnostic/subdiagnostic-derive.stderr
@@ -1,7 +1,7 @@
 error: label without `#[primary_span]` field
   --> $DIR/subdiagnostic-derive.rs:47:1
    |
-LL | / #[label(slug = "label-c")]
+LL | / #[label(parser::add_paren)]
 LL | |
 LL | | struct C {
 LL | |     var: String,
@@ -32,98 +32,106 @@ error: `#[label(bug = ...)]` is not a valid attribute
 LL | #[label(bug = "...")]
    |         ^^^^^^^^^^^
    |
-   = help: only `code`, `slug` and `applicability` are valid nested attributes
+   = help: first argument of the attribute should be the diagnostic slug
 
 error: `#[label("...")]` is not a valid attribute
   --> $DIR/subdiagnostic-derive.rs:91:9
    |
 LL | #[label("...")]
    |         ^^^^^
+   |
+   = help: first argument of the attribute should be the diagnostic slug
 
 error: `#[label(slug = ...)]` is not a valid attribute
   --> $DIR/subdiagnostic-derive.rs:100:9
    |
 LL | #[label(slug = 4)]
    |         ^^^^^^^^
+   |
+   = help: first argument of the attribute should be the diagnostic slug
 
 error: `#[label(slug(...))]` is not a valid attribute
   --> $DIR/subdiagnostic-derive.rs:109:9
    |
 LL | #[label(slug("..."))]
    |         ^^^^^^^^^^^
-
-error: `#[label(slug)]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:118:9
    |
-LL | #[label(slug)]
-   |         ^^^^
+   = help: first argument of the attribute should be the diagnostic slug
 
-error: `slug` must be set in a `#[label(...)]` attribute
-  --> $DIR/subdiagnostic-derive.rs:127:1
+error: diagnostic slug must be first argument of a `#[label(...)]` attribute
+  --> $DIR/subdiagnostic-derive.rs:128:1
    |
 LL | #[label()]
    | ^^^^^^^^^^
 
 error: `code` is not a valid nested attribute of a `label` attribute
-  --> $DIR/subdiagnostic-derive.rs:136:1
+  --> $DIR/subdiagnostic-derive.rs:137:1
+   |
+LL | #[label(parser::add_paren, code = "...")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `applicability` is not a valid nested attribute of a `label` attribute
+  --> $DIR/subdiagnostic-derive.rs:146:1
    |
-LL | #[label(code = "...")]
-   | ^^^^^^^^^^^^^^^^^^^^^^
+LL | #[label(parser::add_paren, applicability = "machine-applicable")]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: unsupported type attribute for subdiagnostic enum
-  --> $DIR/subdiagnostic-derive.rs:145:1
+  --> $DIR/subdiagnostic-derive.rs:155:1
    |
 LL | #[foo]
    | ^^^^^^
 
 error: `#[bar]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:159:5
+  --> $DIR/subdiagnostic-derive.rs:169:5
    |
 LL |     #[bar]
    |     ^^^^^^
 
 error: `#[bar = ...]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:171:5
+  --> $DIR/subdiagnostic-derive.rs:181:5
    |
 LL |     #[bar = "..."]
    |     ^^^^^^^^^^^^^^
 
 error: `#[bar = ...]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:183:5
+  --> $DIR/subdiagnostic-derive.rs:193:5
    |
 LL |     #[bar = 4]
    |     ^^^^^^^^^^
 
 error: `#[bar("...")]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:195:11
+  --> $DIR/subdiagnostic-derive.rs:205:11
    |
 LL |     #[bar("...")]
    |           ^^^^^
+   |
+   = help: first argument of the attribute should be the diagnostic slug
 
-error: `code` is not a valid nested attribute of a `label` attribute
-  --> $DIR/subdiagnostic-derive.rs:207:5
+error: diagnostic slug must be first argument of a `#[label(...)]` attribute
+  --> $DIR/subdiagnostic-derive.rs:217:5
    |
 LL |     #[label(code = "...")]
    |     ^^^^^^^^^^^^^^^^^^^^^^
 
 error: subdiagnostic kind not specified
-  --> $DIR/subdiagnostic-derive.rs:224:5
+  --> $DIR/subdiagnostic-derive.rs:234:5
    |
 LL |     B {
    |     ^
 
 error: the `#[primary_span]` attribute can only be applied to fields of type `Span`
-  --> $DIR/subdiagnostic-derive.rs:236:5
+  --> $DIR/subdiagnostic-derive.rs:246:5
    |
 LL |     #[primary_span]
    |     ^^^^^^^^^^^^^^^
 
 error: label without `#[primary_span]` field
-  --> $DIR/subdiagnostic-derive.rs:233:1
+  --> $DIR/subdiagnostic-derive.rs:243:1
    |
-LL | / #[label(slug = "...")]
+LL | / #[label(parser::add_paren)]
 LL | |
-LL | | struct V {
+LL | | struct W {
 LL | |     #[primary_span]
 LL | |
 LL | |     span: String,
@@ -131,13 +139,13 @@ LL | | }
    | |_^
 
 error: `#[applicability]` is only valid on suggestions
-  --> $DIR/subdiagnostic-derive.rs:246:5
+  --> $DIR/subdiagnostic-derive.rs:256:5
    |
 LL |     #[applicability]
    |     ^^^^^^^^^^^^^^^^
 
 error: `#[bar]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:256:5
+  --> $DIR/subdiagnostic-derive.rs:266:5
    |
 LL |     #[bar]
    |     ^^^^^^
@@ -145,21 +153,21 @@ LL |     #[bar]
    = help: only `primary_span`, `applicability` and `skip_arg` are valid field attributes
 
 error: `#[bar = ...]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:267:5
+  --> $DIR/subdiagnostic-derive.rs:277:5
    |
 LL |     #[bar = "..."]
    |     ^^^^^^^^^^^^^^
 
 error: `#[bar(...)]` is not a valid attribute
-  --> $DIR/subdiagnostic-derive.rs:278:5
+  --> $DIR/subdiagnostic-derive.rs:288:5
    |
 LL |     #[bar("...")]
    |     ^^^^^^^^^^^^^
 
 error: unexpected unsupported untagged union
-  --> $DIR/subdiagnostic-derive.rs:294:1
+  --> $DIR/subdiagnostic-derive.rs:304:1
    |
-LL | / union AB {
+LL | / union AC {
 LL | |
 LL | |     span: u32,
 LL | |     b: u64
@@ -167,95 +175,91 @@ LL | | }
    | |_^
 
 error: specified multiple times
-  --> $DIR/subdiagnostic-derive.rs:304:9
+  --> $DIR/subdiagnostic-derive.rs:314:1
    |
-LL | #[label(slug = "label-ac-2")]
-   |         ^^^^^^^^^^^^^^^^^^^
+LL | #[label(parser::add_paren)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/subdiagnostic-derive.rs:301:9
+  --> $DIR/subdiagnostic-derive.rs:311:1
    |
-LL | #[label(slug = "label-ac-1")]
-   |         ^^^^^^^^^^^^^^^^^^^
+LL | #[label(parser::add_paren)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/subdiagnostic-derive.rs:304:1
+  --> $DIR/subdiagnostic-derive.rs:314:1
    |
-LL | #[label(slug = "label-ac-2")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[label(parser::add_paren)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/subdiagnostic-derive.rs:301:1
+  --> $DIR/subdiagnostic-derive.rs:311:1
    |
-LL | #[label(slug = "label-ac-1")]
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | #[label(parser::add_paren)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: specified multiple times
-  --> $DIR/subdiagnostic-derive.rs:313:30
+error: `#[label(parser::add_paren)]` is not a valid attribute
+  --> $DIR/subdiagnostic-derive.rs:323:28
    |
-LL | #[label(slug = "label-ad-1", slug = "label-ad-2")]
-   |                              ^^^^^^^^^^^^^^^^^^^
+LL | #[label(parser::add_paren, parser::add_paren)]
+   |                            ^^^^^^^^^^^^^^^^^
    |
-note: previously specified here
-  --> $DIR/subdiagnostic-derive.rs:313:9
-   |
-LL | #[label(slug = "label-ad-1", slug = "label-ad-2")]
-   |         ^^^^^^^^^^^^^^^^^^^
+   = help: a diagnostic slug must be the first argument to the attribute
 
 error: specified multiple times
-  --> $DIR/subdiagnostic-derive.rs:327:5
+  --> $DIR/subdiagnostic-derive.rs:336:5
    |
 LL |     #[primary_span]
    |     ^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/subdiagnostic-derive.rs:324:5
+  --> $DIR/subdiagnostic-derive.rs:333:5
    |
 LL |     #[primary_span]
    |     ^^^^^^^^^^^^^^^
 
 error: subdiagnostic kind not specified
-  --> $DIR/subdiagnostic-derive.rs:333:8
+  --> $DIR/subdiagnostic-derive.rs:342:8
    |
-LL | struct AF {
+LL | struct AG {
    |        ^^
 
 error: specified multiple times
-  --> $DIR/subdiagnostic-derive.rs:370:42
+  --> $DIR/subdiagnostic-derive.rs:379:47
    |
-LL | #[suggestion(slug = "...", code = "...", code = "...")]
-   |                                          ^^^^^^^^^^^^
+LL | #[suggestion(parser::add_paren, code = "...", code = "...")]
+   |                                               ^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/subdiagnostic-derive.rs:370:28
+  --> $DIR/subdiagnostic-derive.rs:379:33
    |
-LL | #[suggestion(slug = "...", code = "...", code = "...")]
-   |                            ^^^^^^^^^^^^
+LL | #[suggestion(parser::add_paren, code = "...", code = "...")]
+   |                                 ^^^^^^^^^^^^
 
 error: specified multiple times
-  --> $DIR/subdiagnostic-derive.rs:388:5
+  --> $DIR/subdiagnostic-derive.rs:397:5
    |
 LL |     #[applicability]
    |     ^^^^^^^^^^^^^^^^
    |
 note: previously specified here
-  --> $DIR/subdiagnostic-derive.rs:385:5
+  --> $DIR/subdiagnostic-derive.rs:394:5
    |
 LL |     #[applicability]
    |     ^^^^^^^^^^^^^^^^
 
 error: the `#[applicability]` attribute can only be applied to fields of type `Applicability`
-  --> $DIR/subdiagnostic-derive.rs:399:5
+  --> $DIR/subdiagnostic-derive.rs:408:5
    |
 LL |     #[applicability]
    |     ^^^^^^^^^^^^^^^^
 
 error: suggestion without `applicability`
-  --> $DIR/subdiagnostic-derive.rs:394:1
+  --> $DIR/subdiagnostic-derive.rs:403:1
    |
-LL | / #[suggestion(slug = "...", code = "...")]
+LL | / #[suggestion(parser::add_paren, code = "...")]
 LL | |
-LL | | struct AK {
+LL | | struct AL {
 LL | |     #[primary_span]
 ...  |
 LL | |     applicability: Span,
@@ -263,22 +267,22 @@ LL | | }
    | |_^
 
 error: suggestion without `applicability`
-  --> $DIR/subdiagnostic-derive.rs:405:1
+  --> $DIR/subdiagnostic-derive.rs:414:1
    |
-LL | / #[suggestion(slug = "...", code = "...")]
+LL | / #[suggestion(parser::add_paren, code = "...")]
 LL | |
-LL | | struct AL {
+LL | | struct AM {
 LL | |     #[primary_span]
 LL | |     span: Span,
 LL | | }
    | |_^
 
 error: suggestion without `code = "..."`
-  --> $DIR/subdiagnostic-derive.rs:413:1
+  --> $DIR/subdiagnostic-derive.rs:422:1
    |
-LL | / #[suggestion(slug = "...")]
+LL | / #[suggestion(parser::add_paren)]
 LL | |
-LL | | struct AM {
+LL | | struct AN {
 LL | |     #[primary_span]
 ...  |
 LL | |     applicability: Applicability,
@@ -286,50 +290,50 @@ LL | | }
    | |_^
 
 error: invalid applicability
-  --> $DIR/subdiagnostic-derive.rs:423:41
+  --> $DIR/subdiagnostic-derive.rs:432:46
    |
-LL | #[suggestion(slug = "...", code ="...", applicability = "foo")]
-   |                                         ^^^^^^^^^^^^^^^^^^^^^
+LL | #[suggestion(parser::add_paren, code ="...", applicability = "foo")]
+   |                                              ^^^^^^^^^^^^^^^^^^^^^
 
 error: suggestion without `applicability`
-  --> $DIR/subdiagnostic-derive.rs:441:1
+  --> $DIR/subdiagnostic-derive.rs:450:1
    |
-LL | / #[suggestion(slug = "...", code = "...")]
+LL | / #[suggestion(parser::add_paren, code = "...")]
 LL | |
 LL | |
-LL | | struct AQ {
+LL | | struct AR {
 LL | |     var: String,
 LL | | }
    | |_^
 
 error: suggestion without `#[primary_span]` field
-  --> $DIR/subdiagnostic-derive.rs:441:1
+  --> $DIR/subdiagnostic-derive.rs:450:1
    |
-LL | / #[suggestion(slug = "...", code = "...")]
+LL | / #[suggestion(parser::add_paren, code = "...")]
 LL | |
 LL | |
-LL | | struct AQ {
+LL | | struct AR {
 LL | |     var: String,
 LL | | }
    | |_^
 
 error: unsupported type attribute for subdiagnostic enum
-  --> $DIR/subdiagnostic-derive.rs:456:1
+  --> $DIR/subdiagnostic-derive.rs:465:1
    |
 LL | #[label]
    | ^^^^^^^^
 
 error: `var` doesn't refer to a field on this type
-  --> $DIR/subdiagnostic-derive.rs:476:34
+  --> $DIR/subdiagnostic-derive.rs:485:39
    |
-LL | #[suggestion(slug = "...", code ="{var}", applicability = "machine-applicable")]
-   |                                  ^^^^^^^
+LL | #[suggestion(parser::add_paren, code ="{var}", applicability = "machine-applicable")]
+   |                                       ^^^^^^^
 
 error: `var` doesn't refer to a field on this type
-  --> $DIR/subdiagnostic-derive.rs:495:38
+  --> $DIR/subdiagnostic-derive.rs:504:43
    |
-LL |     #[suggestion(slug = "...", code ="{var}", applicability = "machine-applicable")]
-   |                                      ^^^^^^^
+LL |     #[suggestion(parser::add_paren, code ="{var}", applicability = "machine-applicable")]
+   |                                           ^^^^^^^
 
 error: cannot find attribute `foo` in this scope
   --> $DIR/subdiagnostic-derive.rs:63:3
@@ -338,52 +342,59 @@ LL | #[foo]
    |   ^^^
 
 error: cannot find attribute `foo` in this scope
-  --> $DIR/subdiagnostic-derive.rs:145:3
+  --> $DIR/subdiagnostic-derive.rs:155:3
    |
 LL | #[foo]
    |   ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:159:7
+  --> $DIR/subdiagnostic-derive.rs:169:7
    |
 LL |     #[bar]
    |       ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:171:7
+  --> $DIR/subdiagnostic-derive.rs:181:7
    |
 LL |     #[bar = "..."]
    |       ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:183:7
+  --> $DIR/subdiagnostic-derive.rs:193:7
    |
 LL |     #[bar = 4]
    |       ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:195:7
+  --> $DIR/subdiagnostic-derive.rs:205:7
    |
 LL |     #[bar("...")]
    |       ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:256:7
+  --> $DIR/subdiagnostic-derive.rs:266:7
    |
 LL |     #[bar]
    |       ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:267:7
+  --> $DIR/subdiagnostic-derive.rs:277:7
    |
 LL |     #[bar = "..."]
    |       ^^^
 
 error: cannot find attribute `bar` in this scope
-  --> $DIR/subdiagnostic-derive.rs:278:7
+  --> $DIR/subdiagnostic-derive.rs:288:7
    |
 LL |     #[bar("...")]
    |       ^^^
 
-error: aborting due to 51 previous errors
+error[E0425]: cannot find value `slug` in module `rustc_errors::fluent`
+  --> $DIR/subdiagnostic-derive.rs:118:9
+   |
+LL | #[label(slug)]
+   |         ^^^^ not found in `rustc_errors::fluent`
+
+error: aborting due to 52 previous errors
 
+For more information about this error, try `rustc --explain E0425`.
diff --git a/src/test/ui/argument-suggestions/basic.stderr b/src/test/ui/argument-suggestions/basic.stderr
index b44e77b43f8..dd4812b5b25 100644
--- a/src/test/ui/argument-suggestions/basic.stderr
+++ b/src/test/ui/argument-suggestions/basic.stderr
@@ -41,8 +41,8 @@ LL | fn missing(_i: u32) {}
    |    ^^^^^^^ -------
 help: provide the argument
    |
-LL |     missing({u32});
-   |     ~~~~~~~~~~~~~~
+LL |     missing(/* u32 */);
+   |     ~~~~~~~~~~~~~~~~~~
 
 error[E0308]: arguments to this function are incorrect
   --> $DIR/basic.rs:23:5
@@ -94,8 +94,8 @@ LL |     let closure = |x| x;
    |                   ^^^
 help: provide the argument
    |
-LL |     closure({_});
-   |     ~~~~~~~~~~~~
+LL |     closure(/* value */);
+   |     ~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to 6 previous errors
 
diff --git a/src/test/ui/argument-suggestions/complex.stderr b/src/test/ui/argument-suggestions/complex.stderr
index c628f7dff34..fa030a8f49d 100644
--- a/src/test/ui/argument-suggestions/complex.stderr
+++ b/src/test/ui/argument-suggestions/complex.stderr
@@ -11,8 +11,8 @@ LL | fn complex(_i: u32, _s: &str, _e: E, _f: F, _g: G, _x: X, _y: Y, _z: Z ) {}
    |    ^^^^^^^ -------  --------  -----  -----  -----  -----  -----  ------
 help: did you mean
    |
-LL |   complex({u32}, &"", {E}, F::X2, G{}, X {}, Y {}, Z {});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   complex(/* u32 */, &"", /* E */, F::X2, G{}, X {}, Y {}, Z {});
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/argument-suggestions/issue-96638.stderr b/src/test/ui/argument-suggestions/issue-96638.stderr
index 35190e2ca0d..8af31b8b751 100644
--- a/src/test/ui/argument-suggestions/issue-96638.stderr
+++ b/src/test/ui/argument-suggestions/issue-96638.stderr
@@ -11,8 +11,8 @@ LL | fn f(_: usize, _: &usize, _: usize) {}
    |    ^ --------  ---------  --------
 help: provide the argument
    |
-LL |     f({usize}, &x, {usize});
-   |     ~~~~~~~~~~~~~~~~~~~~~~~
+LL |     f(/* usize */, &x, /* usize */);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/argument-suggestions/issue-97197.stderr b/src/test/ui/argument-suggestions/issue-97197.stderr
index 10689d50957..ac54adc5eeb 100644
--- a/src/test/ui/argument-suggestions/issue-97197.stderr
+++ b/src/test/ui/argument-suggestions/issue-97197.stderr
@@ -11,8 +11,8 @@ LL | pub fn g(a1: (), a2: bool, a3: bool, a4: bool, a5: bool, a6: ()) -> () {}
    |        ^ ------  --------  --------  --------  --------  ------
 help: provide the arguments
    |
-LL |     g((), {bool}, {bool}, {bool}, {bool}, ());
-   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |     g((), /* bool */, /* bool */, /* bool */, /* bool */, ());
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/argument-suggestions/issue-97484.stderr b/src/test/ui/argument-suggestions/issue-97484.stderr
index 62ddabea0d7..2af24d521f3 100644
--- a/src/test/ui/argument-suggestions/issue-97484.stderr
+++ b/src/test/ui/argument-suggestions/issue-97484.stderr
@@ -19,8 +19,8 @@ LL +     foo(&&A, B, C, D, E, F, G);
    |
 help: remove the extra arguments
    |
-LL |     foo(&&A, D, {&E}, G);
-   |     ~~~~~~~~~~~~~~~~~~~~
+LL |     foo(&&A, D, /* &E */, G);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/argument-suggestions/missing_arguments.stderr b/src/test/ui/argument-suggestions/missing_arguments.stderr
index 5236d15b945..2509d22d7ff 100644
--- a/src/test/ui/argument-suggestions/missing_arguments.stderr
+++ b/src/test/ui/argument-suggestions/missing_arguments.stderr
@@ -11,8 +11,8 @@ LL | fn one_arg(_a: i32) {}
    |    ^^^^^^^ -------
 help: provide the argument
    |
-LL |   one_arg({i32});
-   |   ~~~~~~~~~~~~~~
+LL |   one_arg(/* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 2 arguments but 0 arguments were supplied
   --> $DIR/missing_arguments.rs:14:3
@@ -27,8 +27,8 @@ LL | fn two_same(_a: i32, _b: i32) {}
    |    ^^^^^^^^ -------  -------
 help: provide the arguments
    |
-LL |   two_same({i32}, {i32});
-   |   ~~~~~~~~~~~~~~~~~~~~~~
+LL |   two_same(/* i32 */, /* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 2 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:15:3
@@ -43,8 +43,8 @@ LL | fn two_same(_a: i32, _b: i32) {}
    |    ^^^^^^^^ -------  -------
 help: provide the argument
    |
-LL |   two_same(1, {i32});
-   |   ~~~~~~~~~~~~~~~~~~
+LL |   two_same(1, /* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 2 arguments but 0 arguments were supplied
   --> $DIR/missing_arguments.rs:16:3
@@ -59,8 +59,8 @@ LL | fn two_diff(_a: i32, _b: f32) {}
    |    ^^^^^^^^ -------  -------
 help: provide the arguments
    |
-LL |   two_diff({i32}, {f32});
-   |   ~~~~~~~~~~~~~~~~~~~~~~
+LL |   two_diff(/* i32 */, /* f32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 2 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:17:3
@@ -75,8 +75,8 @@ LL | fn two_diff(_a: i32, _b: f32) {}
    |    ^^^^^^^^ -------  -------
 help: provide the argument
    |
-LL |   two_diff(1, {f32});
-   |   ~~~~~~~~~~~~~~~~~~
+LL |   two_diff(1, /* f32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 2 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:18:3
@@ -91,8 +91,8 @@ LL | fn two_diff(_a: i32, _b: f32) {}
    |    ^^^^^^^^ -------  -------
 help: provide the argument
    |
-LL |   two_diff({i32}, 1.0);
-   |   ~~~~~~~~~~~~~~~~~~~~
+LL |   two_diff(/* i32 */, 1.0);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 0 arguments were supplied
   --> $DIR/missing_arguments.rs:21:3
@@ -107,8 +107,8 @@ LL | fn three_same(_a: i32, _b: i32, _c: i32) {}
    |    ^^^^^^^^^^ -------  -------  -------
 help: provide the arguments
    |
-LL |   three_same({i32}, {i32}, {i32});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_same(/* i32 */, /* i32 */, /* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:22:3
@@ -123,8 +123,8 @@ LL | fn three_same(_a: i32, _b: i32, _c: i32) {}
    |    ^^^^^^^^^^ -------  -------  -------
 help: provide the arguments
    |
-LL |   three_same(1, {i32}, {i32});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_same(1, /* i32 */, /* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 2 arguments were supplied
   --> $DIR/missing_arguments.rs:23:3
@@ -139,8 +139,8 @@ LL | fn three_same(_a: i32, _b: i32, _c: i32) {}
    |    ^^^^^^^^^^ -------  -------  -------
 help: provide the argument
    |
-LL |   three_same(1, 1, {i32});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_same(1, 1, /* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 2 arguments were supplied
   --> $DIR/missing_arguments.rs:26:3
@@ -155,8 +155,8 @@ LL | fn three_diff(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the argument
    |
-LL |   three_diff({i32}, 1.0, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_diff(/* i32 */, 1.0, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 2 arguments were supplied
   --> $DIR/missing_arguments.rs:27:3
@@ -171,8 +171,8 @@ LL | fn three_diff(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the argument
    |
-LL |   three_diff(1, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_diff(1, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 2 arguments were supplied
   --> $DIR/missing_arguments.rs:28:3
@@ -187,8 +187,8 @@ LL | fn three_diff(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the argument
    |
-LL |   three_diff(1, 1.0, {&str});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_diff(1, 1.0, /* &str */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:29:3
@@ -203,8 +203,8 @@ LL | fn three_diff(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the arguments
    |
-LL |   three_diff({i32}, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_diff(/* i32 */, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:30:3
@@ -222,8 +222,8 @@ LL | fn three_diff(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the arguments
    |
-LL |   three_diff({i32}, 1.0, {&str});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_diff(/* i32 */, 1.0, /* &str */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 1 argument was supplied
   --> $DIR/missing_arguments.rs:31:3
@@ -238,8 +238,8 @@ LL | fn three_diff(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the arguments
    |
-LL |   three_diff(1, {f32}, {&str});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_diff(1, /* f32 */, /* &str */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 4 arguments but 0 arguments were supplied
   --> $DIR/missing_arguments.rs:34:3
@@ -254,8 +254,8 @@ LL | fn four_repeated(_a: i32, _b: f32, _c: f32, _d: &str) {}
    |    ^^^^^^^^^^^^^ -------  -------  -------  --------
 help: provide the arguments
    |
-LL |   four_repeated({i32}, {f32}, {f32}, {&str});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   four_repeated(/* i32 */, /* f32 */, /* f32 */, /* &str */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 4 arguments but 2 arguments were supplied
   --> $DIR/missing_arguments.rs:35:3
@@ -270,8 +270,8 @@ LL | fn four_repeated(_a: i32, _b: f32, _c: f32, _d: &str) {}
    |    ^^^^^^^^^^^^^ -------  -------  -------  --------
 help: provide the arguments
    |
-LL |   four_repeated(1, {f32}, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   four_repeated(1, /* f32 */, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 5 arguments but 0 arguments were supplied
   --> $DIR/missing_arguments.rs:38:3
@@ -286,8 +286,8 @@ LL | fn complex(_a: i32, _b: f32, _c: i32, _d: f32, _e: &str) {}
    |    ^^^^^^^ -------  -------  -------  -------  --------
 help: provide the arguments
    |
-LL |   complex({i32}, {f32}, {i32}, {f32}, {&str});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   complex(/* i32 */, /* f32 */, /* i32 */, /* f32 */, /* &str */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 5 arguments but 2 arguments were supplied
   --> $DIR/missing_arguments.rs:39:3
@@ -302,8 +302,8 @@ LL | fn complex(_a: i32, _b: f32, _c: i32, _d: f32, _e: &str) {}
    |    ^^^^^^^ -------  -------  -------  -------  --------
 help: provide the arguments
    |
-LL |   complex(1, {f32}, {i32}, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   complex(1, /* f32 */, /* i32 */, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to 19 previous errors
 
diff --git a/src/test/ui/argument-suggestions/mixed_cases.stderr b/src/test/ui/argument-suggestions/mixed_cases.stderr
index 78765335c02..3fe4473a594 100644
--- a/src/test/ui/argument-suggestions/mixed_cases.stderr
+++ b/src/test/ui/argument-suggestions/mixed_cases.stderr
@@ -13,8 +13,8 @@ LL | fn two_args(_a: i32, _b: f32) {}
    |    ^^^^^^^^ -------  -------
 help: remove the extra argument
    |
-LL |   two_args(1, {f32});
-   |   ~~~~~~~~~~~~~~~~~~
+LL |   two_args(1, /* f32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 4 arguments were supplied
   --> $DIR/mixed_cases.rs:11:3
@@ -32,8 +32,8 @@ LL | fn three_args(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: did you mean
    |
-LL |   three_args(1, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_args(1, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 2 arguments were supplied
   --> $DIR/mixed_cases.rs:14:3
@@ -51,8 +51,8 @@ LL | fn three_args(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: provide the argument
    |
-LL |   three_args(1, {f32}, {&str});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_args(1, /* f32 */, /* &str */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0308]: arguments to this function are incorrect
   --> $DIR/mixed_cases.rs:17:3
@@ -69,8 +69,8 @@ LL | fn three_args(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: did you mean
    |
-LL |   three_args(1, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_args(1, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0308]: arguments to this function are incorrect
   --> $DIR/mixed_cases.rs:20:3
@@ -88,8 +88,8 @@ LL | fn three_args(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: swap these arguments
    |
-LL |   three_args(1, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_args(1, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 3 arguments but 2 arguments were supplied
   --> $DIR/mixed_cases.rs:23:3
@@ -108,8 +108,8 @@ LL | fn three_args(_a: i32, _b: f32, _c: &str) {}
    |    ^^^^^^^^^^ -------  -------  --------
 help: did you mean
    |
-LL |   three_args(1, {f32}, "");
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   three_args(1, /* f32 */, "");
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to 6 previous errors
 
diff --git a/src/test/ui/array-slice-vec/array_const_index-0.stderr b/src/test/ui/array-slice-vec/array_const_index-0.stderr
index 641705e1c68..b44251efdea 100644
--- a/src/test/ui/array-slice-vec/array_const_index-0.stderr
+++ b/src/test/ui/array-slice-vec/array_const_index-0.stderr
@@ -12,3 +12,16 @@ LL | const B: i32 = (&A)[1];
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/array_const_index-0.rs:2:16
+   |
+LL | const B: i32 = (&A)[1];
+   | ---------------^^^^^^^-
+   |                |
+   |                index out of bounds: the length is 0 but the index is 1
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/array-slice-vec/array_const_index-1.stderr b/src/test/ui/array-slice-vec/array_const_index-1.stderr
index 4d52d38af5e..8beebafb04c 100644
--- a/src/test/ui/array-slice-vec/array_const_index-1.stderr
+++ b/src/test/ui/array-slice-vec/array_const_index-1.stderr
@@ -12,3 +12,16 @@ LL | const B: i32 = A[1];
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/array_const_index-1.rs:2:16
+   |
+LL | const B: i32 = A[1];
+   | ---------------^^^^-
+   |                |
+   |                index out of bounds: the length is 0 but the index is 1
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/associated-consts/associated-const-dead-code.rs b/src/test/ui/associated-consts/associated-const-dead-code.rs
index e659bdb83f9..f7b676418ff 100644
--- a/src/test/ui/associated-consts/associated-const-dead-code.rs
+++ b/src/test/ui/associated-consts/associated-const-dead-code.rs
@@ -4,7 +4,7 @@ struct MyFoo;
 
 impl MyFoo {
     const BAR: u32 = 1;
-    //~^ ERROR associated constant is never used: `BAR`
+    //~^ ERROR associated constant `BAR` is never used
 }
 
 fn main() {
diff --git a/src/test/ui/associated-consts/associated-const-dead-code.stderr b/src/test/ui/associated-consts/associated-const-dead-code.stderr
index 9b6bbb68a71..7a4dbfe087b 100644
--- a/src/test/ui/associated-consts/associated-const-dead-code.stderr
+++ b/src/test/ui/associated-consts/associated-const-dead-code.stderr
@@ -1,4 +1,4 @@
-error: associated constant is never used: `BAR`
+error: associated constant `BAR` is never used
   --> $DIR/associated-const-dead-code.rs:6:5
    |
 LL |     const BAR: u32 = 1;
diff --git a/src/test/ui/associated-consts/defaults-not-assumed-fail.stderr b/src/test/ui/associated-consts/defaults-not-assumed-fail.stderr
index 7406b2ddee9..f04ea0b7477 100644
--- a/src/test/ui/associated-consts/defaults-not-assumed-fail.stderr
+++ b/src/test/ui/associated-consts/defaults-not-assumed-fail.stderr
@@ -29,3 +29,28 @@ LL |     assert_eq!(<() as Tr>::B, 0);    // causes the error above
 error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/defaults-not-assumed-fail.rs:8:19
+   |
+LL |     const B: u8 = Self::A + 1;
+   |     --------------^^^^^^^^^^^-
+   |                   |
+   |                   attempt to compute `u8::MAX + 1_u8`, which would overflow
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/defaults-not-assumed-fail.rs:34:5
+   |
+LL |     assert_eq!(<() as Tr>::B, 0);    // causes the error above
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/associated-item/associated-item-enum.stderr b/src/test/ui/associated-item/associated-item-enum.stderr
index d52b2b36c7b..a09b64aa2f5 100644
--- a/src/test/ui/associated-item/associated-item-enum.stderr
+++ b/src/test/ui/associated-item/associated-item-enum.stderr
@@ -2,7 +2,7 @@ error[E0599]: no variant or associated item named `mispellable` found for enum `
   --> $DIR/associated-item-enum.rs:17:11
    |
 LL | enum Enum { Variant }
-   | --------- variant or associated item `mispellable` not found here
+   |      ---- variant or associated item `mispellable` not found for this enum
 ...
 LL |     Enum::mispellable();
    |           ^^^^^^^^^^^
@@ -14,7 +14,7 @@ error[E0599]: no variant or associated item named `mispellable_trait` found for
   --> $DIR/associated-item-enum.rs:18:11
    |
 LL | enum Enum { Variant }
-   | --------- variant or associated item `mispellable_trait` not found here
+   |      ---- variant or associated item `mispellable_trait` not found for this enum
 ...
 LL |     Enum::mispellable_trait();
    |           ^^^^^^^^^^^^^^^^^
@@ -26,7 +26,7 @@ error[E0599]: no variant or associated item named `MISPELLABLE` found for enum `
   --> $DIR/associated-item-enum.rs:19:11
    |
 LL | enum Enum { Variant }
-   | --------- variant or associated item `MISPELLABLE` not found here
+   |      ---- variant or associated item `MISPELLABLE` not found for this enum
 ...
 LL |     Enum::MISPELLABLE;
    |           ^^^^^^^^^^^
diff --git a/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr b/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr
index bd8c8a4414c..fbd76a64c1e 100644
--- a/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr
+++ b/src/test/ui/associated-types/impl-trait-return-missing-constraint.stderr
@@ -6,6 +6,9 @@ LL | fn bar() -> impl Bar {
 ...
 LL | fn baz() -> impl Bar<Item = i32> {
    |             ^^^^^^^^^^^^^^^^^^^^ expected associated type, found `i32`
+LL |
+LL |     bar()
+   |     ----- return type was inferred to be `impl Bar` here
    |
    = note: expected associated type `<impl Bar as Foo>::Item`
                          found type `i32`
diff --git a/src/test/ui/issues/issue-47139-2.rs b/src/test/ui/associated-types/issue-47139-2.rs
index d2ef8942530..d2ef8942530 100644
--- a/src/test/ui/issues/issue-47139-2.rs
+++ b/src/test/ui/associated-types/issue-47139-2.rs
diff --git a/src/test/ui/associated-types/issue-87261.rs b/src/test/ui/associated-types/issue-87261.rs
index aae562ae722..384561f8ccd 100644
--- a/src/test/ui/associated-types/issue-87261.rs
+++ b/src/test/ui/associated-types/issue-87261.rs
@@ -83,17 +83,17 @@ fn main() {
     //~^ ERROR type mismatch resolving `<impl DerivedTrait as Trait>::Associated == ()`
 
     accepts_trait(returns_opaque_foo());
-    //~^ ERROR type mismatch resolving `<impl Foo + Trait as Trait>::Associated == ()`
+    //~^ ERROR type mismatch resolving `<impl Trait + Foo as Trait>::Associated == ()`
 
     accepts_trait(returns_opaque_derived_foo());
-    //~^ ERROR type mismatch resolving `<impl Foo + DerivedTrait as Trait>::Associated == ()`
+    //~^ ERROR type mismatch resolving `<impl DerivedTrait + Foo as Trait>::Associated == ()`
 
     accepts_generic_trait(returns_opaque_generic());
     //~^ ERROR type mismatch resolving `<impl GenericTrait<()> as GenericTrait<()>>::Associated == ()`
 
     accepts_generic_trait(returns_opaque_generic_foo());
-    //~^ ERROR type mismatch resolving `<impl Foo + GenericTrait<()> as GenericTrait<()>>::Associated == ()`
+    //~^ ERROR type mismatch resolving `<impl GenericTrait<()> + Foo as GenericTrait<()>>::Associated == ()`
 
     accepts_generic_trait(returns_opaque_generic_duplicate());
-    //~^ ERROR type mismatch resolving `<impl GenericTrait<u8> + GenericTrait<()> as GenericTrait<()>>::Associated == ()`
+    //~^ ERROR type mismatch resolving `<impl GenericTrait<()> + GenericTrait<u8> as GenericTrait<()>>::Associated == ()`
 }
diff --git a/src/test/ui/associated-types/issue-87261.stderr b/src/test/ui/associated-types/issue-87261.stderr
index c00b48abc1c..8db4a49da3c 100644
--- a/src/test/ui/associated-types/issue-87261.stderr
+++ b/src/test/ui/associated-types/issue-87261.stderr
@@ -160,7 +160,7 @@ help: consider constraining the associated type `<impl DerivedTrait as Trait>::A
 LL | fn returns_opaque_derived() -> impl DerivedTrait<Associated = ()> + 'static {
    |                                                 +++++++++++++++++
 
-error[E0271]: type mismatch resolving `<impl Foo + Trait as Trait>::Associated == ()`
+error[E0271]: type mismatch resolving `<impl Trait + Foo as Trait>::Associated == ()`
   --> $DIR/issue-87261.rs:85:5
    |
 LL | fn returns_opaque_foo() -> impl Trait + Foo {
@@ -170,18 +170,18 @@ LL |     accepts_trait(returns_opaque_foo());
    |     ^^^^^^^^^^^^^ expected `()`, found associated type
    |
    = note:    expected unit type `()`
-           found associated type `<impl Foo + Trait as Trait>::Associated`
+           found associated type `<impl Trait + Foo as Trait>::Associated`
 note: required by a bound in `accepts_trait`
   --> $DIR/issue-87261.rs:43:27
    |
 LL | fn accepts_trait<T: Trait<Associated = ()>>(_: T) {}
    |                           ^^^^^^^^^^^^^^^ required by this bound in `accepts_trait`
-help: consider constraining the associated type `<impl Foo + Trait as Trait>::Associated` to `()`
+help: consider constraining the associated type `<impl Trait + Foo as Trait>::Associated` to `()`
    |
 LL | fn returns_opaque_foo() -> impl Trait<Associated = ()> + Foo {
    |                                      +++++++++++++++++
 
-error[E0271]: type mismatch resolving `<impl Foo + DerivedTrait as Trait>::Associated == ()`
+error[E0271]: type mismatch resolving `<impl DerivedTrait + Foo as Trait>::Associated == ()`
   --> $DIR/issue-87261.rs:88:5
    |
 LL | fn returns_opaque_derived_foo() -> impl DerivedTrait + Foo {
@@ -191,8 +191,8 @@ LL |     accepts_trait(returns_opaque_derived_foo());
    |     ^^^^^^^^^^^^^ expected `()`, found associated type
    |
    = note:    expected unit type `()`
-           found associated type `<impl Foo + DerivedTrait as Trait>::Associated`
-   = help: consider constraining the associated type `<impl Foo + DerivedTrait as Trait>::Associated` to `()`
+           found associated type `<impl DerivedTrait + Foo as Trait>::Associated`
+   = help: consider constraining the associated type `<impl DerivedTrait + Foo as Trait>::Associated` to `()`
    = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
 note: required by a bound in `accepts_trait`
   --> $DIR/issue-87261.rs:43:27
@@ -221,7 +221,7 @@ help: consider constraining the associated type `<impl GenericTrait<()> as Gener
 LL | fn returns_opaque_generic() -> impl GenericTrait<(), Associated = ()> + 'static {
    |                                                    +++++++++++++++++
 
-error[E0271]: type mismatch resolving `<impl Foo + GenericTrait<()> as GenericTrait<()>>::Associated == ()`
+error[E0271]: type mismatch resolving `<impl GenericTrait<()> + Foo as GenericTrait<()>>::Associated == ()`
   --> $DIR/issue-87261.rs:94:5
    |
 LL | fn returns_opaque_generic_foo() -> impl GenericTrait<()> + Foo {
@@ -231,18 +231,18 @@ LL |     accepts_generic_trait(returns_opaque_generic_foo());
    |     ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
    |
    = note:    expected unit type `()`
-           found associated type `<impl Foo + GenericTrait<()> as GenericTrait<()>>::Associated`
+           found associated type `<impl GenericTrait<()> + Foo as GenericTrait<()>>::Associated`
 note: required by a bound in `accepts_generic_trait`
   --> $DIR/issue-87261.rs:44:46
    |
 LL | fn accepts_generic_trait<T: GenericTrait<(), Associated = ()>>(_: T) {}
    |                                              ^^^^^^^^^^^^^^^ required by this bound in `accepts_generic_trait`
-help: consider constraining the associated type `<impl Foo + GenericTrait<()> as GenericTrait<()>>::Associated` to `()`
+help: consider constraining the associated type `<impl GenericTrait<()> + Foo as GenericTrait<()>>::Associated` to `()`
    |
 LL | fn returns_opaque_generic_foo() -> impl GenericTrait<(), Associated = ()> + Foo {
    |                                                        +++++++++++++++++
 
-error[E0271]: type mismatch resolving `<impl GenericTrait<u8> + GenericTrait<()> as GenericTrait<()>>::Associated == ()`
+error[E0271]: type mismatch resolving `<impl GenericTrait<()> + GenericTrait<u8> as GenericTrait<()>>::Associated == ()`
   --> $DIR/issue-87261.rs:97:5
    |
 LL | fn returns_opaque_generic_duplicate() -> impl GenericTrait<()> + GenericTrait<u8> {
@@ -252,8 +252,8 @@ LL |     accepts_generic_trait(returns_opaque_generic_duplicate());
    |     ^^^^^^^^^^^^^^^^^^^^^ expected `()`, found associated type
    |
    = note:    expected unit type `()`
-           found associated type `<impl GenericTrait<u8> + GenericTrait<()> as GenericTrait<()>>::Associated`
-   = help: consider constraining the associated type `<impl GenericTrait<u8> + GenericTrait<()> as GenericTrait<()>>::Associated` to `()`
+           found associated type `<impl GenericTrait<()> + GenericTrait<u8> as GenericTrait<()>>::Associated`
+   = help: consider constraining the associated type `<impl GenericTrait<()> + GenericTrait<u8> as GenericTrait<()>>::Associated` to `()`
    = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html
 note: required by a bound in `accepts_generic_trait`
   --> $DIR/issue-87261.rs:44:46
diff --git a/src/test/ui/async-await/issue-68112.stderr b/src/test/ui/async-await/issue-68112.stderr
index 28d94b14ac9..4285fbbeceb 100644
--- a/src/test/ui/async-await/issue-68112.stderr
+++ b/src/test/ui/async-await/issue-68112.stderr
@@ -42,15 +42,27 @@ LL |     require_send(send_fut);
    |
    = help: the trait `Sync` is not implemented for `RefCell<i32>`
    = note: required because of the requirements on the impl of `Send` for `Arc<RefCell<i32>>`
-   = note: required because it appears within the type `[static generator@$DIR/issue-68112.rs:47:31: 47:36]`
-   = note: required because it appears within the type `std::future::from_generator::GenFuture<[static generator@$DIR/issue-68112.rs:47:31: 47:36]>`
-   = note: required because it appears within the type `impl Future<Output = Arc<RefCell<i32>>>`
-   = note: required because it appears within the type `impl Future<Output = Arc<RefCell<i32>>>`
-   = note: required because it appears within the type `impl Future<Output = Arc<RefCell<i32>>>`
-   = note: required because it appears within the type `{ResumeTy, impl Future<Output = Arc<RefCell<i32>>>, (), i32, Ready<i32>}`
-   = note: required because it appears within the type `[static generator@$DIR/issue-68112.rs:55:26: 59:6]`
-   = note: required because it appears within the type `std::future::from_generator::GenFuture<[static generator@$DIR/issue-68112.rs:55:26: 59:6]>`
-   = note: required because it appears within the type `impl Future<Output = ()>`
+note: required because it's used within this `async fn` body
+  --> $DIR/issue-68112.rs:47:31
+   |
+LL | async fn ready2<T>(t: T) -> T { t }
+   |                               ^^^^^
+note: required because it appears within the type `impl Future<Output = Arc<RefCell<i32>>>`
+  --> $DIR/issue-68112.rs:48:31
+   |
+LL | fn make_non_send_future2() -> impl Future<Output = Arc<RefCell<i32>>> {
+   |                               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = note: required because it captures the following types: `ResumeTy`, `impl Future<Output = Arc<RefCell<i32>>>`, `()`, `i32`, `Ready<i32>`
+note: required because it's used within this `async` block
+  --> $DIR/issue-68112.rs:55:26
+   |
+LL |       let send_fut = async {
+   |  __________________________^
+LL | |         let non_send_fut = make_non_send_future2();
+LL | |         let _ = non_send_fut.await;
+LL | |         ready(0).await;
+LL | |     };
+   | |_____^
 note: required by a bound in `require_send`
   --> $DIR/issue-68112.rs:11:25
    |
diff --git a/src/test/ui/async-await/issue-70935-complex-spans.drop_tracking.stderr b/src/test/ui/async-await/issue-70935-complex-spans.drop_tracking.stderr
new file mode 100644
index 00000000000..e9b76b19dc4
--- /dev/null
+++ b/src/test/ui/async-await/issue-70935-complex-spans.drop_tracking.stderr
@@ -0,0 +1,40 @@
+error[E0277]: `Sender<i32>` cannot be shared between threads safely
+  --> $DIR/issue-70935-complex-spans.rs:13:45
+   |
+LL | fn foo(tx: std::sync::mpsc::Sender<i32>) -> impl Future + Send {
+   |                                             ^^^^^^^^^^^^^^^^^^ `Sender<i32>` cannot be shared between threads safely
+   |
+   = help: the trait `Sync` is not implemented for `Sender<i32>`
+   = note: required because of the requirements on the impl of `Send` for `&Sender<i32>`
+note: required because it's used within this closure
+  --> $DIR/issue-70935-complex-spans.rs:25:13
+   |
+LL |           baz(|| async{
+   |  _____________^
+LL | |             foo(tx.clone());
+LL | |         }).await;
+   | |_________^
+note: required because it's used within this `async fn` body
+  --> $DIR/issue-70935-complex-spans.rs:9:67
+   |
+LL |   async fn baz<T>(_c: impl FnMut() -> T) where T: Future<Output=()> {
+   |  ___________________________________________________________________^
+LL | |
+LL | | }
+   | |_^
+   = note: required because it captures the following types: `ResumeTy`, `impl for<'r, 's, 't0> Future<Output = ()>`, `()`
+note: required because it's used within this `async` block
+  --> $DIR/issue-70935-complex-spans.rs:23:16
+   |
+LL |       async move {
+   |  ________________^
+LL | |
+LL | |         baz(|| async{
+LL | |             foo(tx.clone());
+LL | |         }).await;
+LL | |     }
+   | |_____^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/async-await/issue-70935-complex-spans.stderr b/src/test/ui/async-await/issue-70935-complex-spans.normal.stderr
index db309938119..2174f260a71 100644
--- a/src/test/ui/async-await/issue-70935-complex-spans.stderr
+++ b/src/test/ui/async-await/issue-70935-complex-spans.normal.stderr
@@ -1,12 +1,12 @@
 error: future cannot be sent between threads safely
-  --> $DIR/issue-70935-complex-spans.rs:10:45
+  --> $DIR/issue-70935-complex-spans.rs:13:45
    |
 LL | fn foo(tx: std::sync::mpsc::Sender<i32>) -> impl Future + Send {
    |                                             ^^^^^^^^^^^^^^^^^^ future created by async block is not `Send`
    |
    = help: the trait `Sync` is not implemented for `Sender<i32>`
 note: future is not `Send` as this value is used across an await
-  --> $DIR/issue-70935-complex-spans.rs:15:11
+  --> $DIR/issue-70935-complex-spans.rs:27:11
    |
 LL |           baz(|| async{
    |  _____________-
@@ -14,9 +14,9 @@ LL | |             foo(tx.clone());
 LL | |         }).await;
    | |         - ^^^^^^ await occurs here, with the value maybe used later
    | |_________|
-   |           has type `[closure@$DIR/issue-70935-complex-spans.rs:13:13: 15:10]` which is not `Send`
+   |           has type `[closure@$DIR/issue-70935-complex-spans.rs:25:13: 27:10]` which is not `Send`
 note: the value is later dropped here
-  --> $DIR/issue-70935-complex-spans.rs:15:17
+  --> $DIR/issue-70935-complex-spans.rs:27:17
    |
 LL |         }).await;
    |                 ^
diff --git a/src/test/ui/async-await/issue-70935-complex-spans.rs b/src/test/ui/async-await/issue-70935-complex-spans.rs
index 2965a7e0654..f45ce1f25ef 100644
--- a/src/test/ui/async-await/issue-70935-complex-spans.rs
+++ b/src/test/ui/async-await/issue-70935-complex-spans.rs
@@ -1,16 +1,28 @@
 // edition:2018
+// revisions: normal drop_tracking
+// [drop_tracking]compile-flags:-Zdrop-tracking
 // #70935: Check if we do not emit snippet
 // with newlines which lead complex diagnostics.
 
 use std::future::Future;
 
 async fn baz<T>(_c: impl FnMut() -> T) where T: Future<Output=()> {
+//[drop_tracking]~^ within this `async fn` body
 }
 
 fn foo(tx: std::sync::mpsc::Sender<i32>) -> impl Future + Send {
-    //~^ ERROR: future cannot be sent between threads safely
+    //[normal]~^ ERROR: future cannot be sent between threads safely
+    //[drop_tracking]~^^ ERROR: `Sender<i32>` cannot be shared
+    //[drop_tracking]~|  NOTE: cannot be shared
+    //[drop_tracking]~|  NOTE: requirements on the impl of `Send`
+    //[drop_tracking]~|  NOTE: captures the following types
+    //[drop_tracking]~|  NOTE: in this expansion
+    //[drop_tracking]~|  NOTE: in this expansion
+    //[drop_tracking]~|  NOTE: in this expansion
+    //[drop_tracking]~|  NOTE: in this expansion
     async move {
-        baz(|| async{
+    //[drop_tracking]~^ within this `async` block
+        baz(|| async{ //[drop_tracking]~ NOTE: used within this closure
             foo(tx.clone());
         }).await;
     }
diff --git a/src/test/ui/async-await/partial-drop-partial-reinit.rs b/src/test/ui/async-await/partial-drop-partial-reinit.rs
index 73f0ca8153c..fe0fce7afd9 100644
--- a/src/test/ui/async-await/partial-drop-partial-reinit.rs
+++ b/src/test/ui/async-await/partial-drop-partial-reinit.rs
@@ -5,9 +5,15 @@
 fn main() {
     gimme_send(foo());
     //~^ ERROR cannot be sent between threads safely
+    //~| NOTE cannot be sent
+    //~| NOTE bound introduced by
+    //~| NOTE appears within the type
+    //~| NOTE captures the following types
 }
 
 fn gimme_send<T: Send>(t: T) {
+//~^ NOTE required by this bound
+//~| NOTE required by a bound
     drop(t);
 }
 
@@ -20,6 +26,8 @@ impl Drop for NotSend {
 impl !Send for NotSend {}
 
 async fn foo() {
+//~^ NOTE used within this `async fn` body
+//~| NOTE within this `impl Future
     let mut x = (NotSend {},);
     drop(x.0);
     x.0 = NotSend {};
diff --git a/src/test/ui/async-await/partial-drop-partial-reinit.stderr b/src/test/ui/async-await/partial-drop-partial-reinit.stderr
index a1c4957e984..05f5358340a 100644
--- a/src/test/ui/async-await/partial-drop-partial-reinit.stderr
+++ b/src/test/ui/async-await/partial-drop-partial-reinit.stderr
@@ -11,13 +11,21 @@ LL | async fn foo() {
    |
    = help: within `impl Future<Output = ()>`, the trait `Send` is not implemented for `NotSend`
    = note: required because it appears within the type `(NotSend,)`
-   = note: required because it appears within the type `{ResumeTy, (NotSend,), impl Future<Output = ()>, ()}`
-   = note: required because it appears within the type `[static generator@$DIR/partial-drop-partial-reinit.rs:22:16: 27:2]`
-   = note: required because it appears within the type `std::future::from_generator::GenFuture<[static generator@$DIR/partial-drop-partial-reinit.rs:22:16: 27:2]>`
-   = note: required because it appears within the type `impl Future<Output = ()>`
-   = note: required because it appears within the type `impl Future<Output = ()>`
+   = note: required because it captures the following types: `ResumeTy`, `(NotSend,)`, `impl Future<Output = ()>`, `()`
+note: required because it's used within this `async fn` body
+  --> $DIR/partial-drop-partial-reinit.rs:28:16
+   |
+LL |   async fn foo() {
+   |  ________________^
+LL | |
+LL | |
+LL | |     let mut x = (NotSend {},);
+...  |
+LL | |     bar().await;
+LL | | }
+   | |_^
 note: required by a bound in `gimme_send`
-  --> $DIR/partial-drop-partial-reinit.rs:10:18
+  --> $DIR/partial-drop-partial-reinit.rs:14:18
    |
 LL | fn gimme_send<T: Send>(t: T) {
    |                  ^^^^ required by this bound in `gimme_send`
diff --git a/src/test/ui/async-await/pin-needed-to-poll.stderr b/src/test/ui/async-await/pin-needed-to-poll.stderr
index c47ec5dddb6..ba22b7aaf98 100644
--- a/src/test/ui/async-await/pin-needed-to-poll.stderr
+++ b/src/test/ui/async-await/pin-needed-to-poll.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `poll` found for struct `Sleep` in the current sco
   --> $DIR/pin-needed-to-poll.rs:42:20
    |
 LL | struct Sleep;
-   | ------------- method `poll` not found for this
+   |        ----- method `poll` not found for this struct
 ...
 LL |         self.sleep.poll(cx)
    |                    ^^^^ method not found in `Sleep`
diff --git a/src/test/ui/backtrace-apple-no-dsymutil.rs b/src/test/ui/backtrace-apple-no-dsymutil.rs
index 492ff6356bc..d32ad11a122 100644
--- a/src/test/ui/backtrace-apple-no-dsymutil.rs
+++ b/src/test/ui/backtrace-apple-no-dsymutil.rs
@@ -1,5 +1,6 @@
 // run-pass
 
+// compile-flags:-Cstrip=none
 // compile-flags:-g -Csplit-debuginfo=unpacked
 // only-macos
 
diff --git a/src/test/ui/backtrace.rs b/src/test/ui/backtrace.rs
index c2d9e222b84..e2ac43fffc9 100644
--- a/src/test/ui/backtrace.rs
+++ b/src/test/ui/backtrace.rs
@@ -5,6 +5,7 @@
 // ignore-sgx no processes
 // ignore-msvc see #62897 and `backtrace-debuginfo.rs` test
 // compile-flags:-g
+// compile-flags:-Cstrip=none
 
 use std::env;
 use std::process::{Command, Stdio};
@@ -43,6 +44,7 @@ fn expected(fn_name: &str) -> String {
     format!(" backtrace::{}", fn_name)
 }
 
+#[cfg(not(panic = "abort"))]
 fn contains_verbose_expected(s: &str, fn_name: &str) -> bool {
     // HACK(eddyb) work around the fact that verbosely demangled stack traces
     // (from `RUST_BACKTRACE=full`, or, as is the case here, panic-in-panic)
diff --git a/src/test/ui/bogus-tag.stderr b/src/test/ui/bogus-tag.stderr
index cb3199e7c88..b215adfa593 100644
--- a/src/test/ui/bogus-tag.stderr
+++ b/src/test/ui/bogus-tag.stderr
@@ -2,7 +2,7 @@ error[E0599]: no variant or associated item named `Hsl` found for enum `Color` i
   --> $DIR/bogus-tag.rs:7:16
    |
 LL | enum Color { Rgb(isize, isize, isize), Rgba(isize, isize, isize, isize), }
-   | ---------- variant or associated item `Hsl` not found here
+   |      ----- variant or associated item `Hsl` not found for this enum
 ...
 LL |         Color::Hsl(h, s, l) => { println!("hsl"); }
    |                ^^^ variant or associated item not found in `Color`
diff --git a/src/test/ui/borrowck/issue-71546.rs b/src/test/ui/borrowck/issue-71546.rs
index b20c39193de..42100edeaa7 100644
--- a/src/test/ui/borrowck/issue-71546.rs
+++ b/src/test/ui/borrowck/issue-71546.rs
@@ -1,4 +1,8 @@
 // Regression test for #71546.
+//
+// Made to pass as part of fixing #98095.
+//
+// check-pass
 
 pub fn serialize_as_csv<V>(value: &V) -> Result<String, &str>
 where
@@ -6,15 +10,7 @@ where
     for<'a> &'a V: IntoIterator,
     for<'a> <&'a V as IntoIterator>::Item: ToString + 'static,
 {
-    let csv_str: String = value
-        //~^ ERROR higher-ranked lifetime error
-        //~| ERROR higher-ranked lifetime error
-        //~| ERROR higher-ranked lifetime error
-        .into_iter()
-        .map(|elem| elem.to_string())
-        //~^ ERROR higher-ranked lifetime error
-        .collect::<String>();
-        //~^ ERROR higher-ranked lifetime error
+    let csv_str: String = value.into_iter().map(|elem| elem.to_string()).collect::<String>();
     Ok(csv_str)
 }
 
diff --git a/src/test/ui/borrowck/issue-71546.stderr b/src/test/ui/borrowck/issue-71546.stderr
deleted file mode 100644
index b8d79f0939b..00000000000
--- a/src/test/ui/borrowck/issue-71546.stderr
+++ /dev/null
@@ -1,59 +0,0 @@
-error: higher-ranked lifetime error
-  --> $DIR/issue-71546.rs:9:27
-   |
-LL |       let csv_str: String = value
-   |  ___________________________^
-LL | |
-LL | |
-LL | |
-LL | |         .into_iter()
-LL | |         .map(|elem| elem.to_string())
-   | |_____________________________________^
-   |
-   = note: could not prove for<'r> [closure@$DIR/issue-71546.rs:14:14: 14:37] well-formed
-
-error: higher-ranked lifetime error
-  --> $DIR/issue-71546.rs:9:27
-   |
-LL |       let csv_str: String = value
-   |  ___________________________^
-LL | |
-LL | |
-LL | |
-LL | |         .into_iter()
-LL | |         .map(|elem| elem.to_string())
-   | |_____________________________________^
-   |
-   = note: could not prove for<'r, 's> Map<<&'r V as IntoIterator>::IntoIter, [closure@$DIR/issue-71546.rs:14:14: 14:37]> well-formed
-
-error: higher-ranked lifetime error
-  --> $DIR/issue-71546.rs:9:27
-   |
-LL |       let csv_str: String = value
-   |  ___________________________^
-LL | |
-LL | |
-LL | |
-...  |
-LL | |
-LL | |         .collect::<String>();
-   | |____________________________^
-   |
-   = note: could not prove for<'r, 's> Map<<&'r V as IntoIterator>::IntoIter, [closure@$DIR/issue-71546.rs:14:14: 14:37]> well-formed
-
-error: higher-ranked lifetime error
-  --> $DIR/issue-71546.rs:14:14
-   |
-LL |         .map(|elem| elem.to_string())
-   |              ^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: could not prove for<'a> <&'a V as IntoIterator>::Item: 'static
-
-error: higher-ranked lifetime error
-  --> $DIR/issue-71546.rs:16:10
-   |
-LL |         .collect::<String>();
-   |          ^^^^^^^
-
-error: aborting due to 5 previous errors
-
diff --git a/src/test/ui/borrowck/issue-81899.stderr b/src/test/ui/borrowck/issue-81899.stderr
index 92ebd5a220d..e7345ff3f9a 100644
--- a/src/test/ui/borrowck/issue-81899.stderr
+++ b/src/test/ui/borrowck/issue-81899.stderr
@@ -27,3 +27,16 @@ LL | const _CONST: &[u8] = &f(&[], |_| {});
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/issue-81899.rs:4:23
+   |
+LL | const _CONST: &[u8] = &f(&[], |_| {});
+   | ----------------------^^^^^^^^^^^^^^^-
+   |                       |
+   |                       referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/borrowck/issue-88434-minimal-example.stderr b/src/test/ui/borrowck/issue-88434-minimal-example.stderr
index d46cd862e34..47d83c65355 100644
--- a/src/test/ui/borrowck/issue-88434-minimal-example.stderr
+++ b/src/test/ui/borrowck/issue-88434-minimal-example.stderr
@@ -27,3 +27,16 @@ LL | const _CONST: &() = &f(&|_| {});
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/issue-88434-minimal-example.rs:3:21
+   |
+LL | const _CONST: &() = &f(&|_| {});
+   | --------------------^^^^^^^^^^^-
+   |                     |
+   |                     referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr b/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr
index e6b07aba74d..b08a7cfc7fe 100644
--- a/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr
+++ b/src/test/ui/borrowck/issue-88434-removal-index-should-be-less.stderr
@@ -27,3 +27,16 @@ LL | const _CONST: &[u8] = &f(&[], |_| {});
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/issue-88434-removal-index-should-be-less.rs:3:23
+   |
+LL | const _CONST: &[u8] = &f(&[], |_| {});
+   | ----------------------^^^^^^^^^^^^^^^-
+   |                       |
+   |                       referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/c-variadic/variadic-ffi-1.stderr b/src/test/ui/c-variadic/variadic-ffi-1.stderr
index 9acf1e93b07..176bec819d6 100644
--- a/src/test/ui/c-variadic/variadic-ffi-1.stderr
+++ b/src/test/ui/c-variadic/variadic-ffi-1.stderr
@@ -17,8 +17,8 @@ LL |     fn foo(f: isize, x: u8, ...);
    |        ^^^
 help: provide the arguments
    |
-LL |         foo({isize}, {u8});
-   |         ~~~~~~~~~~~~~~~~~~
+LL |         foo(/* isize */, /* u8 */);
+   |         ~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0060]: this function takes at least 2 arguments but 1 argument was supplied
   --> $DIR/variadic-ffi-1.rs:21:9
@@ -33,8 +33,8 @@ LL |     fn foo(f: isize, x: u8, ...);
    |        ^^^
 help: provide the argument
    |
-LL |         foo(1, {u8});
-   |         ~~~~~~~~~~~~
+LL |         foo(1, /* u8 */);
+   |         ~~~~~~~~~~~~~~~~
 
 error[E0308]: mismatched types
   --> $DIR/variadic-ffi-1.rs:23:56
diff --git a/src/test/ui/issues/issue-10991.rs b/src/test/ui/cast/issue-10991.rs
index c36829fdf5b..c36829fdf5b 100644
--- a/src/test/ui/issues/issue-10991.rs
+++ b/src/test/ui/cast/issue-10991.rs
diff --git a/src/test/ui/issues/issue-10991.stderr b/src/test/ui/cast/issue-10991.stderr
index 5b8a1823386..5b8a1823386 100644
--- a/src/test/ui/issues/issue-10991.stderr
+++ b/src/test/ui/cast/issue-10991.stderr
diff --git a/src/test/ui/closures/2229_closure_analysis/issue-87987.rs b/src/test/ui/closures/2229_closure_analysis/issue-87987.rs
index d4f243ee347..d26343c33cf 100644
--- a/src/test/ui/closures/2229_closure_analysis/issue-87987.rs
+++ b/src/test/ui/closures/2229_closure_analysis/issue-87987.rs
@@ -2,16 +2,13 @@
 // edition:2021
 
 struct Props {
-    field_1: u32, //~ WARNING: field is never read: `field_1`
-    field_2: u32, //~ WARNING: field is never read: `field_2`
+    field_1: u32, //~ WARNING: fields `field_1` and `field_2` are never read
+    field_2: u32,
 }
 
 fn main() {
     // Test 1
-    let props_2 = Props {
-        field_1: 1,
-        field_2: 1,
-    };
+    let props_2 = Props { field_1: 1, field_2: 1 };
 
     let _ = || {
         let _: Props = props_2;
@@ -23,7 +20,7 @@ fn main() {
     let mref = &mut arr;
 
     let _c = || match arr {
-        [_, _, _, _] => println!("A")
+        [_, _, _, _] => println!("A"),
     };
 
     println!("{:#?}", mref);
diff --git a/src/test/ui/closures/2229_closure_analysis/issue-87987.stderr b/src/test/ui/closures/2229_closure_analysis/issue-87987.stderr
index 5828295fae3..57b8f7ae609 100644
--- a/src/test/ui/closures/2229_closure_analysis/issue-87987.stderr
+++ b/src/test/ui/closures/2229_closure_analysis/issue-87987.stderr
@@ -1,16 +1,14 @@
-warning: field is never read: `field_1`
+warning: fields `field_1` and `field_2` are never read
   --> $DIR/issue-87987.rs:5:5
    |
+LL | struct Props {
+   |        ----- fields in this struct
 LL |     field_1: u32,
    |     ^^^^^^^^^^^^
-   |
-   = note: `#[warn(dead_code)]` on by default
-
-warning: field is never read: `field_2`
-  --> $DIR/issue-87987.rs:6:5
-   |
 LL |     field_2: u32,
    |     ^^^^^^^^^^^^
+   |
+   = note: `#[warn(dead_code)]` on by default
 
-warning: 2 warnings emitted
+warning: 1 warning emitted
 
diff --git a/src/test/ui/closures/2229_closure_analysis/match/issue-87097.rs b/src/test/ui/closures/2229_closure_analysis/match/issue-87097.rs
index 241ddcb83e1..815fc0a719c 100644
--- a/src/test/ui/closures/2229_closure_analysis/match/issue-87097.rs
+++ b/src/test/ui/closures/2229_closure_analysis/match/issue-87097.rs
@@ -3,7 +3,7 @@
 
 enum Variant {
     A,
-    B, //~ WARNING: variant is never constructed: `B`
+    B, //~ WARNING: variant `B` is never constructed
 }
 
 struct A {
diff --git a/src/test/ui/closures/2229_closure_analysis/match/issue-87097.stderr b/src/test/ui/closures/2229_closure_analysis/match/issue-87097.stderr
index 38f2929a05f..2a49ed4b5ff 100644
--- a/src/test/ui/closures/2229_closure_analysis/match/issue-87097.stderr
+++ b/src/test/ui/closures/2229_closure_analysis/match/issue-87097.stderr
@@ -1,6 +1,9 @@
-warning: variant is never constructed: `B`
+warning: variant `B` is never constructed
   --> $DIR/issue-87097.rs:6:5
    |
+LL | enum Variant {
+   |      ------- variant in this enum
+LL |     A,
 LL |     B,
    |     ^
    |
diff --git a/src/test/ui/closures/closure-move-sync.stderr b/src/test/ui/closures/closure-move-sync.stderr
index 618c9a17247..cbc4e2e5231 100644
--- a/src/test/ui/closures/closure-move-sync.stderr
+++ b/src/test/ui/closures/closure-move-sync.stderr
@@ -6,7 +6,15 @@ LL |     let t = thread::spawn(|| {
    |
    = help: the trait `Sync` is not implemented for `std::sync::mpsc::Receiver<()>`
    = note: required because of the requirements on the impl of `Send` for `&std::sync::mpsc::Receiver<()>`
-   = note: required because it appears within the type `[closure@$DIR/closure-move-sync.rs:6:27: 9:6]`
+note: required because it's used within this closure
+  --> $DIR/closure-move-sync.rs:6:27
+   |
+LL |       let t = thread::spawn(|| {
+   |  ___________________________^
+LL | |         recv.recv().unwrap();
+LL | |
+LL | |     });
+   | |_____^
 note: required by a bound in `spawn`
   --> $SRC_DIR/std/src/thread/mod.rs:LL:COL
    |
@@ -21,7 +29,11 @@ LL |     thread::spawn(|| tx.send(()).unwrap());
    |
    = help: the trait `Sync` is not implemented for `Sender<()>`
    = note: required because of the requirements on the impl of `Send` for `&Sender<()>`
-   = note: required because it appears within the type `[closure@$DIR/closure-move-sync.rs:18:19: 18:42]`
+note: required because it's used within this closure
+  --> $DIR/closure-move-sync.rs:18:19
+   |
+LL |     thread::spawn(|| tx.send(()).unwrap());
+   |                   ^^^^^^^^^^^^^^^^^^^^^^^
 note: required by a bound in `spawn`
   --> $SRC_DIR/std/src/thread/mod.rs:LL:COL
    |
diff --git a/src/test/ui/issues/issue-28950.rs b/src/test/ui/codegen/issue-28950.rs
index 8b55f42f3f4..8b55f42f3f4 100644
--- a/src/test/ui/issues/issue-28950.rs
+++ b/src/test/ui/codegen/issue-28950.rs
diff --git a/src/test/ui/issues/issue-63787.rs b/src/test/ui/codegen/issue-63787.rs
index cba079b2315..cba079b2315 100644
--- a/src/test/ui/issues/issue-63787.rs
+++ b/src/test/ui/codegen/issue-63787.rs
diff --git a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
index 91289148079..c364c707ff9 100644
--- a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
+++ b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-negative.stderr
@@ -1,3 +1,15 @@
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:15:1
+   |
+LL | impl !Marker1 for dyn Object + Marker2 { }
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
+
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
+  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:17:1
+   |
+LL | impl !Marker2 for dyn Object + Marker2 { }
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
+
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
   --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:23:1
    |
@@ -21,18 +33,6 @@ error[E0321]: cross-crate traits with a default impl, like `Send`, can only be i
 LL | impl !Send for dyn Object + Marker2 {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
 
-error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
-  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:15:1
-   |
-LL | impl !Marker1 for dyn Object + Marker2 { }
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
-
-error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
-  --> $DIR/coherence-impl-trait-for-marker-trait-negative.rs:17:1
-   |
-LL | impl !Marker2 for dyn Object + Marker2 { }
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
-
 error: aborting due to 5 previous errors
 
 Some errors have detailed explanations: E0117, E0321, E0371.
diff --git a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
index 056198374a4..b80429794f9 100644
--- a/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
+++ b/src/test/ui/coherence/coherence-impl-trait-for-marker-trait-positive.stderr
@@ -1,3 +1,15 @@
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:15:1
+   |
+LL | impl Marker1 for dyn Object + Marker2 { }
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
+
+error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
+  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:17:1
+   |
+LL | impl Marker2 for dyn Object + Marker2 { }
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
+
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
   --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:23:1
    |
@@ -21,18 +33,6 @@ error[E0321]: cross-crate traits with a default impl, like `Send`, can only be i
 LL | unsafe impl Send for dyn Object + Marker2 {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ can't implement cross-crate trait with a default impl for non-struct/enum type
 
-error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker1`
-  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:15:1
-   |
-LL | impl Marker1 for dyn Object + Marker2 { }
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker1`
-
-error[E0371]: the object type `(dyn Object + Marker2 + 'static)` automatically implements the trait `Marker2`
-  --> $DIR/coherence-impl-trait-for-marker-trait-positive.rs:17:1
-   |
-LL | impl Marker2 for dyn Object + Marker2 { }
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `(dyn Object + Marker2 + 'static)` automatically implements trait `Marker2`
-
 error: aborting due to 5 previous errors
 
 Some errors have detailed explanations: E0117, E0321, E0371.
diff --git a/src/test/ui/coherence/coherence-impls-copy.stderr b/src/test/ui/coherence/coherence-impls-copy.stderr
index b3ca354c633..86356af2564 100644
--- a/src/test/ui/coherence/coherence-impls-copy.stderr
+++ b/src/test/ui/coherence/coherence-impls-copy.stderr
@@ -9,49 +9,49 @@ LL | impl Copy for i32 {}
    |
    = note: define and implement a trait or new type instead
 
+error[E0119]: conflicting implementations of trait `std::marker::Copy` for type `&NotSync`
+  --> $DIR/coherence-impls-copy.rs:28:1
+   |
+LL | impl Copy for &'static NotSync {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: conflicting implementation in crate `core`:
+           - impl<T> Copy for &T
+             where T: ?Sized;
+
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-copy.rs:25:1
+  --> $DIR/coherence-impls-copy.rs:33:1
    |
-LL | impl Copy for (MyType, MyType) {}
-   | ^^^^^^^^^^^^^^----------------
+LL | impl Copy for &'static [NotSync] {}
+   | ^^^^^^^^^^^^^^------------------
    | |             |
-   | |             this is not defined in the current crate because tuples are always foreign
+   | |             this is not defined in the current crate because slices are always foreign
    | impl doesn't use only types from inside the current crate
    |
    = note: define and implement a trait or new type instead
 
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-copy.rs:30:1
+  --> $DIR/coherence-impls-copy.rs:25:1
    |
-LL | impl Copy for [MyType] {}
-   | ^^^^^^^^^^^^^^--------
+LL | impl Copy for (MyType, MyType) {}
+   | ^^^^^^^^^^^^^^----------------
    | |             |
-   | |             this is not defined in the current crate because slices are always foreign
+   | |             this is not defined in the current crate because tuples are always foreign
    | impl doesn't use only types from inside the current crate
    |
    = note: define and implement a trait or new type instead
 
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-copy.rs:33:1
+  --> $DIR/coherence-impls-copy.rs:30:1
    |
-LL | impl Copy for &'static [NotSync] {}
-   | ^^^^^^^^^^^^^^------------------
+LL | impl Copy for [MyType] {}
+   | ^^^^^^^^^^^^^^--------
    | |             |
    | |             this is not defined in the current crate because slices are always foreign
    | impl doesn't use only types from inside the current crate
    |
    = note: define and implement a trait or new type instead
 
-error[E0119]: conflicting implementations of trait `std::marker::Copy` for type `&NotSync`
-  --> $DIR/coherence-impls-copy.rs:28:1
-   |
-LL | impl Copy for &'static NotSync {}
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: conflicting implementation in crate `core`:
-           - impl<T> Copy for &T
-             where T: ?Sized;
-
 error[E0206]: the trait `Copy` may not be implemented for this type
   --> $DIR/coherence-impls-copy.rs:21:15
    |
diff --git a/src/test/ui/coherence/coherence-impls-send.stderr b/src/test/ui/coherence/coherence-impls-send.stderr
index dd1fd1b0dce..e1071846e14 100644
--- a/src/test/ui/coherence/coherence-impls-send.stderr
+++ b/src/test/ui/coherence/coherence-impls-send.stderr
@@ -1,4 +1,15 @@
 error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
+  --> $DIR/coherence-impls-send.rs:25:1
+   |
+LL | unsafe impl Send for &'static [NotSync] {}
+   | ^^^^^^^^^^^^^^^^^^^^^------------------
+   | |                    |
+   | |                    this is not defined in the current crate because slices are always foreign
+   | impl doesn't use only types from inside the current crate
+   |
+   = note: define and implement a trait or new type instead
+
+error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
   --> $DIR/coherence-impls-send.rs:16:1
    |
 LL | unsafe impl Send for (MyType, MyType) {}
@@ -26,17 +37,6 @@ LL | unsafe impl Send for [MyType] {}
    |
    = note: define and implement a trait or new type instead
 
-error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-send.rs:25:1
-   |
-LL | unsafe impl Send for &'static [NotSync] {}
-   | ^^^^^^^^^^^^^^^^^^^^^------------------
-   | |                    |
-   | |                    this is not defined in the current crate because slices are always foreign
-   | impl doesn't use only types from inside the current crate
-   |
-   = note: define and implement a trait or new type instead
-
 error: aborting due to 4 previous errors
 
 Some errors have detailed explanations: E0117, E0321.
diff --git a/src/test/ui/coherence/coherence-impls-sized.stderr b/src/test/ui/coherence/coherence-impls-sized.stderr
index e1e4acd4cd8..17a7544521d 100644
--- a/src/test/ui/coherence/coherence-impls-sized.stderr
+++ b/src/test/ui/coherence/coherence-impls-sized.stderr
@@ -1,36 +1,3 @@
-error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-sized.rs:20:1
-   |
-LL | impl Sized for (MyType, MyType) {}
-   | ^^^^^^^^^^^^^^^----------------
-   | |              |
-   | |              this is not defined in the current crate because tuples are always foreign
-   | impl doesn't use only types from inside the current crate
-   |
-   = note: define and implement a trait or new type instead
-
-error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-sized.rs:27:1
-   |
-LL | impl Sized for [MyType] {}
-   | ^^^^^^^^^^^^^^^--------
-   | |              |
-   | |              this is not defined in the current crate because slices are always foreign
-   | impl doesn't use only types from inside the current crate
-   |
-   = note: define and implement a trait or new type instead
-
-error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
-  --> $DIR/coherence-impls-sized.rs:31:1
-   |
-LL | impl Sized for &'static [NotSync] {}
-   | ^^^^^^^^^^^^^^^------------------
-   | |              |
-   | |              this is not defined in the current crate because slices are always foreign
-   | impl doesn't use only types from inside the current crate
-   |
-   = note: define and implement a trait or new type instead
-
 error[E0322]: explicit impls for the `Sized` trait are not permitted
   --> $DIR/coherence-impls-sized.rs:14:1
    |
@@ -49,6 +16,17 @@ error[E0322]: explicit impls for the `Sized` trait are not permitted
 LL | impl Sized for (MyType, MyType) {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl of `Sized` not allowed
 
+error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
+  --> $DIR/coherence-impls-sized.rs:20:1
+   |
+LL | impl Sized for (MyType, MyType) {}
+   | ^^^^^^^^^^^^^^^----------------
+   | |              |
+   | |              this is not defined in the current crate because tuples are always foreign
+   | impl doesn't use only types from inside the current crate
+   |
+   = note: define and implement a trait or new type instead
+
 error[E0322]: explicit impls for the `Sized` trait are not permitted
   --> $DIR/coherence-impls-sized.rs:24:1
    |
@@ -61,12 +39,34 @@ error[E0322]: explicit impls for the `Sized` trait are not permitted
 LL | impl Sized for [MyType] {}
    | ^^^^^^^^^^^^^^^^^^^^^^^ impl of `Sized` not allowed
 
+error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
+  --> $DIR/coherence-impls-sized.rs:27:1
+   |
+LL | impl Sized for [MyType] {}
+   | ^^^^^^^^^^^^^^^--------
+   | |              |
+   | |              this is not defined in the current crate because slices are always foreign
+   | impl doesn't use only types from inside the current crate
+   |
+   = note: define and implement a trait or new type instead
+
 error[E0322]: explicit impls for the `Sized` trait are not permitted
   --> $DIR/coherence-impls-sized.rs:31:1
    |
 LL | impl Sized for &'static [NotSync] {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl of `Sized` not allowed
 
+error[E0117]: only traits defined in the current crate can be implemented for arbitrary types
+  --> $DIR/coherence-impls-sized.rs:31:1
+   |
+LL | impl Sized for &'static [NotSync] {}
+   | ^^^^^^^^^^^^^^^------------------
+   | |              |
+   | |              this is not defined in the current crate because slices are always foreign
+   | impl doesn't use only types from inside the current crate
+   |
+   = note: define and implement a trait or new type instead
+
 error: aborting due to 9 previous errors
 
 Some errors have detailed explanations: E0117, E0322.
diff --git a/src/test/ui/coherence/coherence-with-closure.stderr b/src/test/ui/coherence/coherence-with-closure.stderr
index 20b986cee69..d2ca63fa146 100644
--- a/src/test/ui/coherence/coherence-with-closure.stderr
+++ b/src/test/ui/coherence/coherence-with-closure.stderr
@@ -1,3 +1,12 @@
+error[E0119]: conflicting implementations of trait `Trait` for type `Wrapper<OpaqueClosure>`
+  --> $DIR/coherence-with-closure.rs:12:1
+   |
+LL | impl Trait for Wrapper<OpaqueClosure> {}
+   | ------------------------------------- first implementation here
+LL |
+LL | impl<T: Sync> Trait for Wrapper<T> {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Wrapper<OpaqueClosure>`
+
 error: cannot implement trait on type alias impl trait
   --> $DIR/coherence-with-closure.rs:10:24
    |
@@ -10,15 +19,6 @@ note: type alias impl trait defined here
 LL | type OpaqueClosure = impl Sized;
    |                      ^^^^^^^^^^
 
-error[E0119]: conflicting implementations of trait `Trait` for type `Wrapper<OpaqueClosure>`
-  --> $DIR/coherence-with-closure.rs:12:1
-   |
-LL | impl Trait for Wrapper<OpaqueClosure> {}
-   | ------------------------------------- first implementation here
-LL |
-LL | impl<T: Sync> Trait for Wrapper<T> {}
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Wrapper<OpaqueClosure>`
-
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0119`.
diff --git a/src/test/ui/coherence/coherence-with-generator.stderr b/src/test/ui/coherence/coherence-with-generator.stderr
index 249ad3cb9ec..804bc1c3a6d 100644
--- a/src/test/ui/coherence/coherence-with-generator.stderr
+++ b/src/test/ui/coherence/coherence-with-generator.stderr
@@ -1,3 +1,12 @@
+error[E0119]: conflicting implementations of trait `Trait` for type `Wrapper<OpaqueGenerator>`
+  --> $DIR/coherence-with-generator.rs:16:1
+   |
+LL | impl Trait for Wrapper<OpaqueGenerator> {}
+   | --------------------------------------- first implementation here
+LL |
+LL | impl<T: Sync> Trait for Wrapper<T> {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Wrapper<OpaqueGenerator>`
+
 error: cannot implement trait on type alias impl trait
   --> $DIR/coherence-with-generator.rs:14:24
    |
@@ -10,15 +19,6 @@ note: type alias impl trait defined here
 LL | type OpaqueGenerator = impl Sized;
    |                        ^^^^^^^^^^
 
-error[E0119]: conflicting implementations of trait `Trait` for type `Wrapper<OpaqueGenerator>`
-  --> $DIR/coherence-with-generator.rs:16:1
-   |
-LL | impl Trait for Wrapper<OpaqueGenerator> {}
-   | --------------------------------------- first implementation here
-LL |
-LL | impl<T: Sync> Trait for Wrapper<T> {}
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `Wrapper<OpaqueGenerator>`
-
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0119`.
diff --git a/src/test/ui/confuse-field-and-method/issue-18343.stderr b/src/test/ui/confuse-field-and-method/issue-18343.stderr
index 2f67c11ad1f..a6d4e80a50c 100644
--- a/src/test/ui/confuse-field-and-method/issue-18343.stderr
+++ b/src/test/ui/confuse-field-and-method/issue-18343.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `closure` found for struct `Obj` in the current sc
   --> $DIR/issue-18343.rs:7:7
    |
 LL | struct Obj<F> where F: FnMut() -> u32 {
-   | ------------------------------------- method `closure` not found for this
+   |        --- method `closure` not found for this struct
 ...
 LL |     o.closure();
    |       ^^^^^^^ field, not a method
diff --git a/src/test/ui/confuse-field-and-method/issue-2392.stderr b/src/test/ui/confuse-field-and-method/issue-2392.stderr
index a37e132d364..795d0e286b3 100644
--- a/src/test/ui/confuse-field-and-method/issue-2392.stderr
+++ b/src/test/ui/confuse-field-and-method/issue-2392.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `closure` found for struct `Obj` in the current sc
   --> $DIR/issue-2392.rs:36:15
    |
 LL | struct Obj<F> where F: FnOnce() -> u32 {
-   | -------------------------------------- method `closure` not found for this
+   |        --- method `closure` not found for this struct
 ...
 LL |     o_closure.closure();
    |               ^^^^^^^ field, not a method
@@ -16,7 +16,7 @@ error[E0599]: no method named `not_closure` found for struct `Obj` in the curren
   --> $DIR/issue-2392.rs:38:15
    |
 LL | struct Obj<F> where F: FnOnce() -> u32 {
-   | -------------------------------------- method `not_closure` not found for this
+   |        --- method `not_closure` not found for this struct
 ...
 LL |     o_closure.not_closure();
    |               ^^^^^^^^^^^-- help: remove the arguments
@@ -27,7 +27,7 @@ error[E0599]: no method named `closure` found for struct `Obj` in the current sc
   --> $DIR/issue-2392.rs:42:12
    |
 LL | struct Obj<F> where F: FnOnce() -> u32 {
-   | -------------------------------------- method `closure` not found for this
+   |        --- method `closure` not found for this struct
 ...
 LL |     o_func.closure();
    |            ^^^^^^^ field, not a method
@@ -41,7 +41,7 @@ error[E0599]: no method named `boxed_closure` found for struct `BoxedObj` in the
   --> $DIR/issue-2392.rs:45:14
    |
 LL | struct BoxedObj {
-   | --------------- method `boxed_closure` not found for this
+   |        -------- method `boxed_closure` not found for this struct
 ...
 LL |     boxed_fn.boxed_closure();
    |              ^^^^^^^^^^^^^ field, not a method
@@ -55,7 +55,7 @@ error[E0599]: no method named `boxed_closure` found for struct `BoxedObj` in the
   --> $DIR/issue-2392.rs:48:19
    |
 LL | struct BoxedObj {
-   | --------------- method `boxed_closure` not found for this
+   |        -------- method `boxed_closure` not found for this struct
 ...
 LL |     boxed_closure.boxed_closure();
    |                   ^^^^^^^^^^^^^ field, not a method
@@ -69,7 +69,7 @@ error[E0599]: no method named `closure` found for struct `Obj` in the current sc
   --> $DIR/issue-2392.rs:53:12
    |
 LL | struct Obj<F> where F: FnOnce() -> u32 {
-   | -------------------------------------- method `closure` not found for this
+   |        --- method `closure` not found for this struct
 ...
 LL |     w.wrap.closure();
    |            ^^^^^^^ field, not a method
@@ -83,7 +83,7 @@ error[E0599]: no method named `not_closure` found for struct `Obj` in the curren
   --> $DIR/issue-2392.rs:55:12
    |
 LL | struct Obj<F> where F: FnOnce() -> u32 {
-   | -------------------------------------- method `not_closure` not found for this
+   |        --- method `not_closure` not found for this struct
 ...
 LL |     w.wrap.not_closure();
    |            ^^^^^^^^^^^-- help: remove the arguments
@@ -94,7 +94,7 @@ error[E0599]: no method named `closure` found for struct `Obj` in the current sc
   --> $DIR/issue-2392.rs:58:24
    |
 LL | struct Obj<F> where F: FnOnce() -> u32 {
-   | -------------------------------------- method `closure` not found for this
+   |        --- method `closure` not found for this struct
 ...
 LL |     check_expression().closure();
    |                        ^^^^^^^ field, not a method
@@ -108,7 +108,7 @@ error[E0599]: no method named `f1` found for struct `FuncContainer` in the curre
   --> $DIR/issue-2392.rs:64:31
    |
 LL | struct FuncContainer {
-   | -------------------- method `f1` not found for this
+   |        ------------- method `f1` not found for this struct
 ...
 LL |             (*self.container).f1(1);
    |                               ^^ field, not a method
@@ -122,7 +122,7 @@ error[E0599]: no method named `f2` found for struct `FuncContainer` in the curre
   --> $DIR/issue-2392.rs:65:31
    |
 LL | struct FuncContainer {
-   | -------------------- method `f2` not found for this
+   |        ------------- method `f2` not found for this struct
 ...
 LL |             (*self.container).f2(1);
    |                               ^^ field, not a method
@@ -136,7 +136,7 @@ error[E0599]: no method named `f3` found for struct `FuncContainer` in the curre
   --> $DIR/issue-2392.rs:66:31
    |
 LL | struct FuncContainer {
-   | -------------------- method `f3` not found for this
+   |        ------------- method `f3` not found for this struct
 ...
 LL |             (*self.container).f3(1);
    |                               ^^ field, not a method
diff --git a/src/test/ui/confuse-field-and-method/issue-32128.stderr b/src/test/ui/confuse-field-and-method/issue-32128.stderr
index 50c6fe1e833..cad2697b52e 100644
--- a/src/test/ui/confuse-field-and-method/issue-32128.stderr
+++ b/src/test/ui/confuse-field-and-method/issue-32128.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `example` found for struct `Example` in the curren
   --> $DIR/issue-32128.rs:12:10
    |
 LL | struct Example {
-   | -------------- method `example` not found for this
+   |        ------- method `example` not found for this struct
 ...
 LL |     demo.example(1);
    |          ^^^^^^^ field, not a method
diff --git a/src/test/ui/confuse-field-and-method/private-field.stderr b/src/test/ui/confuse-field-and-method/private-field.stderr
index fd98a864742..9e2f245597a 100644
--- a/src/test/ui/confuse-field-and-method/private-field.stderr
+++ b/src/test/ui/confuse-field-and-method/private-field.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `dog_age` found for struct `Dog` in the current sc
   --> $DIR/private-field.rs:16:23
    |
 LL |     pub struct Dog {
-   |     -------------- method `dog_age` not found for this
+   |                --- method `dog_age` not found for this struct
 ...
 LL |     let dog_age = dog.dog_age();
    |                       ^^^^^^^ private field, not a method
diff --git a/src/test/ui/const-generics/defaults/rp_impl_trait_fail.stderr b/src/test/ui/const-generics/defaults/rp_impl_trait_fail.stderr
index cbe4a4ac0d6..cbc7b93f3a9 100644
--- a/src/test/ui/const-generics/defaults/rp_impl_trait_fail.stderr
+++ b/src/test/ui/const-generics/defaults/rp_impl_trait_fail.stderr
@@ -3,6 +3,9 @@ error[E0277]: the trait bound `Uwu<10_u32, 12_u32>: Trait` is not satisfied
    |
 LL | fn rawr() -> impl Trait {
    |              ^^^^^^^^^^ the trait `Trait` is not implemented for `Uwu<10_u32, 12_u32>`
+LL |
+LL |     Uwu::<10, 12>
+   |     ------------- return type was inferred to be `Uwu<10_u32, 12_u32>` here
    |
    = help: the trait `Trait` is implemented for `Uwu<N>`
 
@@ -11,6 +14,9 @@ error[E0277]: the trait bound `u32: Traitor<N>` is not satisfied
    |
 LL | fn uwu<const N: u8>() -> impl Traitor<N> {
    |                          ^^^^^^^^^^^^^^^ the trait `Traitor<N>` is not implemented for `u32`
+LL |
+LL |     1_u32
+   |     ----- return type was inferred to be `u32` here
    |
    = help: the following other types implement trait `Traitor<N, M>`:
              <u32 as Traitor<N, 2_u8>>
@@ -21,6 +27,9 @@ error[E0277]: the trait bound `u64: Traitor` is not satisfied
    |
 LL | fn owo() -> impl Traitor {
    |             ^^^^^^^^^^^^ the trait `Traitor` is not implemented for `u64`
+LL |
+LL |     1_u64
+   |     ----- return type was inferred to be `u64` here
    |
    = help: the following other types implement trait `Traitor<N, M>`:
              <u32 as Traitor<N, 2_u8>>
diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-69654.stderr b/src/test/ui/const-generics/generic_const_exprs/issue-69654.stderr
index 0ce7640f685..576d037f339 100644
--- a/src/test/ui/const-generics/generic_const_exprs/issue-69654.stderr
+++ b/src/test/ui/const-generics/generic_const_exprs/issue-69654.stderr
@@ -8,7 +8,7 @@ error[E0599]: the function or associated item `foo` exists for struct `Foo<{_: u
   --> $DIR/issue-69654.rs:17:10
    |
 LL | struct Foo<const N: usize> {}
-   | -------------------------- function or associated item `foo` not found for this
+   |        --- function or associated item `foo` not found for this struct
 ...
 LL |     Foo::foo();
    |          ^^^ function or associated item cannot be called on `Foo<{_: usize}>` due to unsatisfied trait bounds
diff --git a/src/test/ui/const-generics/generic_const_exprs/issue-80742.stderr b/src/test/ui/const-generics/generic_const_exprs/issue-80742.stderr
index 56cb11bacbe..7bfc09387b8 100644
--- a/src/test/ui/const-generics/generic_const_exprs/issue-80742.stderr
+++ b/src/test/ui/const-generics/generic_const_exprs/issue-80742.stderr
@@ -15,22 +15,16 @@ LL |     [u8; size_of::<T>() + 1]: ,
 error[E0599]: the function or associated item `new` exists for struct `Inline<dyn Debug>`, but its trait bounds were not satisfied
   --> $DIR/issue-80742.rs:30:36
    |
-LL | / struct Inline<T>
-LL | | where
-LL | |     [u8; size_of::<T>() + 1]: ,
-LL | | {
-LL | |     _phantom: PhantomData<T>,
-LL | |     buf: [u8; size_of::<T>() + 1],
-LL | | }
-   | |_- function or associated item `new` not found for this
+LL | struct Inline<T>
+   |        ------ function or associated item `new` not found for this struct
 ...
-LL |       let dst = Inline::<dyn Debug>::new(0);
-   |                                      ^^^ function or associated item cannot be called on `Inline<dyn Debug>` due to unsatisfied trait bounds
+LL |     let dst = Inline::<dyn Debug>::new(0);
+   |                                    ^^^ function or associated item cannot be called on `Inline<dyn Debug>` due to unsatisfied trait bounds
    |
   ::: $SRC_DIR/core/src/fmt/mod.rs:LL:COL
    |
-LL |   pub trait Debug {
-   |   --------------- doesn't satisfy `dyn Debug: Sized`
+LL | pub trait Debug {
+   | --------------- doesn't satisfy `dyn Debug: Sized`
    |
    = note: the following trait bounds were not satisfied:
            `dyn Debug: Sized`
diff --git a/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr b/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr
index aa5cebd873e..ab53d6cf09a 100644
--- a/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr
+++ b/src/test/ui/const-generics/invalid-const-arg-for-type-param.stderr
@@ -16,7 +16,7 @@ error[E0599]: no method named `f` found for struct `S` in the current scope
   --> $DIR/invalid-const-arg-for-type-param.rs:9:7
    |
 LL | struct S;
-   | --------- method `f` not found for this
+   |        - method `f` not found for this struct
 ...
 LL |     S.f::<0>();
    |       ^ method not found in `S`
diff --git a/src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.stderr b/src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.min.stderr
index f30693221a5..0a7db62472a 100644
--- a/src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.stderr
+++ b/src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.min.stderr
@@ -1,5 +1,5 @@
 error: `&'static [u32]` is forbidden as the type of a const generic parameter
-  --> $DIR/static-reference-array-const-param.rs:1:15
+  --> $DIR/issue-73727-static-reference-array-const-param.rs:9:15
    |
 LL | fn a<const X: &'static [u32]>() {}
    |               ^^^^^^^^^^^^^^
diff --git a/src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.rs b/src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.rs
new file mode 100644
index 00000000000..f0d604835cb
--- /dev/null
+++ b/src/test/ui/const-generics/issues/issue-73727-static-reference-array-const-param.rs
@@ -0,0 +1,14 @@
+// Regression test for #73727
+
+// revisions: full min
+//[full]check-pass
+
+#![cfg_attr(full, feature(adt_const_params))]
+#![cfg_attr(full, allow(incomplete_features))]
+
+fn a<const X: &'static [u32]>() {}
+//[min]~^ ERROR `&'static [u32]` is forbidden as the type of a const generic parameter
+
+fn main() {
+    a::<{&[]}>();
+}
diff --git a/src/test/ui/const-generics/issues/issue-97634.rs b/src/test/ui/const-generics/issues/issue-97634.rs
new file mode 100644
index 00000000000..422e8de6856
--- /dev/null
+++ b/src/test/ui/const-generics/issues/issue-97634.rs
@@ -0,0 +1,10 @@
+// build-pass
+
+pub enum Register<const N: u16> {
+    Field0 = 40,
+    Field1,
+}
+
+fn main() {
+    let _b = Register::<0>::Field1 as u16;
+}
diff --git a/src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.rs b/src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.rs
deleted file mode 100644
index 7518dc59e59..00000000000
--- a/src/test/ui/const-generics/min_const_generics/static-reference-array-const-param.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-fn a<const X: &'static [u32]>() {}
-//~^ ERROR `&'static [u32]` is forbidden as the type of a const generic parameter
-
-fn main() {
-    a::<{&[]}>();
-}
diff --git a/src/test/ui/consts/assert-type-intrinsics.stderr b/src/test/ui/consts/assert-type-intrinsics.stderr
index bb57ee82cc1..89f8f2ffc55 100644
--- a/src/test/ui/consts/assert-type-intrinsics.stderr
+++ b/src/test/ui/consts/assert-type-intrinsics.stderr
@@ -37,3 +37,45 @@ LL | |     };
 
 error: aborting due to 3 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/assert-type-intrinsics.rs:14:9
+   |
+LL | /     const _BAD1: () = unsafe {
+LL | |         MaybeUninit::<!>::uninit().assume_init();
+   | |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ aborted execution: attempted to instantiate uninhabited type `!`
+LL | |     };
+   | |______-
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/assert-type-intrinsics.rs:17:9
+   |
+LL | /     const _BAD2: () = unsafe {
+LL | |         intrinsics::assert_uninit_valid::<bool>();
+   | |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ aborted execution: attempted to leave type `bool` uninitialized, which is invalid
+LL | |     };
+   | |______-
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/assert-type-intrinsics.rs:20:9
+   |
+LL | /     const _BAD3: () = unsafe {
+LL | |         intrinsics::assert_zero_valid::<&'static i32>();
+   | |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ aborted execution: attempted to zero-initialize type `&i32`, which is invalid
+LL | |     };
+   | |______-
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/assoc_const_generic_impl.stderr b/src/test/ui/consts/assoc_const_generic_impl.stderr
index 96cb904fa1b..cccf62a8ff6 100644
--- a/src/test/ui/consts/assoc_const_generic_impl.stderr
+++ b/src/test/ui/consts/assoc_const_generic_impl.stderr
@@ -22,3 +22,20 @@ LL |         let () = Self::I_AM_ZERO_SIZED;
 
 error: aborting due to previous error; 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/assoc_const_generic_impl.rs:11:34
+   |
+LL |     const I_AM_ZERO_SIZED: ()  = [()][std::mem::size_of::<Self>()];
+   |     -----------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                  |
+   |                                  index out of bounds: the length is 1 but the index is 4
+   |
+note: the lint level is defined here
+  --> $DIR/assoc_const_generic_impl.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-err-early.stderr b/src/test/ui/consts/const-err-early.stderr
index 2b3d8817387..385e770eb4f 100644
--- a/src/test/ui/consts/const-err-early.stderr
+++ b/src/test/ui/consts/const-err-early.stderr
@@ -60,3 +60,88 @@ LL | pub const E: u8 = [5u8][1];
 
 error: aborting due to 5 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:3:19
+   |
+LL | pub const A: i8 = -i8::MIN;
+   | ------------------^^^^^^^^-
+   |                   |
+   |                   attempt to negate `i8::MIN`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-early.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:5:19
+   |
+LL | pub const B: u8 = 200u8 + 200u8;
+   | ------------------^^^^^^^^^^^^^-
+   |                   |
+   |                   attempt to compute `200_u8 + 200_u8`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-early.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:7:19
+   |
+LL | pub const C: u8 = 200u8 * 4;
+   | ------------------^^^^^^^^^-
+   |                   |
+   |                   attempt to compute `200_u8 * 4_u8`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-early.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:9:19
+   |
+LL | pub const D: u8 = 42u8 - (42u8 + 1);
+   | ------------------^^^^^^^^^^^^^^^^^-
+   |                   |
+   |                   attempt to compute `42_u8 - 43_u8`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-early.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-early.rs:11:19
+   |
+LL | pub const E: u8 = [5u8][1];
+   | ------------------^^^^^^^^-
+   |                   |
+   |                   index out of bounds: the length is 1 but the index is 1
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-early.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-err-multi.stderr b/src/test/ui/consts/const-err-multi.stderr
index c8172e83d10..a195459ff08 100644
--- a/src/test/ui/consts/const-err-multi.stderr
+++ b/src/test/ui/consts/const-err-multi.stderr
@@ -49,3 +49,71 @@ LL | pub const D: i8 = 50 - A;
 
 error: aborting due to 4 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:3:19
+   |
+LL | pub const A: i8 = -i8::MIN;
+   | ------------------^^^^^^^^-
+   |                   |
+   |                   attempt to negate `i8::MIN`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-multi.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:6:19
+   |
+LL | pub const B: i8 = A;
+   | ------------------^-
+   |                   |
+   |                   referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-multi.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:9:19
+   |
+LL | pub const C: u8 = A as u8;
+   | ------------------^-------
+   |                   |
+   |                   referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-multi.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-err-multi.rs:12:24
+   |
+LL | pub const D: i8 = 50 - A;
+   | -----------------------^-
+   |                        |
+   |                        referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/const-err-multi.rs:1:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-err.stderr b/src/test/ui/consts/const-err.stderr
index 0c963874a84..3b03e702dc4 100644
--- a/src/test/ui/consts/const-err.stderr
+++ b/src/test/ui/consts/const-err.stderr
@@ -29,3 +29,20 @@ LL |     black_box((FOO, FOO));
 error: aborting due to 2 previous errors; 1 warning emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const-err.rs:11:17
+   |
+LL | const FOO: u8 = [5u8][1];
+   | ----------------^^^^^^^^-
+   |                 |
+   |                 index out of bounds: the length is 1 but the index is 1
+   |
+note: the lint level is defined here
+  --> $DIR/const-err.rs:5:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/conditional_array_execution.stderr b/src/test/ui/consts/const-eval/conditional_array_execution.stderr
index 9dc40030a6f..f88bf445426 100644
--- a/src/test/ui/consts/const-eval/conditional_array_execution.stderr
+++ b/src/test/ui/consts/const-eval/conditional_array_execution.stderr
@@ -33,3 +33,36 @@ LL |     println!("{}", FOO);
 error: aborting due to previous error; 2 warnings emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/conditional_array_execution.rs:7:19
+   |
+LL | const FOO: u32 = [X - Y, Y - X][(X < Y) as usize];
+   | ------------------^^^^^---------------------------
+   |                   |
+   |                   attempt to compute `5_u32 - 6_u32`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/conditional_array_execution.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: erroneous constant used
+  --> $DIR/conditional_array_execution.rs:12:20
+   |
+LL |     println!("{}", FOO);
+   |                    ^^^ referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/conditional_array_execution.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this warning originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr b/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr
index 26728cf5415..1c74b978827 100644
--- a/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr
+++ b/src/test/ui/consts/const-eval/const-eval-overflow-2.stderr
@@ -12,3 +12,20 @@ LL |         NEG_NEG_128 => println!("A"),
 
 error: aborting due to 2 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const-eval-overflow-2.rs:11:25
+   |
+LL | const NEG_NEG_128: i8 = -NEG_128;
+   | ------------------------^^^^^^^^-
+   |                         |
+   |                         attempt to negate `i8::MIN`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow-2.rs:4:36
+   |
+LL | #![allow(unused_imports, warnings, const_err)]
+   |                                    ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/const-eval-overflow2.stderr b/src/test/ui/consts/const-eval/const-eval-overflow2.stderr
index 66e86c352d1..948ead521ea 100644
--- a/src/test/ui/consts/const-eval/const-eval-overflow2.stderr
+++ b/src/test/ui/consts/const-eval/const-eval-overflow2.stderr
@@ -107,3 +107,153 @@ LL | |      );
 
 error: aborting due to 8 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:14:6
+   |
+LL | / const VALS_I8: (i8,) =
+LL | |     (
+LL | |      i8::MIN - 1,
+   | |      ^^^^^^^^^^^ attempt to compute `i8::MIN - 1_i8`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:21:6
+   |
+LL | / const VALS_I16: (i16,) =
+LL | |     (
+LL | |      i16::MIN - 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `i16::MIN - 1_i16`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:28:6
+   |
+LL | / const VALS_I32: (i32,) =
+LL | |     (
+LL | |      i32::MIN - 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `i32::MIN - 1_i32`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:35:6
+   |
+LL | / const VALS_I64: (i64,) =
+LL | |     (
+LL | |      i64::MIN - 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `i64::MIN - 1_i64`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:42:6
+   |
+LL | / const VALS_U8: (u8,) =
+LL | |     (
+LL | |      u8::MIN - 1,
+   | |      ^^^^^^^^^^^ attempt to compute `0_u8 - 1_u8`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:48:6
+   |
+LL | / const VALS_U16: (u16,) = (
+LL | |      u16::MIN - 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `0_u16 - 1_u16`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:54:6
+   |
+LL | / const VALS_U32: (u32,) = (
+LL | |      u32::MIN - 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `0_u32 - 1_u32`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2.rs:61:6
+   |
+LL | / const VALS_U64: (u64,) =
+LL | |     (
+LL | |      u64::MIN - 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `0_u64 - 1_u64`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr b/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr
index 3401ba47765..5db6a49a98b 100644
--- a/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr
+++ b/src/test/ui/consts/const-eval/const-eval-overflow2b.stderr
@@ -107,3 +107,153 @@ LL | |      );
 
 error: aborting due to 8 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:14:6
+   |
+LL | / const VALS_I8: (i8,) =
+LL | |     (
+LL | |      i8::MAX + 1,
+   | |      ^^^^^^^^^^^ attempt to compute `i8::MAX + 1_i8`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:21:6
+   |
+LL | / const VALS_I16: (i16,) =
+LL | |     (
+LL | |      i16::MAX + 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `i16::MAX + 1_i16`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:28:6
+   |
+LL | / const VALS_I32: (i32,) =
+LL | |     (
+LL | |      i32::MAX + 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `i32::MAX + 1_i32`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:35:6
+   |
+LL | / const VALS_I64: (i64,) =
+LL | |     (
+LL | |      i64::MAX + 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `i64::MAX + 1_i64`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:42:6
+   |
+LL | / const VALS_U8: (u8,) =
+LL | |     (
+LL | |      u8::MAX + 1,
+   | |      ^^^^^^^^^^^ attempt to compute `u8::MAX + 1_u8`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:48:6
+   |
+LL | / const VALS_U16: (u16,) = (
+LL | |      u16::MAX + 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `u16::MAX + 1_u16`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:54:6
+   |
+LL | / const VALS_U32: (u32,) = (
+LL | |      u32::MAX + 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `u32::MAX + 1_u32`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2b.rs:61:6
+   |
+LL | / const VALS_U64: (u64,) =
+LL | |     (
+LL | |      u64::MAX + 1,
+   | |      ^^^^^^^^^^^^ attempt to compute `u64::MAX + 1_u64`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2b.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr b/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr
index 93c64090f0e..ec3f3c11059 100644
--- a/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr
+++ b/src/test/ui/consts/const-eval/const-eval-overflow2c.stderr
@@ -107,3 +107,153 @@ LL | |      );
 
 error: aborting due to 8 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:14:6
+   |
+LL | / const VALS_I8: (i8,) =
+LL | |     (
+LL | |      i8::MIN * 2,
+   | |      ^^^^^^^^^^^ attempt to compute `i8::MIN * 2_i8`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:21:6
+   |
+LL | / const VALS_I16: (i16,) =
+LL | |     (
+LL | |      i16::MIN * 2,
+   | |      ^^^^^^^^^^^^ attempt to compute `i16::MIN * 2_i16`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:28:6
+   |
+LL | / const VALS_I32: (i32,) =
+LL | |     (
+LL | |      i32::MIN * 2,
+   | |      ^^^^^^^^^^^^ attempt to compute `i32::MIN * 2_i32`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:35:6
+   |
+LL | / const VALS_I64: (i64,) =
+LL | |     (
+LL | |      i64::MIN * 2,
+   | |      ^^^^^^^^^^^^ attempt to compute `i64::MIN * 2_i64`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:42:6
+   |
+LL | / const VALS_U8: (u8,) =
+LL | |     (
+LL | |      u8::MAX * 2,
+   | |      ^^^^^^^^^^^ attempt to compute `u8::MAX * 2_u8`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:48:6
+   |
+LL | / const VALS_U16: (u16,) = (
+LL | |      u16::MAX * 2,
+   | |      ^^^^^^^^^^^^ attempt to compute `u16::MAX * 2_u16`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:54:6
+   |
+LL | / const VALS_U32: (u32,) = (
+LL | |      u32::MAX * 2,
+   | |      ^^^^^^^^^^^^ attempt to compute `u32::MAX * 2_u32`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-eval-overflow2c.rs:61:6
+   |
+LL | / const VALS_U64: (u64,) =
+LL | |     (
+LL | |      u64::MAX * 2,
+   | |      ^^^^^^^^^^^^ attempt to compute `u64::MAX * 2_u64`, which would overflow
+LL | |      );
+   | |_______-
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-overflow2c.rs:8:9
+   |
+LL | #![deny(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/const-eval-query-stack.stderr b/src/test/ui/consts/const-eval/const-eval-query-stack.stderr
index b74d5a2722b..bbec2a830e6 100644
--- a/src/test/ui/consts/const-eval/const-eval-query-stack.stderr
+++ b/src/test/ui/consts/const-eval/const-eval-query-stack.stderr
@@ -35,3 +35,31 @@ query stack during panic:
 #1 [optimized_mir] optimizing MIR for `main`
 #2 [collect_and_partition_mono_items] collect_and_partition_mono_items
 end of query stack
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const-eval-query-stack.rs:19:16
+   |
+LL | const X: i32 = 1 / 0;
+   | ---------------^^^^^-
+   |                |
+   |                attempt to divide `1_i32` by zero
+   |
+note: the lint level is defined here
+  --> $DIR/const-eval-query-stack.rs:18:8
+   |
+LL | #[warn(const_err)]
+   |        ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/const-eval-query-stack.rs:23:27
+   |
+LL |     let x: &'static i32 = &X;
+   |                           ^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/const-pointer-values-in-various-types.64bit.stderr b/src/test/ui/consts/const-eval/const-pointer-values-in-various-types.64bit.stderr
index c19f6342b5b..b004637fd83 100644
--- a/src/test/ui/consts/const-eval/const-pointer-values-in-various-types.64bit.stderr
+++ b/src/test/ui/consts/const-eval/const-pointer-values-in-various-types.64bit.stderr
@@ -321,3 +321,354 @@ LL |     const STR_CHAR_UNION: char = unsafe { Nonsense { stringy: "3" }.charact
 error: aborting due to 29 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:26:49
+   |
+LL |     const I32_REF_USIZE_UNION: usize = unsafe { Nonsense { int_32_ref: &3 }.u };
+   |     --------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                                 |
+   |                                                 unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:30:43
+   |
+LL |     const I32_REF_U8_UNION: u8 = unsafe { Nonsense { int_32_ref: &3 }.uint_8 };
+   |     --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                           |
+   |                                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:34:45
+   |
+LL |     const I32_REF_U16_UNION: u16 = unsafe { Nonsense { int_32_ref: &3 }.uint_16 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:38:45
+   |
+LL |     const I32_REF_U32_UNION: u32 = unsafe { Nonsense { int_32_ref: &3 }.uint_32 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:42:45
+   |
+LL |     const I32_REF_U64_UNION: u64 = unsafe { Nonsense { int_32_ref: &3 }.uint_64 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:49:43
+   |
+LL |     const I32_REF_I8_UNION: i8 = unsafe { Nonsense { int_32_ref: &3 }.int_8 };
+   |     --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                           |
+   |                                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:53:45
+   |
+LL |     const I32_REF_I16_UNION: i16 = unsafe { Nonsense { int_32_ref: &3 }.int_16 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:57:45
+   |
+LL |     const I32_REF_I32_UNION: i32 = unsafe { Nonsense { int_32_ref: &3 }.int_32 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:61:45
+   |
+LL |     const I32_REF_I64_UNION: i64 = unsafe { Nonsense { int_32_ref: &3 }.int_64 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:68:45
+   |
+LL |     const I32_REF_F32_UNION: f32 = unsafe { Nonsense { int_32_ref: &3 }.float_32 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:72:45
+   |
+LL |     const I32_REF_F64_UNION: f64 = unsafe { Nonsense { int_32_ref: &3 }.float_64 };
+   |     ----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                             |
+   |                                             unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:76:47
+   |
+LL |     const I32_REF_BOOL_UNION: bool = unsafe { Nonsense { int_32_ref: &3 }.truthy_falsey };
+   |     ------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                               |
+   |                                               unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:80:47
+   |
+LL |     const I32_REF_CHAR_UNION: char = unsafe { Nonsense { int_32_ref: &3 }.character };
+   |     ------------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                               |
+   |                                               unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:84:39
+   |
+LL |     const STR_U8_UNION: u8 = unsafe { Nonsense { stringy: "3" }.uint_8 };
+   |     ----------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                       |
+   |                                       unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:88:41
+   |
+LL |     const STR_U16_UNION: u16 = unsafe { Nonsense { stringy: "3" }.uint_16 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:92:41
+   |
+LL |     const STR_U32_UNION: u32 = unsafe { Nonsense { stringy: "3" }.uint_32 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:96:41
+   |
+LL |     const STR_U64_UNION: u64 = unsafe { Nonsense { stringy: "3" }.uint_64 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:100:43
+   |
+LL |     const STR_U128_UNION: u128 = unsafe { Nonsense { stringy: "3" }.uint_128 };
+   |     --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                           |
+   |                                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:104:39
+   |
+LL |     const STR_I8_UNION: i8 = unsafe { Nonsense { stringy: "3" }.int_8 };
+   |     ----------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                       |
+   |                                       unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:108:41
+   |
+LL |     const STR_I16_UNION: i16 = unsafe { Nonsense { stringy: "3" }.int_16 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:112:41
+   |
+LL |     const STR_I32_UNION: i32 = unsafe { Nonsense { stringy: "3" }.int_32 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:116:41
+   |
+LL |     const STR_I64_UNION: i64 = unsafe { Nonsense { stringy: "3" }.int_64 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:120:43
+   |
+LL |     const STR_I128_UNION: i128 = unsafe { Nonsense { stringy: "3" }.int_128 };
+   |     --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                           |
+   |                                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:124:41
+   |
+LL |     const STR_F32_UNION: f32 = unsafe { Nonsense { stringy: "3" }.float_32 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:128:41
+   |
+LL |     const STR_F64_UNION: f64 = unsafe { Nonsense { stringy: "3" }.float_64 };
+   |     ------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                         |
+   |                                         unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:132:43
+   |
+LL |     const STR_BOOL_UNION: bool = unsafe { Nonsense { stringy: "3" }.truthy_falsey };
+   |     --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                           |
+   |                                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-pointer-values-in-various-types.rs:136:43
+   |
+LL |     const STR_CHAR_UNION: char = unsafe { Nonsense { stringy: "3" }.character };
+   |     --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                           |
+   |                                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr
index c17166263ba..daf3d8927c1 100644
--- a/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr
+++ b/src/test/ui/consts/const-eval/const_fn_ptr_fail2.stderr
@@ -21,3 +21,79 @@ LL |     x(y)
 error: aborting due to 2 previous errors; 1 warning emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_fn_ptr_fail2.rs:12:5
+   |
+LL |     x(y)
+   |     ^^^^
+   |     |
+   |     calling non-const function `double`
+   |     inside `bar` at $DIR/const_fn_ptr_fail2.rs:12:5
+   |     inside `Y` at $DIR/const_fn_ptr_fail2.rs:15:18
+...
+LL | const Y: usize = bar(X, 2); // FIXME: should fail to typeck someday
+   | ---------------------------
+   |
+note: the lint level is defined here
+  --> $DIR/const_fn_ptr_fail2.rs:4:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_fn_ptr_fail2.rs:12:5
+   |
+LL |     x(y)
+   |     ^^^^
+   |     |
+   |     calling non-const function `double`
+   |     inside `bar` at $DIR/const_fn_ptr_fail2.rs:12:5
+   |     inside `Z` at $DIR/const_fn_ptr_fail2.rs:16:18
+...
+LL | const Z: usize = bar(double, 2); // FIXME: should fail to typeck someday
+   | --------------------------------
+   |
+note: the lint level is defined here
+  --> $DIR/const_fn_ptr_fail2.rs:4:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: erroneous constant used
+  --> $DIR/const_fn_ptr_fail2.rs:19:5
+   |
+LL |     assert_eq!(Y, 4);
+   |     ^^^^^^^^^^^^^^^^ referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/const_fn_ptr_fail2.rs:4:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this warning originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+Future breakage diagnostic:
+warning: erroneous constant used
+  --> $DIR/const_fn_ptr_fail2.rs:21:5
+   |
+LL |     assert_eq!(Z, 4);
+   |     ^^^^^^^^^^^^^^^^ referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/const_fn_ptr_fail2.rs:4:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this warning originates in the macro `assert_eq` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/consts/const-eval/erroneous-const.stderr b/src/test/ui/consts/const-eval/erroneous-const.stderr
index 7e2a60929c7..9057b58ded9 100644
--- a/src/test/ui/consts/const-eval/erroneous-const.stderr
+++ b/src/test/ui/consts/const-eval/erroneous-const.stderr
@@ -41,3 +41,20 @@ LL | pub static FOO: () = no_codegen::<i32>();
 error: aborting due to previous error; 2 warnings emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/erroneous-const.rs:6:22
+   |
+LL |     const VOID: () = [()][2];
+   |     -----------------^^^^^^^-
+   |                      |
+   |                      index out of bounds: the length is 1 but the index is 2
+   |
+note: the lint level is defined here
+  --> $DIR/erroneous-const.rs:2:9
+   |
+LL | #![warn(const_err, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/erroneous-const2.stderr b/src/test/ui/consts/const-eval/erroneous-const2.stderr
index 813d3ee249f..bf6cc8410a7 100644
--- a/src/test/ui/consts/const-eval/erroneous-const2.stderr
+++ b/src/test/ui/consts/const-eval/erroneous-const2.stderr
@@ -35,3 +35,20 @@ LL |         let _ = PrintName::<i32>::VOID;
 error: aborting due to previous error; 2 warnings emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/erroneous-const2.rs:6:22
+   |
+LL |     const VOID: () = [()][2];
+   |     -----------------^^^^^^^-
+   |                      |
+   |                      index out of bounds: the length is 1 but the index is 2
+   |
+note: the lint level is defined here
+  --> $DIR/erroneous-const2.rs:2:9
+   |
+LL | #![warn(const_err, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/format.rs b/src/test/ui/consts/const-eval/format.rs
new file mode 100644
index 00000000000..e43633da3cc
--- /dev/null
+++ b/src/test/ui/consts/const-eval/format.rs
@@ -0,0 +1,21 @@
+const fn failure() {
+    panic!("{:?}", 0);
+    //~^ ERROR cannot call non-const formatting macro in constant functions
+    //~| ERROR erroneous constant used
+    //~| ERROR erroneous constant used
+    //~| WARN this was previously accepted by the compiler
+    //~| WARN this was previously accepted by the compiler
+}
+
+const fn print() {
+    println!("{:?}", 0);
+    //~^ ERROR cannot call non-const formatting macro in constant functions
+    //~| ERROR `Arguments::<'a>::new_v1` is not yet stable as a const fn
+    //~| ERROR cannot call non-const fn `_print` in constant functions
+    //~| ERROR erroneous constant used
+    //~| ERROR erroneous constant used
+    //~| WARN this was previously accepted by the compiler
+    //~| WARN this was previously accepted by the compiler
+}
+
+fn main() {}
diff --git a/src/test/ui/consts/const-eval/format.stderr b/src/test/ui/consts/const-eval/format.stderr
new file mode 100644
index 00000000000..b00cadcea99
--- /dev/null
+++ b/src/test/ui/consts/const-eval/format.stderr
@@ -0,0 +1,124 @@
+error[E0015]: cannot call non-const formatting macro in constant functions
+  --> $DIR/format.rs:2:20
+   |
+LL |     panic!("{:?}", 0);
+   |                    ^
+   |
+   = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
+   = note: this error originates in the macro `$crate::const_format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0015]: cannot call non-const formatting macro in constant functions
+  --> $DIR/format.rs:11:22
+   |
+LL |     println!("{:?}", 0);
+   |                      ^
+   |
+   = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
+   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: `Arguments::<'a>::new_v1` is not yet stable as a const fn
+  --> $DIR/format.rs:11:5
+   |
+LL |     println!("{:?}", 0);
+   |     ^^^^^^^^^^^^^^^^^^^
+   |
+   = help: add `#![feature(const_fmt_arguments_new)]` to the crate attributes to enable
+   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error[E0015]: cannot call non-const fn `_print` in constant functions
+  --> $DIR/format.rs:11:5
+   |
+LL |     println!("{:?}", 0);
+   |     ^^^^^^^^^^^^^^^^^^^
+   |
+   = note: calls in constant functions are limited to constant functions, tuple structs and tuple variants
+   = note: this error originates in the macro `println` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: erroneous constant used
+  --> $DIR/format.rs:2:12
+   |
+LL |     panic!("{:?}", 0);
+   |            ^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+error: erroneous constant used
+  --> $DIR/format.rs:2:20
+   |
+LL |     panic!("{:?}", 0);
+   |                    ^ referenced constant has errors
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `$crate::const_format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: erroneous constant used
+  --> $DIR/format.rs:11:14
+   |
+LL |     println!("{:?}", 0);
+   |              ^^^^^^ referenced constant has errors
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+error: erroneous constant used
+  --> $DIR/format.rs:11:22
+   |
+LL |     println!("{:?}", 0);
+   |                      ^ referenced constant has errors
+   |
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 8 previous errors
+
+For more information about this error, try `rustc --explain E0015`.
+Future incompatibility report: Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/format.rs:2:12
+   |
+LL |     panic!("{:?}", 0);
+   |            ^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/format.rs:2:20
+   |
+LL |     panic!("{:?}", 0);
+   |                    ^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `$crate::const_format_args` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/format.rs:11:14
+   |
+LL |     println!("{:?}", 0);
+   |              ^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/format.rs:11:22
+   |
+LL |     println!("{:?}", 0);
+   |                      ^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr b/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr
index 73664fa49d1..7b3e46fccca 100644
--- a/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr
+++ b/src/test/ui/consts/const-eval/index-out-of-bounds-never-type.stderr
@@ -22,3 +22,20 @@ LL |     let _ = PrintName::<T>::VOID;
 
 error: aborting due to previous error; 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/index-out-of-bounds-never-type.rs:10:61
+   |
+LL |     const VOID: ! = { let x = 0 * std::mem::size_of::<T>(); [][x] };
+   |     --------------------------------------------------------^^^^^---
+   |                                                             |
+   |                                                             index out of bounds: the length is 0 but the index is 0
+   |
+note: the lint level is defined here
+  --> $DIR/index-out-of-bounds-never-type.rs:4:9
+   |
+LL | #![warn(const_err, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/issue-43197.stderr b/src/test/ui/consts/const-eval/issue-43197.stderr
index 32ab7c74b89..53ed32638ce 100644
--- a/src/test/ui/consts/const-eval/issue-43197.stderr
+++ b/src/test/ui/consts/const-eval/issue-43197.stderr
@@ -60,3 +60,69 @@ LL |     println!("{} {}", X, Y);
 error: aborting due to 2 previous errors; 4 warnings emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/issue-43197.rs:10:20
+   |
+LL |     const X: u32 = 0 - 1;
+   |     ---------------^^^^^-
+   |                    |
+   |                    attempt to compute `0_u32 - 1_u32`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/issue-43197.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/issue-43197.rs:13:24
+   |
+LL |     const Y: u32 = foo(0 - 1);
+   |     -------------------^^^^^--
+   |                        |
+   |                        attempt to compute `0_u32 - 1_u32`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/issue-43197.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: erroneous constant used
+  --> $DIR/issue-43197.rs:16:23
+   |
+LL |     println!("{} {}", X, Y);
+   |                       ^ referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/issue-43197.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this warning originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+Future breakage diagnostic:
+warning: erroneous constant used
+  --> $DIR/issue-43197.rs:16:26
+   |
+LL |     println!("{} {}", X, Y);
+   |                          ^ referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/issue-43197.rs:3:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this warning originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/consts/const-eval/issue-44578.stderr b/src/test/ui/consts/const-eval/issue-44578.stderr
index bff9f40f82b..5ecdb7ef556 100644
--- a/src/test/ui/consts/const-eval/issue-44578.stderr
+++ b/src/test/ui/consts/const-eval/issue-44578.stderr
@@ -7,3 +7,36 @@ LL |     println!("{}", <Bar<u16, u8> as Foo>::AMT);
 error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/issue-44578.rs:15:24
+   |
+LL |     const AMT: usize = [A::AMT][(A::AMT > B::AMT) as usize];
+   |     -------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                        |
+   |                        index out of bounds: the length is 1 but the index is 1
+   |
+note: the lint level is defined here
+  --> $DIR/issue-44578.rs:3:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: erroneous constant used
+  --> $DIR/issue-44578.rs:27:20
+   |
+LL |     println!("{}", <Bar<u16, u8> as Foo>::AMT);
+   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
+   |
+note: the lint level is defined here
+  --> $DIR/issue-44578.rs:3:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this warning originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/consts/const-eval/issue-50814-2.stderr b/src/test/ui/consts/const-eval/issue-50814-2.stderr
index 298f0a4a446..67af3b2b1d3 100644
--- a/src/test/ui/consts/const-eval/issue-50814-2.stderr
+++ b/src/test/ui/consts/const-eval/issue-50814-2.stderr
@@ -25,3 +25,16 @@ LL |     println!("{:x}", foo::<()>() as *const usize as usize);
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/issue-50814-2.rs:14:24
+   |
+LL |     const BAR: usize = [5, 6, 7][T::BOO];
+   |     -------------------^^^^^^^^^^^^^^^^^-
+   |                        |
+   |                        index out of bounds: the length is 3 but the index is 42
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/issue-50814.stderr b/src/test/ui/consts/const-eval/issue-50814.stderr
index 87bea28e763..b82bc9ca2f8 100644
--- a/src/test/ui/consts/const-eval/issue-50814.stderr
+++ b/src/test/ui/consts/const-eval/issue-50814.stderr
@@ -25,3 +25,16 @@ LL |     foo(0);
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/issue-50814.rs:15:21
+   |
+LL |     const MAX: u8 = A::MAX + B::MAX;
+   |     ----------------^^^^^^^^^^^^^^^-
+   |                     |
+   |                     attempt to compute `u8::MAX + u8::MAX`, which would overflow
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/partial_ptr_overwrite.stderr b/src/test/ui/consts/const-eval/partial_ptr_overwrite.stderr
index a18c7e78d95..1a7d3861420 100644
--- a/src/test/ui/consts/const-eval/partial_ptr_overwrite.stderr
+++ b/src/test/ui/consts/const-eval/partial_ptr_overwrite.stderr
@@ -18,3 +18,22 @@ LL | | };
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/partial_ptr_overwrite.rs:8:9
+   |
+LL | / const PARTIAL_OVERWRITE: () = {
+LL | |     let mut p = &42;
+LL | |     unsafe {
+LL | |         let ptr: *mut _ = &mut p;
+LL | |         *(ptr as *mut u8) = 123;
+   | |         ^^^^^^^^^^^^^^^^^^^^^^^ unable to overwrite parts of a pointer in memory at alloc4
+...  |
+LL | |     let x = *p;
+LL | | };
+   | |__-
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr b/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr
index 5bfd4ef92a9..be845339dfe 100644
--- a/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr
+++ b/src/test/ui/consts/const-eval/promoted_errors.noopt.stderr
@@ -85,3 +85,53 @@ LL | | };
 
 warning: 7 warnings emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/promoted_errors.rs:15:5
+   |
+LL |       0 - 1
+   |       ^^^^^
+   |       |
+   |       attempt to compute `0_u32 - 1_u32`, which would overflow
+   |       inside `overflow` at $DIR/promoted_errors.rs:15:5
+   |       inside `X` at $DIR/promoted_errors.rs:43:29
+...
+LL | / const X: () = {
+LL | |     let _x: &'static u32 = &overflow();
+LL | |
+LL | |
+...  |
+LL | |     let _x: &'static i32 = &oob();
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/promoted_errors.rs:11:9
+   |
+LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/promoted_errors.rs:43:28
+   |
+LL | / const X: () = {
+LL | |     let _x: &'static u32 = &overflow();
+   | |                            ^^^^^^^^^^^ referenced constant has errors
+LL | |
+LL | |
+...  |
+LL | |     let _x: &'static i32 = &oob();
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/promoted_errors.rs:11:9
+   |
+LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/promoted_errors.opt.stderr b/src/test/ui/consts/const-eval/promoted_errors.opt.stderr
index 0a8a8aef3cf..c91d52336c3 100644
--- a/src/test/ui/consts/const-eval/promoted_errors.opt.stderr
+++ b/src/test/ui/consts/const-eval/promoted_errors.opt.stderr
@@ -86,3 +86,54 @@ LL | | };
 
 warning: 7 warnings emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/promoted_errors.rs:21:5
+   |
+LL |       1 / 0
+   |       ^^^^^
+   |       |
+   |       attempt to divide `1_i32` by zero
+   |       inside `div_by_zero1` at $DIR/promoted_errors.rs:21:5
+   |       inside `X` at $DIR/promoted_errors.rs:46:29
+...
+LL | / const X: () = {
+LL | |     let _x: &'static u32 = &overflow();
+LL | |
+LL | |
+...  |
+LL | |     let _x: &'static i32 = &oob();
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/promoted_errors.rs:11:9
+   |
+LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/promoted_errors.rs:46:28
+   |
+LL | / const X: () = {
+LL | |     let _x: &'static u32 = &overflow();
+LL | |
+LL | |
+LL | |     let _x: &'static i32 = &div_by_zero1();
+   | |                            ^^^^^^^^^^^^^^^ referenced constant has errors
+...  |
+LL | |     let _x: &'static i32 = &oob();
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/promoted_errors.rs:11:9
+   |
+LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr b/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr
index 5bfd4ef92a9..be845339dfe 100644
--- a/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr
+++ b/src/test/ui/consts/const-eval/promoted_errors.opt_with_overflow_checks.stderr
@@ -85,3 +85,53 @@ LL | | };
 
 warning: 7 warnings emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/promoted_errors.rs:15:5
+   |
+LL |       0 - 1
+   |       ^^^^^
+   |       |
+   |       attempt to compute `0_u32 - 1_u32`, which would overflow
+   |       inside `overflow` at $DIR/promoted_errors.rs:15:5
+   |       inside `X` at $DIR/promoted_errors.rs:43:29
+...
+LL | / const X: () = {
+LL | |     let _x: &'static u32 = &overflow();
+LL | |
+LL | |
+...  |
+LL | |     let _x: &'static i32 = &oob();
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/promoted_errors.rs:11:9
+   |
+LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/promoted_errors.rs:43:28
+   |
+LL | / const X: () = {
+LL | |     let _x: &'static u32 = &overflow();
+   | |                            ^^^^^^^^^^^ referenced constant has errors
+LL | |
+LL | |
+...  |
+LL | |     let _x: &'static i32 = &oob();
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/promoted_errors.rs:11:9
+   |
+LL | #![warn(const_err, arithmetic_overflow, unconditional_panic)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/pub_const_err.stderr b/src/test/ui/consts/const-eval/pub_const_err.stderr
index dd47dca2b2e..56d66827626 100644
--- a/src/test/ui/consts/const-eval/pub_const_err.stderr
+++ b/src/test/ui/consts/const-eval/pub_const_err.stderr
@@ -16,3 +16,20 @@ LL | #![warn(const_err)]
 
 warning: 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/pub_const_err.rs:6:20
+   |
+LL | pub const Z: u32 = 0 - 1;
+   | -------------------^^^^^-
+   |                    |
+   |                    attempt to compute `0_u32 - 1_u32`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/pub_const_err.rs:2:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/pub_const_err_bin.stderr b/src/test/ui/consts/const-eval/pub_const_err_bin.stderr
index 9f413fb8fd7..202ea781e97 100644
--- a/src/test/ui/consts/const-eval/pub_const_err_bin.stderr
+++ b/src/test/ui/consts/const-eval/pub_const_err_bin.stderr
@@ -16,3 +16,20 @@ LL | #![warn(const_err)]
 
 warning: 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/pub_const_err_bin.rs:4:20
+   |
+LL | pub const Z: u32 = 0 - 1;
+   | -------------------^^^^^-
+   |                    |
+   |                    attempt to compute `0_u32 - 1_u32`, which would overflow
+   |
+note: the lint level is defined here
+  --> $DIR/pub_const_err_bin.rs:2:9
+   |
+LL | #![warn(const_err)]
+   |         ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ref_to_int_match.32bit.stderr b/src/test/ui/consts/const-eval/ref_to_int_match.32bit.stderr
index 83ac6c90a43..a55fd8c156e 100644
--- a/src/test/ui/consts/const-eval/ref_to_int_match.32bit.stderr
+++ b/src/test/ui/consts/const-eval/ref_to_int_match.32bit.stderr
@@ -24,3 +24,16 @@ LL |         10..=BAR => {},
 
 error: aborting due to 3 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ref_to_int_match.rs:25:27
+   |
+LL | const BAR: Int = unsafe { Foo { r: &42 }.f };
+   | --------------------------^^^^^^^^^^^^^^^^---
+   |                           |
+   |                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ref_to_int_match.64bit.stderr b/src/test/ui/consts/const-eval/ref_to_int_match.64bit.stderr
index 83ac6c90a43..a55fd8c156e 100644
--- a/src/test/ui/consts/const-eval/ref_to_int_match.64bit.stderr
+++ b/src/test/ui/consts/const-eval/ref_to_int_match.64bit.stderr
@@ -24,3 +24,16 @@ LL |         10..=BAR => {},
 
 error: aborting due to 3 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ref_to_int_match.rs:25:27
+   |
+LL | const BAR: Int = unsafe { Foo { r: &42 }.f };
+   | --------------------------^^^^^^^^^^^^^^^^---
+   |                           |
+   |                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ub-enum.32bit.stderr b/src/test/ui/consts/const-eval/ub-enum.32bit.stderr
index c6fa14d0534..2440cd2272c 100644
--- a/src/test/ui/consts/const-eval/ub-enum.32bit.stderr
+++ b/src/test/ui/consts/const-eval/ub-enum.32bit.stderr
@@ -125,3 +125,58 @@ LL | const BAD_UNINHABITED_WITH_DATA2: Result<(i32, !), (i32, Never)> = unsafe {
 error: aborting due to 13 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:26:1
+   |
+LL | const BAD_ENUM_PTR: Enum = unsafe { mem::transmute(&1) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:30:1
+   |
+LL | const BAD_ENUM_WRAPPED: Wrap<Enum> = unsafe { mem::transmute(&1) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:45:1
+   |
+LL | const BAD_ENUM2_PTR: Enum2 = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:49:1
+   |
+LL | const BAD_ENUM2_WRAPPED: Wrap<Enum2> = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:63:1
+   |
+LL | const BAD_ENUM2_OPTION_PTR: Option<Enum2> = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ub-enum.64bit.stderr b/src/test/ui/consts/const-eval/ub-enum.64bit.stderr
index 25be593ab83..e9b4023068e 100644
--- a/src/test/ui/consts/const-eval/ub-enum.64bit.stderr
+++ b/src/test/ui/consts/const-eval/ub-enum.64bit.stderr
@@ -125,3 +125,58 @@ LL | const BAD_UNINHABITED_WITH_DATA2: Result<(i32, !), (i32, Never)> = unsafe {
 error: aborting due to 13 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:26:1
+   |
+LL | const BAD_ENUM_PTR: Enum = unsafe { mem::transmute(&1) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:30:1
+   |
+LL | const BAD_ENUM_WRAPPED: Wrap<Enum> = unsafe { mem::transmute(&1) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:45:1
+   |
+LL | const BAD_ENUM2_PTR: Enum2 = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:49:1
+   |
+LL | const BAD_ENUM2_WRAPPED: Wrap<Enum2> = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-enum.rs:63:1
+   |
+LL | const BAD_ENUM2_OPTION_PTR: Option<Enum2> = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ub-ref-ptr.32bit.stderr b/src/test/ui/consts/const-eval/ub-ref-ptr.32bit.stderr
index 8a4f23c033e..10a0ccd552b 100644
--- a/src/test/ui/consts/const-eval/ub-ref-ptr.32bit.stderr
+++ b/src/test/ui/consts/const-eval/ub-ref-ptr.32bit.stderr
@@ -176,3 +176,66 @@ LL | const DATA_FN_PTR: fn() = unsafe { mem::transmute(&13) };
 error: aborting due to 16 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:31:1
+   |
+LL | const REF_AS_USIZE: usize = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:35:39
+   |
+LL | const REF_AS_USIZE_SLICE: &[usize] = &[unsafe { mem::transmute(&0) }];
+   | --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                       |
+   |                                       unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:35:38
+   |
+LL | const REF_AS_USIZE_SLICE: &[usize] = &[unsafe { mem::transmute(&0) }];
+   | -------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                      |
+   |                                      referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:41:86
+   |
+LL | const REF_AS_USIZE_BOX_SLICE: Box<[usize]> = unsafe { mem::transmute::<&[usize], _>(&[mem::transmute(&0)]) };
+   | -------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^----
+   |                                                                                      |
+   |                                                                                      unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:41:85
+   |
+LL | const REF_AS_USIZE_BOX_SLICE: Box<[usize]> = unsafe { mem::transmute::<&[usize], _>(&[mem::transmute(&0)]) };
+   | ------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^----
+   |                                                                                     |
+   |                                                                                     referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ub-ref-ptr.64bit.stderr b/src/test/ui/consts/const-eval/ub-ref-ptr.64bit.stderr
index da1c6d1a07f..e9fcefe12c7 100644
--- a/src/test/ui/consts/const-eval/ub-ref-ptr.64bit.stderr
+++ b/src/test/ui/consts/const-eval/ub-ref-ptr.64bit.stderr
@@ -176,3 +176,66 @@ LL | const DATA_FN_PTR: fn() = unsafe { mem::transmute(&13) };
 error: aborting due to 16 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:31:1
+   |
+LL | const REF_AS_USIZE: usize = unsafe { mem::transmute(&0) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:35:39
+   |
+LL | const REF_AS_USIZE_SLICE: &[usize] = &[unsafe { mem::transmute(&0) }];
+   | --------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                       |
+   |                                       unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:35:38
+   |
+LL | const REF_AS_USIZE_SLICE: &[usize] = &[unsafe { mem::transmute(&0) }];
+   | -------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                      |
+   |                                      referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:41:86
+   |
+LL | const REF_AS_USIZE_BOX_SLICE: Box<[usize]> = unsafe { mem::transmute::<&[usize], _>(&[mem::transmute(&0)]) };
+   | -------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^----
+   |                                                                                      |
+   |                                                                                      unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-ref-ptr.rs:41:85
+   |
+LL | const REF_AS_USIZE_BOX_SLICE: Box<[usize]> = unsafe { mem::transmute::<&[usize], _>(&[mem::transmute(&0)]) };
+   | ------------------------------------------------------------------------------------^^^^^^^^^^^^^^^^^^^^^----
+   |                                                                                     |
+   |                                                                                     referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ub-wide-ptr.32bit.stderr b/src/test/ui/consts/const-eval/ub-wide-ptr.32bit.stderr
index a78cff11589..0c398f5bfd4 100644
--- a/src/test/ui/consts/const-eval/ub-wide-ptr.32bit.stderr
+++ b/src/test/ui/consts/const-eval/ub-wide-ptr.32bit.stderr
@@ -344,3 +344,86 @@ LL |     mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
 error: aborting due to 32 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:42:1
+   |
+LL | const STR_LENGTH_PTR: &str = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:46:1
+   |
+LL | const MY_STR_LENGTH_PTR: &MyStr = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:75:1
+   |
+LL | const SLICE_LENGTH_PTR: &[u8] = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:82:1
+   |
+LL | const SLICE_LENGTH_PTR_BOX: Box<[u8]> = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:87:40
+   |
+LL | const SLICE_CONTENT_INVALID: &[bool] = &[unsafe { mem::transmute(3u8) }];
+   | ---------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                        |
+   |                                        referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:95:42
+   |
+LL | const MYSLICE_PREFIX_BAD: &MySliceBool = &MySlice(unsafe { mem::transmute(3u8) }, [false]);
+   | -----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                          |
+   |                                          referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:100:42
+   |
+LL | const MYSLICE_SUFFIX_BAD: &MySliceBool = &MySlice(true, [unsafe { mem::transmute(3u8) }]);
+   | -----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                          |
+   |                                          referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/ub-wide-ptr.64bit.stderr b/src/test/ui/consts/const-eval/ub-wide-ptr.64bit.stderr
index 69a61d9caed..bf53995d956 100644
--- a/src/test/ui/consts/const-eval/ub-wide-ptr.64bit.stderr
+++ b/src/test/ui/consts/const-eval/ub-wide-ptr.64bit.stderr
@@ -344,3 +344,86 @@ LL |     mem::transmute::<_, &dyn Trait>((&92u8, &3u64))
 error: aborting due to 32 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:42:1
+   |
+LL | const STR_LENGTH_PTR: &str = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:46:1
+   |
+LL | const MY_STR_LENGTH_PTR: &MyStr = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:75:1
+   |
+LL | const SLICE_LENGTH_PTR: &[u8] = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:82:1
+   |
+LL | const SLICE_LENGTH_PTR_BOX: Box<[u8]> = unsafe { mem::transmute((&42u8, &3)) };
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:87:40
+   |
+LL | const SLICE_CONTENT_INVALID: &[bool] = &[unsafe { mem::transmute(3u8) }];
+   | ---------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                        |
+   |                                        referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:95:42
+   |
+LL | const MYSLICE_PREFIX_BAD: &MySliceBool = &MySlice(unsafe { mem::transmute(3u8) }, [false]);
+   | -----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                          |
+   |                                          referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ub-wide-ptr.rs:100:42
+   |
+LL | const MYSLICE_SUFFIX_BAD: &MySliceBool = &MySlice(true, [unsafe { mem::transmute(3u8) }]);
+   | -----------------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-
+   |                                          |
+   |                                          referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-eval/unused-broken-const.stderr b/src/test/ui/consts/const-eval/unused-broken-const.stderr
index 2ce60ec16a3..bfc076aa5e6 100644
--- a/src/test/ui/consts/const-eval/unused-broken-const.stderr
+++ b/src/test/ui/consts/const-eval/unused-broken-const.stderr
@@ -12,3 +12,16 @@ LL | const FOO: i32 = [][0];
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/unused-broken-const.rs:5:18
+   |
+LL | const FOO: i32 = [][0];
+   | -----------------^^^^^-
+   |                  |
+   |                  index out of bounds: the length is 0 but the index is 0
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-external-macro-const-err.stderr b/src/test/ui/consts/const-external-macro-const-err.stderr
index a66d79a1616..205ee92dfd7 100644
--- a/src/test/ui/consts/const-external-macro-const-err.stderr
+++ b/src/test/ui/consts/const-external-macro-const-err.stderr
@@ -11,3 +11,15 @@ LL |     static_assert!(2 + 2 == 5);
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-external-macro-const-err.rs:12:5
+   |
+LL |     static_assert!(2 + 2 == 5);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^ index out of bounds: the length is 1 but the index is 1
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `static_assert` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/consts/const-float-bits-reject-conv.stderr b/src/test/ui/consts/const-float-bits-reject-conv.stderr
index f3fd098e848..d822171df72 100644
--- a/src/test/ui/consts/const-float-bits-reject-conv.stderr
+++ b/src/test/ui/consts/const-float-bits-reject-conv.stderr
@@ -214,3 +214,115 @@ LL |         const_assert!(f64::from_bits(MASKED_NAN2).to_bits(), MASKED_NAN2);
 error: aborting due to 12 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:30:34
+   |
+LL |             const _: () = assert!($a);
+   |             --------------------------
+...
+LL |     const_assert!(f32::from_bits(MASKED_NAN1).is_nan());
+   |                                  ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:33:34
+   |
+LL |             const _: () = assert!($a);
+   |             --------------------------
+...
+LL |     const_assert!(f32::from_bits(MASKED_NAN1).is_nan());
+   |                                  ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:41:38
+   |
+LL |             const _: () = assert!($a == $b);
+   |             --------------------------------
+...
+LL |         const_assert!(f32::from_bits(MASKED_NAN1).to_bits(), MASKED_NAN1);
+   |                                      ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:44:38
+   |
+LL |             const _: () = assert!($a == $b);
+   |             --------------------------------
+...
+LL |         const_assert!(f32::from_bits(MASKED_NAN2).to_bits(), MASKED_NAN2);
+   |                                      ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:57:34
+   |
+LL |             const _: () = assert!($a);
+   |             --------------------------
+...
+LL |     const_assert!(f64::from_bits(MASKED_NAN1).is_nan());
+   |                                  ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:60:34
+   |
+LL |             const _: () = assert!($a);
+   |             --------------------------
+...
+LL |     const_assert!(f64::from_bits(MASKED_NAN1).is_nan());
+   |                                  ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:66:38
+   |
+LL |             const _: () = assert!($a == $b);
+   |             --------------------------------
+...
+LL |         const_assert!(f64::from_bits(MASKED_NAN1).to_bits(), MASKED_NAN1);
+   |                                      ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-float-bits-reject-conv.rs:69:38
+   |
+LL |             const _: () = assert!($a == $b);
+   |             --------------------------------
+...
+LL |         const_assert!(f64::from_bits(MASKED_NAN2).to_bits(), MASKED_NAN2);
+   |                                      ^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-len-underflow-separate-spans.stderr b/src/test/ui/consts/const-len-underflow-separate-spans.stderr
index 70f645a6c40..0c10783476a 100644
--- a/src/test/ui/consts/const-len-underflow-separate-spans.stderr
+++ b/src/test/ui/consts/const-len-underflow-separate-spans.stderr
@@ -19,3 +19,16 @@ LL |     let a: [i8; LEN] = unimplemented!();
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-len-underflow-separate-spans.rs:7:20
+   |
+LL | const LEN: usize = ONE - TWO;
+   | -------------------^^^^^^^^^-
+   |                    |
+   |                    attempt to compute `1_usize - 2_usize`, which would overflow
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-needs_drop-monomorphic.stderr b/src/test/ui/consts/const-needs_drop-monomorphic.stderr
index 6e56d20c39d..4399db11665 100644
--- a/src/test/ui/consts/const-needs_drop-monomorphic.stderr
+++ b/src/test/ui/consts/const-needs_drop-monomorphic.stderr
@@ -2,7 +2,7 @@ error[E0599]: no function or associated item named `assert` found for struct `Bo
   --> $DIR/const-needs_drop-monomorphic.rs:11:46
    |
 LL | struct Bool<const B: bool> {}
-   | -------------------------- function or associated item `assert` not found for this
+   |        ---- function or associated item `assert` not found for this struct
 ...
 LL |     Bool::<{ std::mem::needs_drop::<T>() }>::assert();
    |                                              ^^^^^^ function or associated item cannot be called on `Bool<{ std::mem::needs_drop::<T>() }>` due to unsatisfied trait bounds
diff --git a/src/test/ui/consts/const-prop-read-static-in-const.stderr b/src/test/ui/consts/const-prop-read-static-in-const.stderr
index 94d3f1c6145..a60cd16f05a 100644
--- a/src/test/ui/consts/const-prop-read-static-in-const.stderr
+++ b/src/test/ui/consts/const-prop-read-static-in-const.stderr
@@ -20,3 +20,16 @@ LL | const TEST: u8 = MY_STATIC;
 
 error: aborting due to previous error; 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-prop-read-static-in-const.rs:5:18
+   |
+LL | const TEST: u8 = MY_STATIC;
+   | -----------------^^^^^^^^^-
+   |                  |
+   |                  constant accesses static
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-size_of_val-align_of_val-extern-type.stderr b/src/test/ui/consts/const-size_of_val-align_of_val-extern-type.stderr
index a9211c17a6b..c6e0b321124 100644
--- a/src/test/ui/consts/const-size_of_val-align_of_val-extern-type.stderr
+++ b/src/test/ui/consts/const-size_of_val-align_of_val-extern-type.stderr
@@ -23,3 +23,29 @@ LL | const _ALIGN: usize = unsafe { min_align_of_val(&4 as *const i32 as *const
 
 error: aborting due to 2 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-size_of_val-align_of_val-extern-type.rs:11:31
+   |
+LL | const _SIZE: usize = unsafe { size_of_val(&4 as *const i32 as *const Opaque) };
+   | ------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                               |
+   |                               `extern type` does not have known layout
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-size_of_val-align_of_val-extern-type.rs:13:32
+   |
+LL | const _ALIGN: usize = unsafe { min_align_of_val(&4 as *const i32 as *const Opaque) };
+   | -------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                                |
+   |                                `extern type` does not have known layout
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const-slice-oob.stderr b/src/test/ui/consts/const-slice-oob.stderr
index 6d2c79034d3..c9f949727bc 100644
--- a/src/test/ui/consts/const-slice-oob.stderr
+++ b/src/test/ui/consts/const-slice-oob.stderr
@@ -12,3 +12,16 @@ LL | const BAR: u32 = FOO[5];
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const-slice-oob.rs:4:18
+   |
+LL | const BAR: u32 = FOO[5];
+   | -----------------^^^^^^-
+   |                  |
+   |                  index out of bounds: the length is 3 but the index is 5
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/const_limit/const_eval_limit_reached.stderr b/src/test/ui/consts/const_limit/const_eval_limit_reached.stderr
index 5e706a4466e..ee95b0d5180 100644
--- a/src/test/ui/consts/const_limit/const_eval_limit_reached.stderr
+++ b/src/test/ui/consts/const_limit/const_eval_limit_reached.stderr
@@ -17,3 +17,21 @@ LL | | };
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/const_eval_limit_reached.rs:6:11
+   |
+LL | / const X: usize = {
+LL | |     let mut x = 0;
+LL | |     while x != 1000 {
+   | |           ^^^^^^^^^ exceeded interpreter step limit (see `#[const_eval_limit]`)
+LL | |
+...  |
+LL | |     x
+LL | | };
+   | |__-
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/invalid-union.32bit.stderr b/src/test/ui/consts/invalid-union.32bit.stderr
index 38c38d1ae67..bd7c95342f7 100644
--- a/src/test/ui/consts/invalid-union.32bit.stderr
+++ b/src/test/ui/consts/invalid-union.32bit.stderr
@@ -22,3 +22,14 @@ LL |     let _: &'static _ = &C;
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/invalid-union.rs:41:25
+   |
+LL |     let _: &'static _ = &C;
+   |                         ^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/invalid-union.64bit.stderr b/src/test/ui/consts/invalid-union.64bit.stderr
index 6bfa97a2fde..0d8b8ffcc16 100644
--- a/src/test/ui/consts/invalid-union.64bit.stderr
+++ b/src/test/ui/consts/invalid-union.64bit.stderr
@@ -22,3 +22,14 @@ LL |     let _: &'static _ = &C;
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/invalid-union.rs:41:25
+   |
+LL |     let _: &'static _ = &C;
+   |                         ^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/issue-56164.stderr b/src/test/ui/consts/issue-56164.stderr
index 3b80b3486a8..73a0f8ec0d0 100644
--- a/src/test/ui/consts/issue-56164.stderr
+++ b/src/test/ui/consts/issue-56164.stderr
@@ -26,3 +26,14 @@ LL | const fn foo() { (||{})() }
 error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0015`.
+Future incompatibility report: Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/issue-56164.rs:1:18
+   |
+LL | const fn foo() { (||{})() }
+   |                  ^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/issue-66693.stderr b/src/test/ui/consts/issue-66693.stderr
index b8257684983..929f905ae91 100644
--- a/src/test/ui/consts/issue-66693.stderr
+++ b/src/test/ui/consts/issue-66693.stderr
@@ -34,3 +34,14 @@ LL |     panic!(&1);
 
 error: aborting due to 4 previous errors
 
+Future incompatibility report: Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/issue-66693.rs:11:12
+   |
+LL |     panic!(&1);
+   |            ^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/issue-miri-1910.stderr b/src/test/ui/consts/issue-miri-1910.stderr
index 87882449c73..e76a1f96b46 100644
--- a/src/test/ui/consts/issue-miri-1910.stderr
+++ b/src/test/ui/consts/issue-miri-1910.stderr
@@ -24,3 +24,28 @@ LL | | };
 
 error: aborting due to previous error
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
+   |
+LL |           copy_nonoverlapping(src, tmp.as_mut_ptr(), 1);
+   |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |           |
+   |           unable to turn pointer into raw bytes
+   |           inside `std::ptr::read::<u8>` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
+   |           inside `ptr::const_ptr::<impl *const u8>::read` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL
+   |           inside `C` at $DIR/issue-miri-1910.rs:7:5
+   |
+  ::: $DIR/issue-miri-1910.rs:4:1
+   |
+LL | / const C: () = unsafe {
+LL | |     let foo = Some(&42 as *const i32);
+LL | |     let one_and_a_half_pointers = std::mem::size_of::<*const i32>()/2*3;
+LL | |     (&foo as *const _ as *const u8).add(one_and_a_half_pointers).read();
+LL | | };
+   | |__-
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/miri_unleashed/assoc_const.stderr b/src/test/ui/consts/miri_unleashed/assoc_const.stderr
index 193a49bb266..1765c9ed10a 100644
--- a/src/test/ui/consts/miri_unleashed/assoc_const.stderr
+++ b/src/test/ui/consts/miri_unleashed/assoc_const.stderr
@@ -15,3 +15,28 @@ LL |     const F: u32 = (U::X, 42).1;
 error: aborting due to previous error; 1 warning emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL
+   |
+LL | pub unsafe fn drop_in_place<T: ?Sized>(to_drop: *mut T) {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   | |
+   | calling non-const function `<Vec<u32> as Drop>::drop`
+   | inside `std::ptr::drop_in_place::<Vec<u32>> - shim(Some(Vec<u32>))` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
+   | inside `std::ptr::drop_in_place::<(Vec<u32>, u32)> - shim(Some((Vec<u32>, u32)))` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL
+   | inside `<String as Bar<Vec<u32>, String>>::F` at $DIR/assoc_const.rs:14:31
+   |
+  ::: $DIR/assoc_const.rs:14:5
+   |
+LL |     const F: u32 = (U::X, 42).1;
+   |     ----------------------------
+   |
+note: the lint level is defined here
+  --> $DIR/assoc_const.rs:4:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr b/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr
index e15717979c5..f7be42de03f 100644
--- a/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr
+++ b/src/test/ui/consts/miri_unleashed/assoc_const_2.stderr
@@ -7,3 +7,20 @@ LL |     let y = <String as Bar<String>>::F;
 error: aborting due to previous error
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/assoc_const_2.rs:12:20
+   |
+LL |     const F: u32 = 100 / U::X;
+   |     ---------------^^^^^^^^^^-
+   |                    |
+   |                    attempt to divide `100_u32` by zero
+   |
+note: the lint level is defined here
+  --> $DIR/assoc_const_2.rs:3:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr b/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr
index c48f59fe848..98d4dff648a 100644
--- a/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr
+++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static.stderr
@@ -47,3 +47,58 @@ LL | const READ_MUT: u32 = unsafe { MUTABLE };
 error: aborting due to 3 previous errors; 1 warning emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static.rs:13:5
+   |
+LL | / const MUTATE_INTERIOR_MUT: usize = {
+LL | |     static FOO: AtomicUsize = AtomicUsize::new(0);
+LL | |     FOO.fetch_add(1, Ordering::Relaxed)
+   | |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ calling non-const function `AtomicUsize::fetch_add`
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static.rs:3:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static.rs:18:14
+   |
+LL | / const READ_INTERIOR_MUT: usize = {
+LL | |     static FOO: AtomicUsize = AtomicUsize::new(0);
+LL | |     unsafe { *(&FOO as *const _ as *const usize) }
+   | |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static.rs:3:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static.rs:22:32
+   |
+LL | const READ_MUT: u32 = unsafe { MUTABLE };
+   | -------------------------------^^^^^^^---
+   |                                |
+   |                                constant accesses static
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static.rs:3:10
+   |
+LL | #![allow(const_err)]
+   |          ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.32bit.stderr b/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.32bit.stderr
index 186c5b1856b..2a0766294d3 100644
--- a/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.32bit.stderr
+++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.32bit.stderr
@@ -170,3 +170,45 @@ LL |     unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None =>
 error: aborting due to 10 previous errors; 3 warnings emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static_cross_crate.rs:25:15
+   |
+LL | / const U8_MUT2: &u8 = {
+LL | |     unsafe { &(*static_cross_crate::ZERO_REF)[0] }
+   | |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static
+LL | |
+LL | |
+LL | |
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static_cross_crate.rs:23:8
+   |
+LL | #[warn(const_err)]
+   |        ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static_cross_crate.rs:32:20
+   |
+LL | / const U8_MUT3: &u8 = {
+LL | |     unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
+   | |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static
+LL | |
+LL | |
+LL | |
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static_cross_crate.rs:30:8
+   |
+LL | #[warn(const_err)]
+   |        ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.64bit.stderr b/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.64bit.stderr
index 7a64abd7b9c..2d4f038d914 100644
--- a/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.64bit.stderr
+++ b/src/test/ui/consts/miri_unleashed/const_refers_to_static_cross_crate.64bit.stderr
@@ -170,3 +170,45 @@ LL |     unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None =>
 error: aborting due to 10 previous errors; 3 warnings emitted
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static_cross_crate.rs:25:15
+   |
+LL | / const U8_MUT2: &u8 = {
+LL | |     unsafe { &(*static_cross_crate::ZERO_REF)[0] }
+   | |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static
+LL | |
+LL | |
+LL | |
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static_cross_crate.rs:23:8
+   |
+LL | #[warn(const_err)]
+   |        ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/const_refers_to_static_cross_crate.rs:32:20
+   |
+LL | / const U8_MUT3: &u8 = {
+LL | |     unsafe { match static_cross_crate::OPT_ZERO { Some(ref u) => u, None => panic!() } }
+   | |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ constant accesses static
+LL | |
+LL | |
+LL | |
+LL | | };
+   | |__-
+   |
+note: the lint level is defined here
+  --> $DIR/const_refers_to_static_cross_crate.rs:30:8
+   |
+LL | #[warn(const_err)]
+   |        ^^^^^^^^^
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/ptr_comparisons.stderr b/src/test/ui/consts/ptr_comparisons.stderr
index 12f6ca0b51a..594576fe2cf 100644
--- a/src/test/ui/consts/ptr_comparisons.stderr
+++ b/src/test/ui/consts/ptr_comparisons.stderr
@@ -44,3 +44,29 @@ LL | const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4
 error: aborting due to 4 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ptr_comparisons.rs:65:27
+   |
+LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 };
+   | --------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^---
+   |                           |
+   |                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
+Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/ptr_comparisons.rs:70:27
+   |
+LL | const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4 };
+   | --------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-------
+   |                           |
+   |                           unable to turn pointer into raw bytes
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/recursive.stderr b/src/test/ui/consts/recursive.stderr
index 31ac1fff4e8..8d1e10d4176 100644
--- a/src/test/ui/consts/recursive.stderr
+++ b/src/test/ui/consts/recursive.stderr
@@ -29,3 +29,22 @@ LL | const X: () = f(1);
 
 error: aborting due to previous error; 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/recursive.rs:4:5
+   |
+LL |     f(x);
+   |     ^^^^
+   |     |
+   |     reached the configured maximum number of stack frames
+   |     inside `f::<i32>` at $DIR/recursive.rs:4:5
+   |     [... 126 additional calls inside `f::<i32>` at $DIR/recursive.rs:4:5 ...]
+   |     inside `X` at $DIR/recursive.rs:9:15
+...
+LL | const X: () = f(1);
+   | -------------------
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/consts/uninhabited-const-issue-61744.stderr b/src/test/ui/consts/uninhabited-const-issue-61744.stderr
index e98eefc11c3..17dd6131436 100644
--- a/src/test/ui/consts/uninhabited-const-issue-61744.stderr
+++ b/src/test/ui/consts/uninhabited-const-issue-61744.stderr
@@ -150,3 +150,147 @@ LL |     dbg!(i32::CONSTANT);
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: any use of this value will cause an error
+  --> $DIR/uninhabited-const-issue-61744.rs:4:5
+   |
+LL |     hint_unreachable()
+   |     ^^^^^^^^^^^^^^^^^^
+   |     |
+   |     reached the configured maximum number of stack frames
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<!>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `hint_unreachable` at $DIR/uninhabited-const-issue-61744.rs:9:5
+   |     inside `fake_type::<i32>` at $DIR/uninhabited-const-issue-61744.rs:4:5
+   |     inside `<i32 as Const>::CONSTANT` at $DIR/uninhabited-const-issue-61744.rs:13:36
+...
+LL |     const CONSTANT: i32 = unsafe { fake_type() };
+   |     ---------------------------------------------
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/copy-a-resource.stderr b/src/test/ui/copy-a-resource.stderr
index 79095452f9d..3909862ff1c 100644
--- a/src/test/ui/copy-a-resource.stderr
+++ b/src/test/ui/copy-a-resource.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `clone` found for struct `Foo` in the current scop
   --> $DIR/copy-a-resource.rs:18:16
    |
 LL | struct Foo {
-   | ---------- method `clone` not found for this
+   |        --- method `clone` not found for this struct
 ...
 LL |     let _y = x.clone();
    |                ^^^^^ method not found in `Foo`
diff --git a/src/test/ui/derive-uninhabited-enum-38885.rs b/src/test/ui/derive-uninhabited-enum-38885.rs
index 35c3065ea81..0089453ef0f 100644
--- a/src/test/ui/derive-uninhabited-enum-38885.rs
+++ b/src/test/ui/derive-uninhabited-enum-38885.rs
@@ -10,7 +10,7 @@ enum Void {}
 #[derive(Debug)]
 enum Foo {
     Bar(u8),
-    Void(Void), //~ WARN never constructed
+    Void(Void), //~ WARN variant `Void` is never constructed
 }
 
 fn main() {
diff --git a/src/test/ui/derive-uninhabited-enum-38885.stderr b/src/test/ui/derive-uninhabited-enum-38885.stderr
index 58aaf978dc7..4feaf3ac961 100644
--- a/src/test/ui/derive-uninhabited-enum-38885.stderr
+++ b/src/test/ui/derive-uninhabited-enum-38885.stderr
@@ -1,6 +1,9 @@
-warning: variant is never constructed: `Void`
+warning: variant `Void` is never constructed
   --> $DIR/derive-uninhabited-enum-38885.rs:13:5
    |
+LL | enum Foo {
+   |      --- variant in this enum
+LL |     Bar(u8),
 LL |     Void(Void),
    |     ^^^^^^^^^^
    |
diff --git a/src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.rs b/src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.rs
new file mode 100644
index 00000000000..15d06817577
--- /dev/null
+++ b/src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.rs
@@ -0,0 +1,12 @@
+#![forbid(dead_code)]
+
+#[derive(Debug)]
+pub struct Whatever {
+    pub field0: (),
+    field1: (), //~ ERROR fields `field1`, `field2`, `field3` and `field4` are never read
+    field2: (),
+    field3: (),
+    field4: (),
+}
+
+fn main() {}
diff --git a/src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr b/src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr
new file mode 100644
index 00000000000..383e0b4b725
--- /dev/null
+++ b/src/test/ui/derives/clone-debug-dead-code-in-the-same-struct.stderr
@@ -0,0 +1,24 @@
+error: fields `field1`, `field2`, `field3` and `field4` are never read
+  --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:6:5
+   |
+LL | pub struct Whatever {
+   |            -------- fields in this struct
+LL |     pub field0: (),
+LL |     field1: (),
+   |     ^^^^^^^^^^
+LL |     field2: (),
+   |     ^^^^^^^^^^
+LL |     field3: (),
+   |     ^^^^^^^^^^
+LL |     field4: (),
+   |     ^^^^^^^^^^
+   |
+note: the lint level is defined here
+  --> $DIR/clone-debug-dead-code-in-the-same-struct.rs:1:11
+   |
+LL | #![forbid(dead_code)]
+   |           ^^^^^^^^^
+   = note: `Whatever` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/derives/clone-debug-dead-code.rs b/src/test/ui/derives/clone-debug-dead-code.rs
index 80e91320939..ab49260c01b 100644
--- a/src/test/ui/derives/clone-debug-dead-code.rs
+++ b/src/test/ui/derives/clone-debug-dead-code.rs
@@ -4,22 +4,22 @@
 #![forbid(dead_code)]
 
 struct A { f: () }
-//~^ ERROR: field is never read: `f`
+//~^ ERROR: field `f` is never read
 
 #[derive(Clone)]
 struct B { f: () }
-//~^ ERROR: field is never read: `f`
+//~^ ERROR: field `f` is never read
 
 #[derive(Debug)]
 struct C { f: () }
-//~^ ERROR: field is never read: `f`
+//~^ ERROR: field `f` is never read
 
 #[derive(Debug,Clone)]
 struct D { f: () }
-//~^ ERROR: field is never read: `f`
+//~^ ERROR: field `f` is never read
 
 struct E { f: () }
-//~^ ERROR: field is never read: `f`
+//~^ ERROR: field `f` is never read
 // Custom impl, still doesn't read f
 impl Clone for E {
     fn clone(&self) -> Self {
diff --git a/src/test/ui/derives/clone-debug-dead-code.stderr b/src/test/ui/derives/clone-debug-dead-code.stderr
index 031b8ce713e..73a00251188 100644
--- a/src/test/ui/derives/clone-debug-dead-code.stderr
+++ b/src/test/ui/derives/clone-debug-dead-code.stderr
@@ -1,8 +1,10 @@
-error: field is never read: `f`
+error: field `f` is never read
   --> $DIR/clone-debug-dead-code.rs:6:12
    |
 LL | struct A { f: () }
-   |            ^^^^^
+   |        -   ^^^^^
+   |        |
+   |        field in this struct
    |
 note: the lint level is defined here
   --> $DIR/clone-debug-dead-code.rs:4:11
@@ -10,35 +12,43 @@ note: the lint level is defined here
 LL | #![forbid(dead_code)]
    |           ^^^^^^^^^
 
-error: field is never read: `f`
+error: field `f` is never read
   --> $DIR/clone-debug-dead-code.rs:10:12
    |
 LL | struct B { f: () }
-   |            ^^^^^
+   |        -   ^^^^^
+   |        |
+   |        field in this struct
    |
    = note: `B` has a derived impl for the trait `Clone`, but this is intentionally ignored during dead code analysis
 
-error: field is never read: `f`
+error: field `f` is never read
   --> $DIR/clone-debug-dead-code.rs:14:12
    |
 LL | struct C { f: () }
-   |            ^^^^^
+   |        -   ^^^^^
+   |        |
+   |        field in this struct
    |
    = note: `C` has a derived impl for the trait `Debug`, but this is intentionally ignored during dead code analysis
 
-error: field is never read: `f`
+error: field `f` is never read
   --> $DIR/clone-debug-dead-code.rs:18:12
    |
 LL | struct D { f: () }
-   |            ^^^^^
+   |        -   ^^^^^
+   |        |
+   |        field in this struct
    |
    = note: `D` has derived impls for the traits `Clone` and `Debug`, but these are intentionally ignored during dead code analysis
 
-error: field is never read: `f`
+error: field `f` is never read
   --> $DIR/clone-debug-dead-code.rs:21:12
    |
 LL | struct E { f: () }
-   |            ^^^^^
+   |        -   ^^^^^
+   |        |
+   |        field in this struct
 
 error: aborting due to 5 previous errors
 
diff --git a/src/test/ui/derives/derive-assoc-type-not-impl.stderr b/src/test/ui/derives/derive-assoc-type-not-impl.stderr
index 72dd9c153ab..592cc0ae90f 100644
--- a/src/test/ui/derives/derive-assoc-type-not-impl.stderr
+++ b/src/test/ui/derives/derive-assoc-type-not-impl.stderr
@@ -3,8 +3,8 @@ error[E0599]: the method `clone` exists for struct `Bar<NotClone>`, but its trai
    |
 LL | struct Bar<T: Foo> {
    | ------------------
-   | |
-   | method `clone` not found for this
+   | |      |
+   | |      method `clone` not found for this struct
    | doesn't satisfy `Bar<NotClone>: Clone`
 ...
 LL | struct NotClone;
diff --git a/src/test/ui/derives/issue-91492.stderr b/src/test/ui/derives/issue-91492.stderr
index 73c91154a7b..e479b539fec 100644
--- a/src/test/ui/derives/issue-91492.stderr
+++ b/src/test/ui/derives/issue-91492.stderr
@@ -37,7 +37,7 @@ LL | pub struct NoDerives;
    | --------------------- doesn't satisfy `NoDerives: Clone`
 ...
 LL | struct Object<T, A>(T, A);
-   | -------------------------- method `use_clone` not found for this
+   |        ------ method `use_clone` not found for this struct
 ...
 LL |     foo.use_clone();
    |         ^^^^^^^^^ method cannot be called on `Object<NoDerives, SomeDerives>` due to unsatisfied trait bounds
diff --git a/src/test/ui/derives/issue-91550.stderr b/src/test/ui/derives/issue-91550.stderr
index c94d566f5df..b1bec5432e3 100644
--- a/src/test/ui/derives/issue-91550.stderr
+++ b/src/test/ui/derives/issue-91550.stderr
@@ -25,7 +25,7 @@ LL | pub struct NoDerives;
    | --------------------- doesn't satisfy `NoDerives: Eq`
 LL |
 LL | struct Object<T>(T);
-   | -------------------- method `use_eq` not found for this
+   |        ------ method `use_eq` not found for this struct
 ...
 LL |     foo.use_eq();
    |         ^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
@@ -44,7 +44,7 @@ LL | pub struct NoDerives;
    | --------------------- doesn't satisfy `NoDerives: Ord`
 LL |
 LL | struct Object<T>(T);
-   | -------------------- method `use_ord` not found for this
+   |        ------ method `use_ord` not found for this struct
 ...
 LL |     foo.use_ord();
    |         ^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
@@ -66,7 +66,7 @@ LL | pub struct NoDerives;
    | doesn't satisfy `NoDerives: PartialOrd`
 LL |
 LL | struct Object<T>(T);
-   | -------------------- method `use_ord_and_partial_ord` not found for this
+   |        ------ method `use_ord_and_partial_ord` not found for this struct
 ...
 LL |     foo.use_ord_and_partial_ord();
    |         ^^^^^^^^^^^^^^^^^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
diff --git a/src/test/ui/derives/issue-97343.stderr b/src/test/ui/derives/issue-97343.stderr
index ac797a8f501..e83bbb5b60d 100644
--- a/src/test/ui/derives/issue-97343.stderr
+++ b/src/test/ui/derives/issue-97343.stderr
@@ -4,7 +4,7 @@ error[E0109]: type arguments are not allowed on type parameter `Irrelevant`
 LL | #[derive(Debug)]
    |          -----
    |          |
-   |          not allowed on this
+   |          not allowed on type parameter `Irrelevant`
    |          in this derive macro expansion
 LL | pub struct Irrelevant<Irrelevant> {
    |                       ^^^^^^^^^^ type argument not allowed
diff --git a/src/test/ui/issues/issue-6341.rs b/src/test/ui/deriving/issue-6341.rs
index 1be1394dfae..1be1394dfae 100644
--- a/src/test/ui/issues/issue-6341.rs
+++ b/src/test/ui/deriving/issue-6341.rs
diff --git a/src/test/ui/did_you_mean/issue-40006.stderr b/src/test/ui/did_you_mean/issue-40006.stderr
index d5e16e1ff27..bd5b9f4b49e 100644
--- a/src/test/ui/did_you_mean/issue-40006.stderr
+++ b/src/test/ui/did_you_mean/issue-40006.stderr
@@ -88,7 +88,7 @@ error[E0599]: no method named `hello_method` found for struct `S` in the current
   --> $DIR/issue-40006.rs:38:7
    |
 LL | struct S;
-   | --------- method `hello_method` not found for this
+   |        - method `hello_method` not found for this struct
 ...
 LL |     S.hello_method();
    |       ^^^^^^^^^^^^ method not found in `S`
diff --git a/src/test/ui/dont-suggest-private-trait-method.stderr b/src/test/ui/dont-suggest-private-trait-method.stderr
index fd7fdb4f722..d85fd526d52 100644
--- a/src/test/ui/dont-suggest-private-trait-method.stderr
+++ b/src/test/ui/dont-suggest-private-trait-method.stderr
@@ -2,7 +2,7 @@ error[E0599]: no function or associated item named `new` found for struct `T` in
   --> $DIR/dont-suggest-private-trait-method.rs:4:8
    |
 LL | struct T;
-   | --------- function or associated item `new` not found for this
+   |        - function or associated item `new` not found for this struct
 ...
 LL |     T::new();
    |        ^^^ function or associated item not found in `T`
diff --git a/src/test/ui/error-codes/E0057.stderr b/src/test/ui/error-codes/E0057.stderr
index 4b4d30a8387..3697b5fcf15 100644
--- a/src/test/ui/error-codes/E0057.stderr
+++ b/src/test/ui/error-codes/E0057.stderr
@@ -11,8 +11,8 @@ LL |     let f = |x| x * 3;
    |             ^^^
 help: provide the argument
    |
-LL |     let a = f({_});
-   |             ~~~~~~
+LL |     let a = f(/* value */);
+   |             ~~~~~~~~~~~~~~
 
 error[E0057]: this function takes 1 argument but 2 arguments were supplied
   --> $DIR/E0057.rs:5:13
diff --git a/src/test/ui/error-codes/E0060.stderr b/src/test/ui/error-codes/E0060.stderr
index 9dd649239e2..644fd598338 100644
--- a/src/test/ui/error-codes/E0060.stderr
+++ b/src/test/ui/error-codes/E0060.stderr
@@ -11,8 +11,8 @@ LL |     fn printf(_: *const u8, ...) -> u32;
    |        ^^^^^^
 help: provide the argument
    |
-LL |     unsafe { printf({*const u8}); }
-   |              ~~~~~~~~~~~~~~~~~~~
+LL |     unsafe { printf(/* *const u8 */); }
+   |              ~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/error-codes/E0061.stderr b/src/test/ui/error-codes/E0061.stderr
index f92c548f2de..fa55db0924d 100644
--- a/src/test/ui/error-codes/E0061.stderr
+++ b/src/test/ui/error-codes/E0061.stderr
@@ -11,8 +11,8 @@ LL | fn f(a: u16, b: &str) {}
    |    ^ ------  -------
 help: provide the argument
    |
-LL |     f(0, {&str});
-   |     ~~~~~~~~~~~~
+LL |     f(0, /* &str */);
+   |     ~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 1 argument but 0 arguments were supplied
   --> $DIR/E0061.rs:9:5
@@ -27,8 +27,8 @@ LL | fn f2(a: u16) {}
    |    ^^ ------
 help: provide the argument
    |
-LL |     f2({u16});
-   |     ~~~~~~~~~
+LL |     f2(/* u16 */);
+   |     ~~~~~~~~~~~~~
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/error-codes/E0109.stderr b/src/test/ui/error-codes/E0109.stderr
index 7858a9e3028..8f4cb86de99 100644
--- a/src/test/ui/error-codes/E0109.stderr
+++ b/src/test/ui/error-codes/E0109.stderr
@@ -1,10 +1,10 @@
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `u32`
   --> $DIR/E0109.rs:1:14
    |
 LL | type X = u32<i32>;
    |          --- ^^^ type argument not allowed
    |          |
-   |          not allowed on this
+   |          not allowed on builtin type `u32`
    |
 help: primitive type `u32` doesn't have generic parameters
    |
diff --git a/src/test/ui/error-codes/E0110.stderr b/src/test/ui/error-codes/E0110.stderr
index 68f98b6f17d..4ce2a0a410c 100644
--- a/src/test/ui/error-codes/E0110.stderr
+++ b/src/test/ui/error-codes/E0110.stderr
@@ -1,10 +1,10 @@
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `u32`
   --> $DIR/E0110.rs:1:14
    |
 LL | type X = u32<'static>;
    |          --- ^^^^^^^ lifetime argument not allowed
    |          |
-   |          not allowed on this
+   |          not allowed on builtin type `u32`
    |
 help: primitive type `u32` doesn't have generic parameters
    |
diff --git a/src/test/ui/error-codes/E0411.stderr b/src/test/ui/error-codes/E0411.stderr
index c1c25e835c1..4c99f9fcbf1 100644
--- a/src/test/ui/error-codes/E0411.stderr
+++ b/src/test/ui/error-codes/E0411.stderr
@@ -1,6 +1,8 @@
 error[E0411]: cannot find type `Self` in this scope
   --> $DIR/E0411.rs:2:6
    |
+LL | fn main() {
+   |    ---- `Self` not allowed in a function
 LL |     <Self>::foo;
    |      ^^^^ `Self` is only available in impls, traits, and type definitions
 
diff --git a/src/test/ui/error-codes/E0599.stderr b/src/test/ui/error-codes/E0599.stderr
index a78a003661d..49ca1d6353d 100644
--- a/src/test/ui/error-codes/E0599.stderr
+++ b/src/test/ui/error-codes/E0599.stderr
@@ -2,7 +2,7 @@ error[E0599]: no associated item named `NotEvenReal` found for struct `Foo` in t
   --> $DIR/E0599.rs:4:20
    |
 LL | struct Foo;
-   | ----------- associated item `NotEvenReal` not found for this
+   |        --- associated item `NotEvenReal` not found for this struct
 ...
 LL |     || if let Foo::NotEvenReal() = Foo {};
    |                    ^^^^^^^^^^^ associated item not found in `Foo`
diff --git a/src/test/ui/generator/issue-68112.rs b/src/test/ui/generator/issue-68112.rs
index feb07c9bf88..3fcef773b68 100644
--- a/src/test/ui/generator/issue-68112.rs
+++ b/src/test/ui/generator/issue-68112.rs
@@ -20,6 +20,10 @@ pub fn make_gen1<T>(t: T) -> Ready<T> {
 }
 
 fn require_send(_: impl Send) {}
+//~^ NOTE required by a bound
+//~| NOTE required by a bound
+//~| NOTE required by this bound
+//~| NOTE required by this bound
 
 fn make_non_send_generator() -> impl Generator<Return = Arc<RefCell<i32>>> {
     make_gen1(Arc::new(RefCell::new(0)))
@@ -28,29 +32,39 @@ fn make_non_send_generator() -> impl Generator<Return = Arc<RefCell<i32>>> {
 fn test1() {
     let send_gen = || {
         let _non_send_gen = make_non_send_generator();
+        //~^ NOTE not `Send`
         yield;
-    };
+        //~^ NOTE yield occurs here
+        //~| NOTE value is used across a yield
+    }; //~ NOTE later dropped here
     require_send(send_gen);
     //~^ ERROR generator cannot be sent between threads
+    //~| NOTE not `Send`
 }
 
 pub fn make_gen2<T>(t: T) -> impl Generator<Return = T> {
-    || {
+//~^ NOTE appears within the type
+//~| NOTE expansion of desugaring
+    || { //~ NOTE used within this generator
         yield;
         t
     }
 }
-fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> {
+fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> { //~ NOTE appears within the type
+//~^ NOTE expansion of desugaring
     make_gen2(Arc::new(RefCell::new(0)))
 }
 
 fn test2() {
-    let send_gen = || {
+    let send_gen = || { //~ NOTE used within this generator
         let _non_send_gen = make_non_send_generator2();
         yield;
     };
     require_send(send_gen);
     //~^ ERROR `RefCell<i32>` cannot be shared between threads safely
+    //~| NOTE `RefCell<i32>` cannot be shared between threads safely
+    //~| NOTE requirements on the impl
+    //~| NOTE captures the following types
 }
 
 fn main() {}
diff --git a/src/test/ui/generator/issue-68112.stderr b/src/test/ui/generator/issue-68112.stderr
index a7d7a732548..83f068c2076 100644
--- a/src/test/ui/generator/issue-68112.stderr
+++ b/src/test/ui/generator/issue-68112.stderr
@@ -1,17 +1,19 @@
 error: generator cannot be sent between threads safely
-  --> $DIR/issue-68112.rs:33:5
+  --> $DIR/issue-68112.rs:40:5
    |
 LL |     require_send(send_gen);
    |     ^^^^^^^^^^^^ generator is not `Send`
    |
    = help: the trait `Sync` is not implemented for `RefCell<i32>`
 note: generator is not `Send` as this value is used across a yield
-  --> $DIR/issue-68112.rs:31:9
+  --> $DIR/issue-68112.rs:36:9
    |
 LL |         let _non_send_gen = make_non_send_generator();
    |             ------------- has type `impl Generator<Return = Arc<RefCell<i32>>>` which is not `Send`
+LL |
 LL |         yield;
    |         ^^^^^ yield occurs here, with `_non_send_gen` maybe used later
+...
 LL |     };
    |     - `_non_send_gen` is later dropped here
 note: required by a bound in `require_send`
@@ -21,18 +23,41 @@ LL | fn require_send(_: impl Send) {}
    |                         ^^^^ required by this bound in `require_send`
 
 error[E0277]: `RefCell<i32>` cannot be shared between threads safely
-  --> $DIR/issue-68112.rs:52:5
+  --> $DIR/issue-68112.rs:63:5
    |
 LL |     require_send(send_gen);
    |     ^^^^^^^^^^^^ `RefCell<i32>` cannot be shared between threads safely
    |
    = help: the trait `Sync` is not implemented for `RefCell<i32>`
    = note: required because of the requirements on the impl of `Send` for `Arc<RefCell<i32>>`
-   = note: required because it appears within the type `[generator@$DIR/issue-68112.rs:38:5: 41:6]`
-   = note: required because it appears within the type `impl Generator<Return = Arc<RefCell<i32>>>`
-   = note: required because it appears within the type `impl Generator<Return = Arc<RefCell<i32>>>`
-   = note: required because it appears within the type `{impl Generator<Return = Arc<RefCell<i32>>>, ()}`
-   = note: required because it appears within the type `[generator@$DIR/issue-68112.rs:48:20: 51:6]`
+note: required because it's used within this generator
+  --> $DIR/issue-68112.rs:48:5
+   |
+LL | /     || {
+LL | |         yield;
+LL | |         t
+LL | |     }
+   | |_____^
+note: required because it appears within the type `impl Generator<Return = Arc<RefCell<i32>>>`
+  --> $DIR/issue-68112.rs:45:30
+   |
+LL | pub fn make_gen2<T>(t: T) -> impl Generator<Return = T> {
+   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^
+note: required because it appears within the type `impl Generator<Return = Arc<RefCell<i32>>>`
+  --> $DIR/issue-68112.rs:53:34
+   |
+LL | fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> {
+   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = note: required because it captures the following types: `impl Generator<Return = Arc<RefCell<i32>>>`, `()`
+note: required because it's used within this generator
+  --> $DIR/issue-68112.rs:59:20
+   |
+LL |       let send_gen = || {
+   |  ____________________^
+LL | |         let _non_send_gen = make_non_send_generator2();
+LL | |         yield;
+LL | |     };
+   | |_____^
 note: required by a bound in `require_send`
   --> $DIR/issue-68112.rs:22:25
    |
diff --git a/src/test/ui/generator/not-send-sync.stderr b/src/test/ui/generator/not-send-sync.stderr
index 4d2faa198f1..edf9ee628a2 100644
--- a/src/test/ui/generator/not-send-sync.stderr
+++ b/src/test/ui/generator/not-send-sync.stderr
@@ -6,7 +6,16 @@ LL |     assert_send(|| {
    |
    = help: the trait `Sync` is not implemented for `Cell<i32>`
    = note: required because of the requirements on the impl of `Send` for `&Cell<i32>`
-   = note: required because it appears within the type `[generator@$DIR/not-send-sync.rs:16:17: 20:6]`
+note: required because it's used within this generator
+  --> $DIR/not-send-sync.rs:16:17
+   |
+LL |       assert_send(|| {
+   |  _________________^
+LL | |
+LL | |         drop(&a);
+LL | |         yield;
+LL | |     });
+   | |_____^
 note: required by a bound in `assert_send`
   --> $DIR/not-send-sync.rs:7:23
    |
diff --git a/src/test/ui/generator/print/generator-print-verbose-1.stderr b/src/test/ui/generator/print/generator-print-verbose-1.stderr
index 2f7faf520d9..3ee4c1458ba 100644
--- a/src/test/ui/generator/print/generator-print-verbose-1.stderr
+++ b/src/test/ui/generator/print/generator-print-verbose-1.stderr
@@ -28,11 +28,34 @@ LL |     require_send(send_gen);
    |
    = help: the trait `Sync` is not implemented for `RefCell<i32>`
    = note: required because of the requirements on the impl of `Send` for `Arc<RefCell<i32>>`
-   = note: required because it appears within the type `[make_gen2<Arc<RefCell<i32>>>::{closure#0} upvar_tys=(Arc<RefCell<i32>>) {()}]`
-   = note: required because it appears within the type `Opaque(DefId(0:39 ~ generator_print_verbose_1[749a]::make_gen2::{opaque#0}), [std::sync::Arc<std::cell::RefCell<i32>>])`
-   = note: required because it appears within the type `Opaque(DefId(0:42 ~ generator_print_verbose_1[749a]::make_non_send_generator2::{opaque#0}), [])`
-   = note: required because it appears within the type `{Opaque(DefId(0:42 ~ generator_print_verbose_1[749a]::make_non_send_generator2::{opaque#0}), []), ()}`
-   = note: required because it appears within the type `[test2::{closure#0} upvar_tys=() {Opaque(DefId(0:42 ~ generator_print_verbose_1[749a]::make_non_send_generator2::{opaque#0}), []), ()}]`
+note: required because it's used within this generator
+  --> $DIR/generator-print-verbose-1.rs:42:5
+   |
+LL | /     || {
+LL | |         yield;
+LL | |         t
+LL | |     }
+   | |_____^
+note: required because it appears within the type `Opaque(DefId(0:39 ~ generator_print_verbose_1[749a]::make_gen2::{opaque#0}), [std::sync::Arc<std::cell::RefCell<i32>>])`
+  --> $DIR/generator-print-verbose-1.rs:41:30
+   |
+LL | pub fn make_gen2<T>(t: T) -> impl Generator<Return = T> {
+   |                              ^^^^^^^^^^^^^^^^^^^^^^^^^^
+note: required because it appears within the type `Opaque(DefId(0:42 ~ generator_print_verbose_1[749a]::make_non_send_generator2::{opaque#0}), [])`
+  --> $DIR/generator-print-verbose-1.rs:47:34
+   |
+LL | fn make_non_send_generator2() -> impl Generator<Return = Arc<RefCell<i32>>> {
+   |                                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = note: required because it captures the following types: `Opaque(DefId(0:42 ~ generator_print_verbose_1[749a]::make_non_send_generator2::{opaque#0}), [])`, `()`
+note: required because it's used within this generator
+  --> $DIR/generator-print-verbose-1.rs:52:20
+   |
+LL |       let send_gen = || {
+   |  ____________________^
+LL | |         let _non_send_gen = make_non_send_generator2();
+LL | |         yield;
+LL | |     };
+   | |_____^
 note: required by a bound in `require_send`
   --> $DIR/generator-print-verbose-1.rs:26:25
    |
diff --git a/src/test/ui/generator/print/generator-print-verbose-2.stderr b/src/test/ui/generator/print/generator-print-verbose-2.stderr
index fb2a5754dd3..1356fa5f152 100644
--- a/src/test/ui/generator/print/generator-print-verbose-2.stderr
+++ b/src/test/ui/generator/print/generator-print-verbose-2.stderr
@@ -6,7 +6,16 @@ LL |     assert_send(|| {
    |
    = help: the trait `Sync` is not implemented for `Cell<i32>`
    = note: required because of the requirements on the impl of `Send` for `&'_#4r Cell<i32>`
-   = note: required because it appears within the type `[main::{closure#1} upvar_tys=(&'_#4r Cell<i32>) _#17t]`
+note: required because it's used within this generator
+  --> $DIR/generator-print-verbose-2.rs:19:17
+   |
+LL |       assert_send(|| {
+   |  _________________^
+LL | |
+LL | |         drop(&a);
+LL | |         yield;
+LL | |     });
+   | |_____^
 note: required by a bound in `assert_send`
   --> $DIR/generator-print-verbose-2.rs:10:23
    |
diff --git a/src/test/ui/generic-associated-types/collectivity-regression.rs b/src/test/ui/generic-associated-types/collectivity-regression.rs
new file mode 100644
index 00000000000..fb736843907
--- /dev/null
+++ b/src/test/ui/generic-associated-types/collectivity-regression.rs
@@ -0,0 +1,24 @@
+// Regression test from https://github.com/rust-lang/rust/pull/98109
+
+#![feature(generic_associated_types)]
+
+pub trait Get {
+    type Value<'a>
+    where
+        Self: 'a;
+}
+
+fn multiply_at<T>(x: T)
+where
+    for<'a> T: Get<Value<'a> = ()>,
+{
+    || {
+        //~^ `T` does not live long enough
+        //
+        // FIXME(#98437). This regressed at some point and
+        // probably should work.
+        let _x = x;
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/generic-associated-types/collectivity-regression.stderr b/src/test/ui/generic-associated-types/collectivity-regression.stderr
new file mode 100644
index 00000000000..a858dd7fddc
--- /dev/null
+++ b/src/test/ui/generic-associated-types/collectivity-regression.stderr
@@ -0,0 +1,14 @@
+error: `T` does not live long enough
+  --> $DIR/collectivity-regression.rs:15:5
+   |
+LL | /     || {
+LL | |
+LL | |         //
+LL | |         // FIXME(#98437). This regressed at some point and
+LL | |         // probably should work.
+LL | |         let _x = x;
+LL | |     };
+   | |_____^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/generic-associated-types/issue-70304.rs b/src/test/ui/generic-associated-types/issue-70304.rs
index 1c3d166a1af..c9fd7248a80 100644
--- a/src/test/ui/generic-associated-types/issue-70304.rs
+++ b/src/test/ui/generic-associated-types/issue-70304.rs
@@ -45,7 +45,7 @@ where
 }
 
 fn create_doc() -> impl Document<Cursor<'_> = DocCursorImpl<'_>> {
-    //~^ ERROR: missing lifetime specifier
+    //~^ ERROR `'_` cannot be used here [E0637]
     //~| ERROR: missing lifetime specifier
     DocumentImpl {}
 }
diff --git a/src/test/ui/generic-associated-types/issue-70304.stderr b/src/test/ui/generic-associated-types/issue-70304.stderr
index 08efc82c886..b3881ccb099 100644
--- a/src/test/ui/generic-associated-types/issue-70304.stderr
+++ b/src/test/ui/generic-associated-types/issue-70304.stderr
@@ -1,14 +1,8 @@
-error[E0106]: missing lifetime specifier
+error[E0637]: `'_` cannot be used here
   --> $DIR/issue-70304.rs:47:41
    |
 LL | fn create_doc() -> impl Document<Cursor<'_> = DocCursorImpl<'_>> {
-   |                                         ^^ expected named lifetime parameter
-   |
-   = help: this function's return type contains a borrowed value, but there is no value for it to be borrowed from
-help: consider using the `'static` lifetime
-   |
-LL | fn create_doc() -> impl Document<Cursor<'static> = DocCursorImpl<'_>> {
-   |                                         ~~~~~~~
+   |                                         ^^ `'_` is a reserved lifetime name
 
 error[E0106]: missing lifetime specifier
   --> $DIR/issue-70304.rs:47:61
@@ -24,4 +18,5 @@ LL | fn create_doc() -> impl Document<Cursor<'_> = DocCursorImpl<'static>> {
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0106`.
+Some errors have detailed explanations: E0106, E0637.
+For more information about an error, try `rustc --explain E0106`.
diff --git a/src/test/ui/generic-associated-types/issue-86483.rs b/src/test/ui/generic-associated-types/issue-86483.rs
index a8b54c354e3..07dd0bffd46 100644
--- a/src/test/ui/generic-associated-types/issue-86483.rs
+++ b/src/test/ui/generic-associated-types/issue-86483.rs
@@ -1,14 +1,16 @@
 // Regression test of #86483.
+//
+// Made to pass as part of fixing #98095.
+//
+// check-pass
 
 #![feature(generic_associated_types)]
 
-pub trait IceIce<T> //~ ERROR: the parameter type `T` may not live long enough
+pub trait IceIce<T>
 where
     for<'a> T: 'a,
 {
     type Ice<'v>: IntoIterator<Item = &'v T>;
-    //~^ ERROR: the parameter type `T` may not live long enough
-    //~| ERROR: the parameter type `T` may not live long enough
 }
 
 fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-86483.stderr b/src/test/ui/generic-associated-types/issue-86483.stderr
deleted file mode 100644
index a13dc043dc5..00000000000
--- a/src/test/ui/generic-associated-types/issue-86483.stderr
+++ /dev/null
@@ -1,50 +0,0 @@
-error[E0311]: the parameter type `T` may not live long enough
-  --> $DIR/issue-86483.rs:5:1
-   |
-LL | / pub trait IceIce<T>
-LL | | where
-LL | |     for<'a> T: 'a,
-LL | | {
-...  |
-LL | |
-LL | | }
-   | |_^
-   |
-   = note: ...so that the type `T` will meet its required lifetime bounds...
-note: ...that is required by this bound
-  --> $DIR/issue-86483.rs:7:16
-   |
-LL |     for<'a> T: 'a,
-   |                ^^
-help: consider adding an explicit lifetime bound...
-   |
-LL |     for<'a> T: 'a + 'a,
-   |                   ++++
-
-error[E0311]: the parameter type `T` may not live long enough
-  --> $DIR/issue-86483.rs:9:5
-   |
-LL |     type Ice<'v>: IntoIterator<Item = &'v T>;
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds...
-   |
-note: ...that is required by this bound
-  --> $DIR/issue-86483.rs:7:16
-   |
-LL |     for<'a> T: 'a,
-   |                ^^
-help: consider adding an explicit lifetime bound...
-   |
-LL |     for<'a> T: 'a + 'a,
-   |                   ++++
-
-error[E0309]: the parameter type `T` may not live long enough
-  --> $DIR/issue-86483.rs:9:32
-   |
-LL |     type Ice<'v>: IntoIterator<Item = &'v T>;
-   |                                ^^^^^^^^^^^^ - help: consider adding a where clause: `where T: 'v`
-   |                                |
-   |                                ...so that the reference type `&'v T` does not outlive the data it points at
-
-error: aborting due to 3 previous errors
-
-For more information about this error, try `rustc --explain E0309`.
diff --git a/src/test/ui/generic-associated-types/issue-91139.rs b/src/test/ui/generic-associated-types/issue-91139.rs
index 03dc8ef93fe..092fa939c30 100644
--- a/src/test/ui/generic-associated-types/issue-91139.rs
+++ b/src/test/ui/generic-associated-types/issue-91139.rs
@@ -1,5 +1,3 @@
-//check-pass
-
 #![feature(generic_associated_types)]
 
 trait Foo<T> {
@@ -16,6 +14,22 @@ impl<T> Foo<T> for () {
 
 fn foo<T>() {
     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+    //~^ ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //~| ERROR `T` does not live long enough
+    //
+    // FIXME: This error is bogus, but it arises because we try to validate
+    // that `<() as Foo<T>>::Type<'a>` is valid, which requires proving
+    // that `T: 'a`. Since `'a` is higher-ranked, this becomes
+    // `for<'a> T: 'a`, which is not true. Of course, the error is bogus
+    // because there *ought* to be an implied bound stating that `'a` is
+    // not any lifetime but specifically
+    // "some `'a` such that `<() as Foo<T>>::Type<'a>" is valid".
 }
 
 pub fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-91139.stderr b/src/test/ui/generic-associated-types/issue-91139.stderr
new file mode 100644
index 00000000000..6c5092978c8
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-91139.stderr
@@ -0,0 +1,50 @@
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:12
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: `T` does not live long enough
+  --> $DIR/issue-91139.rs:16:58
+   |
+LL |     let _: for<'a> fn(<() as Foo<T>>::Type<'a>, &'a T) = |_, _| ();
+   |                                                          ^^^^^^^^^
+
+error: aborting due to 8 previous errors
+
diff --git a/src/test/ui/generic-associated-types/issue-91883.rs b/src/test/ui/generic-associated-types/issue-91883.rs
new file mode 100644
index 00000000000..3d4585a44df
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-91883.rs
@@ -0,0 +1,42 @@
+#![feature(generic_associated_types)]
+
+use std::fmt::Debug;
+use std::marker::PhantomData;
+
+#[derive(Debug)]
+pub struct TransactionImpl<'db> {
+    _marker: PhantomData<&'db ()>,
+}
+
+#[derive(Debug)]
+pub struct CursorImpl<'txn> {
+    _marker: PhantomData<&'txn ()>,
+}
+
+pub trait Cursor<'txn> {}
+
+pub trait Transaction<'db>: Send + Sync + Debug + Sized {
+    type Cursor<'tx>: Cursor<'tx>
+    where
+        'db: 'tx,
+        Self: 'tx;
+
+    fn cursor<'tx>(&'tx self) -> Result<Self::Cursor<'tx>, ()>
+    where
+        'db: 'tx;
+}
+
+impl<'tx> Cursor<'tx> for CursorImpl<'tx> {}
+
+impl<'db> Transaction<'db> for TransactionImpl<'db> {
+    type Cursor<'tx> = CursorImpl<'tx>; //~ ERROR lifetime bound not satisfied
+
+    fn cursor<'tx>(&'tx self) -> Result<Self::Cursor<'tx>, ()>
+    where
+        'db: 'tx,
+    {
+        loop {}
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-91883.stderr b/src/test/ui/generic-associated-types/issue-91883.stderr
new file mode 100644
index 00000000000..ed700876e02
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-91883.stderr
@@ -0,0 +1,26 @@
+error[E0478]: lifetime bound not satisfied
+  --> $DIR/issue-91883.rs:32:24
+   |
+LL | /     type Cursor<'tx>: Cursor<'tx>
+LL | |     where
+LL | |         'db: 'tx,
+LL | |         Self: 'tx;
+   | |__________________- definition of `Cursor` from trait
+...
+LL |       type Cursor<'tx> = CursorImpl<'tx>;
+   |                          ^^^^^^^^^^^^^^^- help: try copying these clauses from the trait: `where 'db: 'tx, Self: 'tx`
+   |
+note: lifetime parameter instantiated with the lifetime `'db` as defined here
+  --> $DIR/issue-91883.rs:31:6
+   |
+LL | impl<'db> Transaction<'db> for TransactionImpl<'db> {
+   |      ^^^
+note: but lifetime parameter must outlive the lifetime `'tx` as defined here
+  --> $DIR/issue-91883.rs:32:17
+   |
+LL |     type Cursor<'tx> = CursorImpl<'tx>;
+   |                 ^^^
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0478`.
diff --git a/src/test/ui/generic-associated-types/issue-92096.rs b/src/test/ui/generic-associated-types/issue-92096.rs
index bfe0fc15fd3..377b8164ad5 100644
--- a/src/test/ui/generic-associated-types/issue-92096.rs
+++ b/src/test/ui/generic-associated-types/issue-92096.rs
@@ -1,5 +1,4 @@
 // edition:2018
-// check-pass
 
 #![feature(generic_associated_types)]
 
@@ -18,6 +17,14 @@ where
     C: Client + Send + Sync,
 {
     async move { c.connect().await }
+    //~^ ERROR `C` does not live long enough
+    //
+    // FIXME(#71723). This is because we infer at some point a value of
+    //
+    // impl Future<Output = <C as Client>::Connection<'_>>
+    //
+    // and then we somehow fail the WF check because `where C: 'a` is not known,
+    // but I'm not entirely sure how that comes about.
 }
 
 fn main() {}
diff --git a/src/test/ui/generic-associated-types/issue-92096.stderr b/src/test/ui/generic-associated-types/issue-92096.stderr
new file mode 100644
index 00000000000..ca61a0f435e
--- /dev/null
+++ b/src/test/ui/generic-associated-types/issue-92096.stderr
@@ -0,0 +1,8 @@
+error: `C` does not live long enough
+  --> $DIR/issue-92096.rs:19:5
+   |
+LL |     async move { c.connect().await }
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/generic-associated-types/issue-95305.rs b/src/test/ui/generic-associated-types/issue-95305.rs
index 9ead347984b..2365daada11 100644
--- a/src/test/ui/generic-associated-types/issue-95305.rs
+++ b/src/test/ui/generic-associated-types/issue-95305.rs
@@ -9,7 +9,7 @@ trait Foo {
 }
 
 fn foo(x: &impl Foo<Item<'_> = u32>) { }
-                       //~^ ERROR missing lifetime specifier
+                       //~^ ERROR `'_` cannot be used here [E0637]
 
 fn bar(x: &impl for<'a> Foo<Item<'a> = &'_ u32>) { }
                                       //~^ ERROR missing lifetime specifier
diff --git a/src/test/ui/generic-associated-types/issue-95305.stderr b/src/test/ui/generic-associated-types/issue-95305.stderr
index 2b48378dc43..8624d880d4e 100644
--- a/src/test/ui/generic-associated-types/issue-95305.stderr
+++ b/src/test/ui/generic-associated-types/issue-95305.stderr
@@ -1,13 +1,8 @@
-error[E0106]: missing lifetime specifier
+error[E0637]: `'_` cannot be used here
   --> $DIR/issue-95305.rs:11:26
    |
 LL | fn foo(x: &impl Foo<Item<'_> = u32>) { }
-   |                          ^^ expected named lifetime parameter
-   |
-help: consider introducing a named lifetime parameter
-   |
-LL | fn foo<'a>(x: &impl Foo<Item<'a> = u32>) { }
-   |       ++++                   ~~
+   |                          ^^ `'_` is a reserved lifetime name
 
 error[E0106]: missing lifetime specifier
   --> $DIR/issue-95305.rs:14:41
@@ -22,4 +17,5 @@ LL | fn bar(x: &impl for<'a> Foo<Item<'a> = &'a u32>) { }
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0106`.
+Some errors have detailed explanations: E0106, E0637.
+For more information about an error, try `rustc --explain E0106`.
diff --git a/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr b/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr
index 9eeebd80afe..1322914797b 100644
--- a/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr
+++ b/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr
@@ -3,8 +3,8 @@ error[E0599]: the method `f` exists for struct `S`, but its trait bounds were no
    |
 LL | struct S;
    | ---------
-   | |
-   | method `f` not found for this
+   | |      |
+   | |      method `f` not found for this struct
    | doesn't satisfy `<S as X>::Y<i32> = i32`
    | doesn't satisfy `S: M`
 ...
diff --git a/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr b/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr
index 76d39c88b61..1458bf0c4a4 100644
--- a/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr
+++ b/src/test/ui/generic-associated-types/parameter_number_and_kind_impl.stderr
@@ -8,7 +8,7 @@ LL |     type A = u32;
    |           ^ lifetimes do not match type in trait
 
 error[E0049]: type `B` has 1 type parameter but its trait declaration has 0 type parameters
-  --> $DIR/parameter_number_and_kind_impl.rs:17:16
+  --> $DIR/parameter_number_and_kind_impl.rs:17:12
    |
 LL |     type B<'a, 'b>;
    |            --  --
@@ -16,7 +16,9 @@ LL |     type B<'a, 'b>;
    |            expected 0 type parameters
 ...
 LL |     type B<'a, T> = Vec<T>;
-   |                ^ found 1 type parameter
+   |            ^^  ^
+   |            |
+   |            found 1 type parameter
 
 error[E0195]: lifetime parameters or bounds on type `C` do not match the trait declaration
   --> $DIR/parameter_number_and_kind_impl.rs:19:11
diff --git a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr
index 7a2441047b5..d429b4e8eff 100644
--- a/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr
+++ b/src/test/ui/half-open-range-patterns/half-open-range-pats-exhaustive-fail.stderr
@@ -7,9 +7,8 @@ LL |     m!(0f32, f32::NEG_INFINITY..);
    = note: the matched value is of type `f32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:17:8
@@ -20,9 +19,8 @@ LL |     m!(0f32, ..f32::INFINITY);
    = note: the matched value is of type `f32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `'\u{10ffff}'` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:26:8
@@ -33,9 +31,8 @@ LL |     m!('a', ..core::char::MAX);
    = note: the matched value is of type `char`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         '\u{10ffff}' => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, '\u{10ffff}' => todo!() }
+   |                                +++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `'\u{10fffe}'..='\u{10ffff}'` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:27:8
@@ -46,9 +43,8 @@ LL |     m!('a', ..ALMOST_MAX);
    = note: the matched value is of type `char`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         '\u{10fffe}'..='\u{10ffff}' => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, '\u{10fffe}'..='\u{10ffff}' => todo!() }
+   |                                ++++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `'\0'` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:28:8
@@ -59,9 +55,8 @@ LL |     m!('a', ALMOST_MIN..);
    = note: the matched value is of type `char`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         '\0' => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, '\0' => todo!() }
+   |                                +++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `'\u{10ffff}'` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:29:8
@@ -72,9 +67,8 @@ LL |     m!('a', ..=ALMOST_MAX);
    = note: the matched value is of type `char`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         '\u{10ffff}' => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, '\u{10ffff}' => todo!() }
+   |                                +++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `'b'` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:30:8
@@ -85,9 +79,8 @@ LL |     m!('a', ..=VAL | VAL_2..);
    = note: the matched value is of type `char`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         'b' => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 'b' => todo!() }
+   |                                ++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `'b'` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:31:8
@@ -98,9 +91,8 @@ LL |     m!('a', ..VAL_1 | VAL_2..);
    = note: the matched value is of type `char`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         'b' => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 'b' => todo!() }
+   |                                ++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u8::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:41:12
@@ -111,9 +103,8 @@ LL |         m!(0, ..u8::MAX);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `254_u8..=u8::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:42:12
@@ -124,9 +115,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         254_u8..=u8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 254_u8..=u8::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u8` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:43:12
@@ -137,9 +127,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u8 => todo!() }
+   |                                +++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u8::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:44:12
@@ -150,9 +139,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u8` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:45:12
@@ -163,9 +151,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u8 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u8` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:46:12
@@ -176,9 +163,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u8 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u16::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:54:12
@@ -189,9 +175,8 @@ LL |         m!(0, ..u16::MAX);
    = note: the matched value is of type `u16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u16::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u16::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `65534_u16..=u16::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:55:12
@@ -202,9 +187,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `u16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         65534_u16..=u16::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 65534_u16..=u16::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u16` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:56:12
@@ -215,9 +199,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `u16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u16 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u16 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u16::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:57:12
@@ -228,9 +211,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `u16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u16::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u16::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u16` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:58:12
@@ -241,9 +223,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `u16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u16 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u16 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u16` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:59:12
@@ -254,9 +235,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `u16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u16 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u16 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u32::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:67:12
@@ -267,9 +247,8 @@ LL |         m!(0, ..u32::MAX);
    = note: the matched value is of type `u32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u32::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u32::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `4294967294_u32..=u32::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:68:12
@@ -280,9 +259,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `u32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         4294967294_u32..=u32::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 4294967294_u32..=u32::MAX => todo!() }
+   |                                ++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u32` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:69:12
@@ -293,9 +271,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `u32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u32 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u32 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u32::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:70:12
@@ -306,9 +283,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `u32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u32::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u32::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u32` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:71:12
@@ -319,9 +295,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `u32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u32 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u32 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u32` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:72:12
@@ -332,9 +307,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `u32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u32 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u32 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u64::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:80:12
@@ -345,9 +319,8 @@ LL |         m!(0, ..u64::MAX);
    = note: the matched value is of type `u64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u64::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u64::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `18446744073709551614_u64..=u64::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:81:12
@@ -358,9 +331,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `u64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         18446744073709551614_u64..=u64::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 18446744073709551614_u64..=u64::MAX => todo!() }
+   |                                ++++++++++++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u64` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:82:12
@@ -371,9 +343,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `u64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u64 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u64 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u64::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:83:12
@@ -384,9 +355,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `u64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u64::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u64::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u64` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:84:12
@@ -397,9 +367,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `u64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u64 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u64 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u64` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:85:12
@@ -410,9 +379,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `u64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u64 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u64 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u128::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:93:12
@@ -423,9 +391,8 @@ LL |         m!(0, ..u128::MAX);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u128::MAX => todo!() }
+   |                                ++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `340282366920938463463374607431768211454_u128..=u128::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:94:12
@@ -436,9 +403,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         340282366920938463463374607431768211454_u128..=u128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 340282366920938463463374607431768211454_u128..=u128::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u128` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:95:12
@@ -449,9 +415,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u128 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u128 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u128::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:96:12
@@ -462,9 +427,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u128::MAX => todo!() }
+   |                                ++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u128` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:97:12
@@ -475,9 +439,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u128 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u128 => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_u128` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:98:12
@@ -488,9 +451,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_u128 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_u128 => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i8::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:109:12
@@ -501,9 +463,8 @@ LL |         m!(0, ..i8::MAX);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `126_i8..=i8::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:110:12
@@ -514,9 +475,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         126_i8..=i8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 126_i8..=i8::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i8::MIN` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:111:12
@@ -527,9 +487,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i8::MIN => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i8::MIN => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i8::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:112:12
@@ -540,9 +499,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i8` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:113:12
@@ -553,9 +511,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i8 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i8` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:114:12
@@ -566,9 +523,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i8 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i16::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:122:12
@@ -579,9 +535,8 @@ LL |         m!(0, ..i16::MAX);
    = note: the matched value is of type `i16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i16::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i16::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `32766_i16..=i16::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:123:12
@@ -592,9 +547,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `i16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         32766_i16..=i16::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 32766_i16..=i16::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i16::MIN` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:124:12
@@ -605,9 +559,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `i16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i16::MIN => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i16::MIN => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i16::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:125:12
@@ -618,9 +571,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `i16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i16::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i16::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i16` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:126:12
@@ -631,9 +583,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `i16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i16 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i16 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i16` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:127:12
@@ -644,9 +595,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `i16`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i16 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i16 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i32::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:135:12
@@ -657,9 +607,8 @@ LL |         m!(0, ..i32::MAX);
    = note: the matched value is of type `i32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i32::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i32::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `2147483646_i32..=i32::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:136:12
@@ -670,9 +619,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `i32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         2147483646_i32..=i32::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 2147483646_i32..=i32::MAX => todo!() }
+   |                                ++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i32::MIN` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:137:12
@@ -683,9 +631,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `i32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i32::MIN => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i32::MIN => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i32::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:138:12
@@ -696,9 +643,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `i32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i32::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i32::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i32` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:139:12
@@ -709,9 +655,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `i32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i32 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i32 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i32` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:140:12
@@ -722,9 +667,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `i32`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i32 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i32 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i64::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:148:12
@@ -735,9 +679,8 @@ LL |         m!(0, ..i64::MAX);
    = note: the matched value is of type `i64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i64::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i64::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `9223372036854775806_i64..=i64::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:149:12
@@ -748,9 +691,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `i64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         9223372036854775806_i64..=i64::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 9223372036854775806_i64..=i64::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i64::MIN` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:150:12
@@ -761,9 +703,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `i64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i64::MIN => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i64::MIN => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i64::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:151:12
@@ -774,9 +715,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `i64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i64::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i64::MAX => todo!() }
+   |                                +++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i64` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:152:12
@@ -787,9 +727,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `i64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i64 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i64 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i64` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:153:12
@@ -800,9 +739,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `i64`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i64 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i64 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i128::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:161:12
@@ -813,9 +751,8 @@ LL |         m!(0, ..i128::MAX);
    = note: the matched value is of type `i128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i128::MAX => todo!() }
+   |                                ++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `170141183460469231731687303715884105726_i128..=i128::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:162:12
@@ -826,9 +763,8 @@ LL |         m!(0, ..ALMOST_MAX);
    = note: the matched value is of type `i128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         170141183460469231731687303715884105726_i128..=i128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 170141183460469231731687303715884105726_i128..=i128::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i128::MIN` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:163:12
@@ -839,9 +775,8 @@ LL |         m!(0, ALMOST_MIN..);
    = note: the matched value is of type `i128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i128::MIN => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i128::MIN => todo!() }
+   |                                ++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i128::MAX` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:164:12
@@ -852,9 +787,8 @@ LL |         m!(0, ..=ALMOST_MAX);
    = note: the matched value is of type `i128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i128::MAX => todo!() }
+   |                                ++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i128` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:165:12
@@ -865,9 +799,8 @@ LL |         m!(0, ..=VAL | VAL_2..);
    = note: the matched value is of type `i128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i128 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i128 => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `43_i128` not covered
   --> $DIR/half-open-range-pats-exhaustive-fail.rs:166:12
@@ -878,9 +811,8 @@ LL |         m!(0, ..VAL_1 | VAL_2..);
    = note: the matched value is of type `i128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         43_i128 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 43_i128 => todo!() }
+   |                                ++++++++++++++++++++
 
 error: aborting due to 68 previous errors
 
diff --git a/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.rs b/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.rs
index b50f56b03d9..92b7c5deb81 100644
--- a/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.rs
+++ b/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.rs
@@ -1,10 +1,12 @@
 // Regression test for #88586: a higher-ranked outlives bound on Self in a trait
 // definition caused an ICE when debug_assertions were enabled.
 //
-// FIXME: The error output in the absence of the ICE is unhelpful; this should be improved.
+// Made to pass as part of fixing #98095.
+//
+// check-pass
 
-trait A where for<'a> Self: 'a
-//~^ ERROR the parameter type `Self` may not live long enough
+trait A where
+    for<'a> Self: 'a,
 {
 }
 
diff --git a/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.stderr b/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.stderr
deleted file mode 100644
index 18618ffcc86..00000000000
--- a/src/test/ui/higher-rank-trait-bounds/issue-88586-hr-self-outlives-in-trait-def.stderr
+++ /dev/null
@@ -1,19 +0,0 @@
-error[E0311]: the parameter type `Self` may not live long enough
-  --> $DIR/issue-88586-hr-self-outlives-in-trait-def.rs:6:1
-   |
-LL | / trait A where for<'a> Self: 'a
-LL | |
-LL | | {
-LL | | }
-   | |_^
-   |
-   = help: consider adding an explicit lifetime bound `Self: 'a`...
-   = note: ...so that the type `Self` will meet its required lifetime bounds...
-note: ...that is required by this bound
-  --> $DIR/issue-88586-hr-self-outlives-in-trait-def.rs:6:29
-   |
-LL | trait A where for<'a> Self: 'a
-   |                             ^^
-
-error: aborting due to previous error
-
diff --git a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-71955.stderr b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-71955.stderr
index 1e2575116a8..0bfa7b3cc7c 100644
--- a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-71955.stderr
+++ b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-71955.stderr
@@ -23,7 +23,7 @@ error[E0308]: mismatched types
 LL |     foo(bar, "string", |s| s.len() == 5);
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
    |
-   = note: expected trait `FnOnce<(&&str,)>`
+   = note: expected trait `for<'r, 's> FnOnce<(&'r &'s str,)>`
               found trait `for<'r> FnOnce<(&'r &str,)>`
 note: this closure does not fulfill the lifetime requirements
   --> $DIR/issue-71955.rs:45:24
@@ -61,7 +61,7 @@ error[E0308]: mismatched types
 LL |     foo(baz, "string", |s| s.0.len() == 5);
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ one type is more general than the other
    |
-   = note: expected trait `FnOnce<(&Wrapper<'_>,)>`
+   = note: expected trait `for<'r, 's> FnOnce<(&'r Wrapper<'s>,)>`
               found trait `for<'r> FnOnce<(&'r Wrapper<'_>,)>`
 note: this closure does not fulfill the lifetime requirements
   --> $DIR/issue-71955.rs:48:24
diff --git a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.rs b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.rs
index fe319e6c851..172bf218c0d 100644
--- a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.rs
+++ b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.rs
@@ -6,8 +6,8 @@ trait SomeTrait<'a> {
 
 fn give_me_ice<T>() {
     callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
-    //~^ ERROR the trait bound `T: SomeTrait<'_>` is not satisfied [E0277]
-    //~| ERROR the trait bound `T: SomeTrait<'_>` is not satisfied [E0277]
+    //~^ ERROR the trait bound `for<'r> T: SomeTrait<'r>` is not satisfied [E0277]
+    //~| ERROR the trait bound `for<'r> T: SomeTrait<'r>` is not satisfied [E0277]
 }
 
 fn callee<T: Fn<(&'static (),)>>() {
diff --git a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.stderr b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.stderr
index 13b68b07240..ecca4b999e7 100644
--- a/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.stderr
+++ b/src/test/ui/higher-rank-trait-bounds/normalize-under-binder/issue-85455.stderr
@@ -1,24 +1,24 @@
-error[E0277]: the trait bound `T: SomeTrait<'_>` is not satisfied
+error[E0277]: the trait bound `for<'r> T: SomeTrait<'r>` is not satisfied
   --> $DIR/issue-85455.rs:8:5
    |
 LL |     callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `SomeTrait<'_>` is not implemented for `T`
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'r> SomeTrait<'r>` is not implemented for `T`
    |
 help: consider restricting type parameter `T`
    |
-LL | fn give_me_ice<T: SomeTrait<'_>>() {
-   |                 +++++++++++++++
+LL | fn give_me_ice<T: for<'r> SomeTrait<'r>>() {
+   |                 +++++++++++++++++++++++
 
-error[E0277]: the trait bound `T: SomeTrait<'_>` is not satisfied
+error[E0277]: the trait bound `for<'r> T: SomeTrait<'r>` is not satisfied
   --> $DIR/issue-85455.rs:8:14
    |
 LL |     callee::<fn(&()) -> <T as SomeTrait<'_>>::Associated>();
-   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `SomeTrait<'_>` is not implemented for `T`
+   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `for<'r> SomeTrait<'r>` is not implemented for `T`
    |
 help: consider restricting type parameter `T`
    |
-LL | fn give_me_ice<T: SomeTrait<'_>>() {
-   |                 +++++++++++++++
+LL | fn give_me_ice<T: for<'r> SomeTrait<'r>>() {
+   |                 +++++++++++++++++++++++
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/hrtb/hrtb-just-for-static.stderr b/src/test/ui/hrtb/hrtb-just-for-static.stderr
index a5770431eaf..b4312091edb 100644
--- a/src/test/ui/hrtb/hrtb-just-for-static.stderr
+++ b/src/test/ui/hrtb/hrtb-just-for-static.stderr
@@ -2,7 +2,7 @@ error: implementation of `Foo` is not general enough
   --> $DIR/hrtb-just-for-static.rs:24:5
    |
 LL |     want_hrtb::<StaticInt>()
-   |     ^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough
+   |     ^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough
    |
    = note: `StaticInt` must implement `Foo<&'0 isize>`, for any lifetime `'0`...
    = note: ...but it actually implements `Foo<&'static isize>`
diff --git a/src/test/ui/hrtb/issue-30786.stderr b/src/test/ui/hrtb/issue-30786.stderr
index 1ee549e54a9..5a10a38d08e 100644
--- a/src/test/ui/hrtb/issue-30786.stderr
+++ b/src/test/ui/hrtb/issue-30786.stderr
@@ -3,8 +3,8 @@ error[E0599]: the method `filterx` exists for struct `Map<Repeat, [closure@$DIR/
    |
 LL | pub struct Map<S, F> {
    | --------------------
-   | |
-   | method `filterx` not found for this
+   | |          |
+   | |          method `filterx` not found for this struct
    | doesn't satisfy `_: StreamExt`
 ...
 LL |     let filter = map.filterx(|x: &_| true);
@@ -28,8 +28,8 @@ error[E0599]: the method `countx` exists for struct `Filter<Map<Repeat, for<'r>
    |
 LL | pub struct Filter<S, F> {
    | -----------------------
-   | |
-   | method `countx` not found for this
+   | |          |
+   | |          method `countx` not found for this struct
    | doesn't satisfy `_: StreamExt`
 ...
 LL |     let count = filter.countx();
diff --git a/src/test/ui/hrtb/issue-58451.stderr b/src/test/ui/hrtb/issue-58451.stderr
index d2b3b1c2aa0..22ba63c3e86 100644
--- a/src/test/ui/hrtb/issue-58451.stderr
+++ b/src/test/ui/hrtb/issue-58451.stderr
@@ -11,8 +11,8 @@ LL | fn f<I>(i: I)
    |    ^    ----
 help: provide the argument
    |
-LL |     f(&[f({_})]);
-   |         ~~~~~~
+LL |     f(&[f(/* value */)]);
+   |         ~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs b/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs
index c508c0ac9d5..359c08c98d1 100644
--- a/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs
+++ b/src/test/ui/impl-header-lifetime-elision/dyn-trait.rs
@@ -13,6 +13,10 @@ impl StaticTrait for Box<dyn Debug> { }
 trait NotStaticTrait { }
 impl NotStaticTrait for Box<dyn Debug + '_> { }
 
+// Check that we don't err when the trait has a lifetime parameter.
+trait TraitWithLifetime<'a> { }
+impl NotStaticTrait for &dyn TraitWithLifetime<'_> { }
+
 fn static_val<T: StaticTrait>(_: T) {
 }
 
diff --git a/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr b/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr
index 88c260b18cb..762698c4fc1 100644
--- a/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr
+++ b/src/test/ui/impl-header-lifetime-elision/dyn-trait.stderr
@@ -1,5 +1,5 @@
 error[E0521]: borrowed data escapes outside of function
-  --> $DIR/dyn-trait.rs:20:5
+  --> $DIR/dyn-trait.rs:24:5
    |
 LL | fn with_dyn_debug_static<'a>(x: Box<dyn Debug + 'a>) {
    |                          --  - `x` is a reference that is only valid in the function body
diff --git a/src/test/ui/impl-trait/auto-trait-leak2.rs b/src/test/ui/impl-trait/auto-trait-leak2.rs
index a464f576dc7..09450089ada 100644
--- a/src/test/ui/impl-trait/auto-trait-leak2.rs
+++ b/src/test/ui/impl-trait/auto-trait-leak2.rs
@@ -3,23 +3,37 @@ use std::rc::Rc;
 
 // Fast path, main can see the concrete type returned.
 fn before() -> impl Fn(i32) {
+//~^ NOTE within this `impl Fn
+//~| NOTE within the type `impl Fn
+//~| NOTE expansion of desugaring
     let p = Rc::new(Cell::new(0));
-    move |x| p.set(x)
+    move |x| p.set(x) //~ NOTE used within this closure
 }
 
 fn send<T: Send>(_: T) {}
+//~^ NOTE required by a bound
+//~| NOTE required by a bound
+//~| NOTE required by this bound
+//~| NOTE required by this bound
 
 fn main() {
     send(before());
     //~^ ERROR `Rc<Cell<i32>>` cannot be sent between threads safely
+    //~| NOTE `Rc<Cell<i32>>` cannot be sent between threads safely
+    //~| NOTE required by a bound
 
     send(after());
     //~^ ERROR `Rc<Cell<i32>>` cannot be sent between threads safely
+    //~| NOTE `Rc<Cell<i32>>` cannot be sent between threads safely
+    //~| NOTE required by a bound
 }
 
 // Deferred path, main has to wait until typeck finishes,
 // to check if the return type of after is Send.
 fn after() -> impl Fn(i32) {
+//~^ NOTE within this `impl Fn(i32)`
+//~| NOTE in this expansion
+//~| NOTE appears within the type
     let p = Rc::new(Cell::new(0));
-    move |x| p.set(x)
+    move |x| p.set(x) //~ NOTE used within this closure
 }
diff --git a/src/test/ui/impl-trait/auto-trait-leak2.stderr b/src/test/ui/impl-trait/auto-trait-leak2.stderr
index 37ae3c68029..d825843492d 100644
--- a/src/test/ui/impl-trait/auto-trait-leak2.stderr
+++ b/src/test/ui/impl-trait/auto-trait-leak2.stderr
@@ -1,5 +1,5 @@
 error[E0277]: `Rc<Cell<i32>>` cannot be sent between threads safely
-  --> $DIR/auto-trait-leak2.rs:13:10
+  --> $DIR/auto-trait-leak2.rs:20:10
    |
 LL | fn before() -> impl Fn(i32) {
    |                ------------ within this `impl Fn(i32)`
@@ -10,16 +10,24 @@ LL |     send(before());
    |     required by a bound introduced by this call
    |
    = help: within `impl Fn(i32)`, the trait `Send` is not implemented for `Rc<Cell<i32>>`
-   = note: required because it appears within the type `[closure@$DIR/auto-trait-leak2.rs:7:5: 7:22]`
-   = note: required because it appears within the type `impl Fn(i32)`
+note: required because it's used within this closure
+  --> $DIR/auto-trait-leak2.rs:10:5
+   |
+LL |     move |x| p.set(x)
+   |     ^^^^^^^^^^^^^^^^^
+note: required because it appears within the type `impl Fn(i32)`
+  --> $DIR/auto-trait-leak2.rs:5:16
+   |
+LL | fn before() -> impl Fn(i32) {
+   |                ^^^^^^^^^^^^
 note: required by a bound in `send`
-  --> $DIR/auto-trait-leak2.rs:10:12
+  --> $DIR/auto-trait-leak2.rs:13:12
    |
 LL | fn send<T: Send>(_: T) {}
    |            ^^^^ required by this bound in `send`
 
 error[E0277]: `Rc<Cell<i32>>` cannot be sent between threads safely
-  --> $DIR/auto-trait-leak2.rs:16:10
+  --> $DIR/auto-trait-leak2.rs:25:10
    |
 LL |     send(after());
    |     ---- ^^^^^^^ `Rc<Cell<i32>>` cannot be sent between threads safely
@@ -30,10 +38,18 @@ LL | fn after() -> impl Fn(i32) {
    |               ------------ within this `impl Fn(i32)`
    |
    = help: within `impl Fn(i32)`, the trait `Send` is not implemented for `Rc<Cell<i32>>`
-   = note: required because it appears within the type `[closure@$DIR/auto-trait-leak2.rs:24:5: 24:22]`
-   = note: required because it appears within the type `impl Fn(i32)`
+note: required because it's used within this closure
+  --> $DIR/auto-trait-leak2.rs:38:5
+   |
+LL |     move |x| p.set(x)
+   |     ^^^^^^^^^^^^^^^^^
+note: required because it appears within the type `impl Fn(i32)`
+  --> $DIR/auto-trait-leak2.rs:33:15
+   |
+LL | fn after() -> impl Fn(i32) {
+   |               ^^^^^^^^^^^^
 note: required by a bound in `send`
-  --> $DIR/auto-trait-leak2.rs:10:12
+  --> $DIR/auto-trait-leak2.rs:13:12
    |
 LL | fn send<T: Send>(_: T) {}
    |            ^^^^ required by this bound in `send`
diff --git a/src/test/ui/impl-trait/auto-trait.stderr b/src/test/ui/impl-trait/auto-trait.stderr
index 3b360f492b7..5e10272b0db 100644
--- a/src/test/ui/impl-trait/auto-trait.stderr
+++ b/src/test/ui/impl-trait/auto-trait.stderr
@@ -1,3 +1,12 @@
+error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
+  --> $DIR/auto-trait.rs:21:1
+   |
+LL | impl<T: Send> AnotherTrait for T {}
+   | -------------------------------- first implementation here
+...
+LL | impl AnotherTrait for D<OpaqueType> {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
+
 error: cannot implement trait on type alias impl trait
   --> $DIR/auto-trait.rs:21:25
    |
@@ -10,15 +19,6 @@ note: type alias impl trait defined here
 LL | type OpaqueType = impl OpaqueTrait;
    |                   ^^^^^^^^^^^^^^^^
 
-error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
-  --> $DIR/auto-trait.rs:21:1
-   |
-LL | impl<T: Send> AnotherTrait for T {}
-   | -------------------------------- first implementation here
-...
-LL | impl AnotherTrait for D<OpaqueType> {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
-
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0119`.
diff --git a/src/test/ui/impl-trait/bound-normalization-fail.stderr b/src/test/ui/impl-trait/bound-normalization-fail.stderr
index eac7e6b315e..bd8d3d3d24e 100644
--- a/src/test/ui/impl-trait/bound-normalization-fail.stderr
+++ b/src/test/ui/impl-trait/bound-normalization-fail.stderr
@@ -3,6 +3,9 @@ error[E0271]: type mismatch resolving `<Foo<()> as FooLike>::Output == <T as imp
    |
 LL |     fn foo_fail<T: Trait>() -> impl FooLike<Output = T::Assoc> {
    |                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `<Foo<()> as FooLike>::Output == <T as impl_trait::Trait>::Assoc`
+LL |
+LL |         Foo(())
+   |         ------- return type was inferred to be `Foo<()>` here
    |
 note: expected this to be `()`
   --> $DIR/bound-normalization-fail.rs:14:19
@@ -27,6 +30,9 @@ error[E0271]: type mismatch resolving `<Foo<()> as FooLike>::Output == <T as lif
    |
 LL |     fn foo2_fail<'a, T: Trait<'a>>() -> impl FooLike<Output = T::Assoc> {
    |                                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type mismatch resolving `<Foo<()> as FooLike>::Output == <T as lifetimes::Trait<'static>>::Assoc`
+...
+LL |         Foo(())
+   |         ------- return type was inferred to be `Foo<()>` here
    |
 note: expected this to be `()`
   --> $DIR/bound-normalization-fail.rs:14:19
diff --git a/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr b/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr
index 64cce056a26..8b671e7dbb3 100644
--- a/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr
+++ b/src/test/ui/impl-trait/issues/issue-21659-show-relevant-trait-impls-3.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `foo` found for struct `Bar` in the current scope
   --> $DIR/issue-21659-show-relevant-trait-impls-3.rs:20:8
    |
 LL | struct Bar;
-   | ----------- method `foo` not found for this
+   |        --- method `foo` not found for this struct
 ...
 LL |     f1.foo(1usize);
    |        ^^^ method not found in `Bar`
diff --git a/src/test/ui/impl-trait/issues/issue-62742.stderr b/src/test/ui/impl-trait/issues/issue-62742.stderr
index 70d693b8bee..44d775b695e 100644
--- a/src/test/ui/impl-trait/issues/issue-62742.stderr
+++ b/src/test/ui/impl-trait/issues/issue-62742.stderr
@@ -21,7 +21,7 @@ LL | pub struct RawImpl<T>(PhantomData<T>);
    | -------------------------------------- doesn't satisfy `RawImpl<()>: Raw<()>`
 ...
 LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>);
-   | --------------------------------------------------------------- function or associated item `foo` not found for this
+   |            -------- function or associated item `foo` not found for this struct
    |
    = note: the following trait bounds were not satisfied:
            `RawImpl<()>: Raw<()>`
diff --git a/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr b/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr
index f6bb52bf638..abd57d12d9e 100644
--- a/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr
+++ b/src/test/ui/impl-trait/method-suggestion-no-duplication.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `is_empty` found for struct `Foo` in the current s
   --> $DIR/method-suggestion-no-duplication.rs:7:15
    |
 LL | struct Foo;
-   | ----------- method `is_empty` not found for this
+   |        --- method `is_empty` not found for this struct
 ...
 LL |     foo(|s| s.is_empty());
    |               ^^^^^^^^ method not found in `Foo`
diff --git a/src/test/ui/impl-trait/negative-reasoning.stderr b/src/test/ui/impl-trait/negative-reasoning.stderr
index 98f9fbd8fef..479b451855d 100644
--- a/src/test/ui/impl-trait/negative-reasoning.stderr
+++ b/src/test/ui/impl-trait/negative-reasoning.stderr
@@ -1,3 +1,14 @@
+error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
+  --> $DIR/negative-reasoning.rs:19:1
+   |
+LL | impl<T: std::fmt::Debug> AnotherTrait for T {}
+   | ------------------------------------------- first implementation here
+...
+LL | impl AnotherTrait for D<OpaqueType> {
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
+   |
+   = note: upstream crates may add a new impl of trait `std::fmt::Debug` for type `OpaqueType` in future versions
+
 error: cannot implement trait on type alias impl trait
   --> $DIR/negative-reasoning.rs:19:25
    |
@@ -10,17 +21,6 @@ note: type alias impl trait defined here
 LL | type OpaqueType = impl OpaqueTrait;
    |                   ^^^^^^^^^^^^^^^^
 
-error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D<OpaqueType>`
-  --> $DIR/negative-reasoning.rs:19:1
-   |
-LL | impl<T: std::fmt::Debug> AnotherTrait for T {}
-   | ------------------------------------------- first implementation here
-...
-LL | impl AnotherTrait for D<OpaqueType> {
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D<OpaqueType>`
-   |
-   = note: upstream crates may add a new impl of trait `std::fmt::Debug` for type `OpaqueType` in future versions
-
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0119`.
diff --git a/src/test/ui/impl-trait/no-method-suggested-traits.stderr b/src/test/ui/impl-trait/no-method-suggested-traits.stderr
index c8ebed3bfd9..1d24f428fb1 100644
--- a/src/test/ui/impl-trait/no-method-suggested-traits.stderr
+++ b/src/test/ui/impl-trait/no-method-suggested-traits.stderr
@@ -94,7 +94,7 @@ error[E0599]: no method named `method` found for struct `Foo` in the current sco
   --> $DIR/no-method-suggested-traits.rs:40:9
    |
 LL | struct Foo;
-   | ----------- method `method` not found for this
+   |        --- method `method` not found for this struct
 ...
 LL |     Foo.method();
    |         ^^^^^^ method not found in `Foo`
@@ -201,7 +201,7 @@ error[E0599]: no method named `method3` found for struct `Foo` in the current sc
   --> $DIR/no-method-suggested-traits.rs:59:9
    |
 LL | struct Foo;
-   | ----------- method `method3` not found for this
+   |        --- method `method3` not found for this struct
 ...
 LL |     Foo.method3();
    |         ^^^^^^^ method not found in `Foo`
@@ -224,7 +224,7 @@ error[E0599]: no method named `method3` found for enum `Bar` in the current scop
   --> $DIR/no-method-suggested-traits.rs:63:12
    |
 LL | enum Bar { X }
-   | -------- method `method3` not found for this
+   |      --- method `method3` not found for this enum
 ...
 LL |     Bar::X.method3();
    |            ^^^^^^^ method not found in `Bar`
diff --git a/src/test/ui/impl-trait/printing-binder.rs b/src/test/ui/impl-trait/printing-binder.rs
new file mode 100644
index 00000000000..273b5dcdb09
--- /dev/null
+++ b/src/test/ui/impl-trait/printing-binder.rs
@@ -0,0 +1,14 @@
+trait Trait<'a> {}
+impl<T> Trait<'_> for T {}
+fn whatever() -> impl for<'a> Trait<'a> + for<'b> Trait<'b> {}
+
+fn whatever2() -> impl for<'c> Fn(&'c ()) {
+    |_: &()| {}
+}
+
+fn main() {
+    let x: u32 = whatever();
+    //~^ ERROR mismatched types
+    let x2: u32 = whatever2();
+    //~^ ERROR mismatched types
+}
diff --git a/src/test/ui/impl-trait/printing-binder.stderr b/src/test/ui/impl-trait/printing-binder.stderr
new file mode 100644
index 00000000000..5ffec8af102
--- /dev/null
+++ b/src/test/ui/impl-trait/printing-binder.stderr
@@ -0,0 +1,31 @@
+error[E0308]: mismatched types
+  --> $DIR/printing-binder.rs:10:18
+   |
+LL | fn whatever() -> impl for<'a> Trait<'a> + for<'b> Trait<'b> {}
+   |                  ------------------------------------------ the found opaque type
+...
+LL |     let x: u32 = whatever();
+   |            ---   ^^^^^^^^^^ expected `u32`, found opaque type
+   |            |
+   |            expected due to this
+   |
+   = note:     expected type `u32`
+           found opaque type `impl for<'a> Trait<'a> + for<'b> Trait<'b>`
+
+error[E0308]: mismatched types
+  --> $DIR/printing-binder.rs:12:19
+   |
+LL | fn whatever2() -> impl for<'c> Fn(&'c ()) {
+   |                   ----------------------- the found opaque type
+...
+LL |     let x2: u32 = whatever2();
+   |             ---   ^^^^^^^^^^^ expected `u32`, found opaque type
+   |             |
+   |             expected due to this
+   |
+   = note:     expected type `u32`
+           found opaque type `impl for<'c> Fn(&'c ())`
+
+error: aborting due to 2 previous errors
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/impl-trait/suggest-calling-rpit-closure.rs b/src/test/ui/impl-trait/suggest-calling-rpit-closure.rs
new file mode 100644
index 00000000000..640156291a3
--- /dev/null
+++ b/src/test/ui/impl-trait/suggest-calling-rpit-closure.rs
@@ -0,0 +1,12 @@
+fn whatever() -> i32 {
+    opaque()
+//~^ ERROR mismatched types
+}
+
+fn opaque() -> impl Fn() -> i32 {
+    || 0
+}
+
+fn main() {
+    let _ = whatever();
+}
diff --git a/src/test/ui/impl-trait/suggest-calling-rpit-closure.stderr b/src/test/ui/impl-trait/suggest-calling-rpit-closure.stderr
new file mode 100644
index 00000000000..2a328a0e6f5
--- /dev/null
+++ b/src/test/ui/impl-trait/suggest-calling-rpit-closure.stderr
@@ -0,0 +1,21 @@
+error[E0308]: mismatched types
+  --> $DIR/suggest-calling-rpit-closure.rs:2:5
+   |
+LL | fn whatever() -> i32 {
+   |                  --- expected `i32` because of return type
+LL |     opaque()
+   |     ^^^^^^^^ expected `i32`, found opaque type
+...
+LL | fn opaque() -> impl Fn() -> i32 {
+   |                ---------------- the found opaque type
+   |
+   = note:     expected type `i32`
+           found opaque type `impl Fn() -> i32`
+help: use parentheses to call this closure
+   |
+LL |     opaque()()
+   |             ++
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/issues/issue-24883.rs b/src/test/ui/imports/issue-24883.rs
index 819a20ddbda..819a20ddbda 100644
--- a/src/test/ui/issues/issue-24883.rs
+++ b/src/test/ui/imports/issue-24883.rs
diff --git a/src/test/ui/issues/issue-68103.rs b/src/test/ui/imports/issue-68103.rs
index e775678fc60..e775678fc60 100644
--- a/src/test/ui/issues/issue-68103.rs
+++ b/src/test/ui/imports/issue-68103.rs
diff --git a/src/test/ui/inference/cannot-infer-closure-circular.rs b/src/test/ui/inference/cannot-infer-closure-circular.rs
index ae879db68ec..affb481496d 100644
--- a/src/test/ui/inference/cannot-infer-closure-circular.rs
+++ b/src/test/ui/inference/cannot-infer-closure-circular.rs
@@ -4,10 +4,10 @@ fn main() {
     // error handles this gracefully, and in particular doesn't generate an extra
     // note about the `?` operator in the closure body, which isn't relevant to
     // the inference.
-    let x = |r| {
+    let x = |r| { //~ ERROR type annotations needed for `Result<(), E>`
         let v = r?;
         Ok(v)
     };
 
-    let _ = x(x(Ok(())));  //~ ERROR type annotations needed for `Result<(), E>`
+    let _ = x(x(Ok(())));
 }
diff --git a/src/test/ui/inference/cannot-infer-closure-circular.stderr b/src/test/ui/inference/cannot-infer-closure-circular.stderr
index 3ad8e3cda16..b706cd2bc36 100644
--- a/src/test/ui/inference/cannot-infer-closure-circular.stderr
+++ b/src/test/ui/inference/cannot-infer-closure-circular.stderr
@@ -1,13 +1,13 @@
 error[E0282]: type annotations needed for `Result<(), E>`
-  --> $DIR/cannot-infer-closure-circular.rs:12:9
+  --> $DIR/cannot-infer-closure-circular.rs:7:14
    |
-LL |     let _ = x(x(Ok(())));
-   |         ^
+LL |     let x = |r| {
+   |              ^
    |
-help: consider giving this pattern a type, where the type for type parameter `E` is specified
+help: consider giving this closure parameter an explicit type, where the type for type parameter `E` is specified
    |
-LL |     let _: Result<(), E> = x(x(Ok(())));
-   |          +++++++++++++++
+LL |     let x = |r: Result<(), E>| {
+   |               +++++++++++++++
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-72690.rs b/src/test/ui/inference/issue-72690.rs
index 8c0a0f51a21..8c0a0f51a21 100644
--- a/src/test/ui/issues/issue-72690.rs
+++ b/src/test/ui/inference/issue-72690.rs
diff --git a/src/test/ui/issues/issue-72690.stderr b/src/test/ui/inference/issue-72690.stderr
index 9edf14ef291..9edf14ef291 100644
--- a/src/test/ui/issues/issue-72690.stderr
+++ b/src/test/ui/inference/issue-72690.stderr
diff --git a/src/test/ui/infinite/infinite-autoderef.stderr b/src/test/ui/infinite/infinite-autoderef.stderr
index 2e950dbb8c7..edf8a44b7e4 100644
--- a/src/test/ui/infinite/infinite-autoderef.stderr
+++ b/src/test/ui/infinite/infinite-autoderef.stderr
@@ -43,7 +43,7 @@ error[E0599]: no method named `bar` found for struct `Foo` in the current scope
   --> $DIR/infinite-autoderef.rs:25:9
    |
 LL | struct Foo;
-   | ----------- method `bar` not found for this
+   |        --- method `bar` not found for this struct
 ...
 LL |     Foo.bar();
    |         ^^^ method not found in `Foo`
diff --git a/src/test/ui/interior-mutability/interior-mutability.stderr b/src/test/ui/interior-mutability/interior-mutability.stderr
index cb22d5adb71..66fe3c74e2c 100644
--- a/src/test/ui/interior-mutability/interior-mutability.stderr
+++ b/src/test/ui/interior-mutability/interior-mutability.stderr
@@ -7,7 +7,11 @@ LL |     catch_unwind(|| { x.set(23); });
    = help: within `Cell<i32>`, the trait `RefUnwindSafe` is not implemented for `UnsafeCell<i32>`
    = note: required because it appears within the type `Cell<i32>`
    = note: required because of the requirements on the impl of `UnwindSafe` for `&Cell<i32>`
-   = note: required because it appears within the type `[closure@$DIR/interior-mutability.rs:5:18: 5:35]`
+note: required because it's used within this closure
+  --> $DIR/interior-mutability.rs:5:18
+   |
+LL |     catch_unwind(|| { x.set(23); });
+   |                  ^^^^^^^^^^^^^^^^^
 note: required by a bound in `catch_unwind`
   --> $SRC_DIR/std/src/panic.rs:LL:COL
    |
diff --git a/src/test/ui/issue-94866.rs b/src/test/ui/issue-94866.rs
new file mode 100644
index 00000000000..c4203487936
--- /dev/null
+++ b/src/test/ui/issue-94866.rs
@@ -0,0 +1,14 @@
+macro_rules! m {
+    () => {
+        {}
+    };
+}
+
+enum Enum { A, B }
+
+fn main() {
+    match Enum::A {
+    //~^ ERROR non-exhaustive patterns
+    Enum::A => m!()
+    }
+}
diff --git a/src/test/ui/issue-94866.stderr b/src/test/ui/issue-94866.stderr
new file mode 100644
index 00000000000..5477d83f449
--- /dev/null
+++ b/src/test/ui/issue-94866.stderr
@@ -0,0 +1,21 @@
+error[E0004]: non-exhaustive patterns: `B` not covered
+  --> $DIR/issue-94866.rs:10:11
+   |
+LL |     match Enum::A {
+   |           ^^^^^^^ pattern `B` not covered
+   |
+note: `Enum` defined here
+  --> $DIR/issue-94866.rs:7:16
+   |
+LL | enum Enum { A, B }
+   |      ----      ^ not covered
+   = note: the matched value is of type `Enum`
+help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
+   |
+LL ~     Enum::A => m!(),
+LL +     B => todo!()
+   |
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0004`.
diff --git a/src/test/ui/issues-71798.stderr b/src/test/ui/issues-71798.stderr
index ab72c3e41af..829d0a02ec9 100644
--- a/src/test/ui/issues-71798.stderr
+++ b/src/test/ui/issues-71798.stderr
@@ -9,6 +9,9 @@ error[E0277]: `u32` is not a future
    |
 LL | fn test_ref(x: &u32) -> impl std::future::Future<Output = u32> + '_ {
    |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `u32` is not a future
+LL |
+LL |     *x
+   |     -- return type was inferred to be `u32` here
    |
    = help: the trait `Future` is not implemented for `u32`
    = note: u32 must be a future or must implement `IntoFuture` to be awaited
diff --git a/src/test/ui/issues/issue-18819.stderr b/src/test/ui/issues/issue-18819.stderr
index db228fded6e..6499dd0d81b 100644
--- a/src/test/ui/issues/issue-18819.stderr
+++ b/src/test/ui/issues/issue-18819.stderr
@@ -20,8 +20,8 @@ LL |     print_x(&X);
    |             ~~
 help: provide the argument
    |
-LL |     print_x({&dyn Foo<Item = bool>}, {&str});
-   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |     print_x(/* &dyn Foo<Item = bool> */, /* &str */);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-19692.stderr b/src/test/ui/issues/issue-19692.stderr
index b412d7bc704..7a72a5ff11a 100644
--- a/src/test/ui/issues/issue-19692.stderr
+++ b/src/test/ui/issues/issue-19692.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `kaname` found for struct `Homura` in the current
   --> $DIR/issue-19692.rs:4:40
    |
 LL | struct Homura;
-   | -------------- method `kaname` not found for this
+   |        ------ method `kaname` not found for this struct
 ...
 LL |     let Some(ref madoka) = Some(homura.kaname());
    |                                        ^^^^^^ method not found in `Homura`
diff --git a/src/test/ui/issues/issue-22706.stderr b/src/test/ui/issues/issue-22706.stderr
index 66911f081d7..5366a36b1a6 100644
--- a/src/test/ui/issues/issue-22706.stderr
+++ b/src/test/ui/issues/issue-22706.stderr
@@ -4,7 +4,7 @@ error[E0109]: type arguments are not allowed on module `marker`
 LL | fn is_copy<T: ::std::marker<i32>::Copy>() {}
    |                      ------ ^^^ type argument not allowed
    |                      |
-   |                      not allowed on this
+   |                      not allowed on module `marker`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-22933-2.stderr b/src/test/ui/issues/issue-22933-2.stderr
index 0bfbf538486..648912a9690 100644
--- a/src/test/ui/issues/issue-22933-2.stderr
+++ b/src/test/ui/issues/issue-22933-2.stderr
@@ -2,7 +2,7 @@ error[E0599]: no variant or associated item named `PIE` found for enum `Deliciou
   --> $DIR/issue-22933-2.rs:4:55
    |
 LL | enum Delicious {
-   | -------------- variant or associated item `PIE` not found here
+   |      --------- variant or associated item `PIE` not found for this enum
 ...
 LL |     ApplePie = Delicious::Apple as isize | Delicious::PIE as isize,
    |                                                       ^^^
diff --git a/src/test/ui/issues/issue-23173.stderr b/src/test/ui/issues/issue-23173.stderr
index 89f70fda786..052ccd07d41 100644
--- a/src/test/ui/issues/issue-23173.stderr
+++ b/src/test/ui/issues/issue-23173.stderr
@@ -2,7 +2,7 @@ error[E0599]: no variant or associated item named `Homura` found for enum `Token
   --> $DIR/issue-23173.rs:9:23
    |
 LL | enum Token { LeftParen, RightParen, Plus, Minus, /* etc */ }
-   | ---------- variant or associated item `Homura` not found here
+   |      ----- variant or associated item `Homura` not found for this enum
 ...
 LL |     use_token(&Token::Homura);
    |                       ^^^^^^ variant or associated item not found in `Token`
@@ -11,7 +11,7 @@ error[E0599]: no function or associated item named `method` found for struct `St
   --> $DIR/issue-23173.rs:10:13
    |
 LL | struct Struct {
-   | ------------- function or associated item `method` not found for this
+   |        ------ function or associated item `method` not found for this struct
 ...
 LL |     Struct::method();
    |             ^^^^^^ function or associated item not found in `Struct`
@@ -20,7 +20,7 @@ error[E0599]: no function or associated item named `method` found for struct `St
   --> $DIR/issue-23173.rs:11:13
    |
 LL | struct Struct {
-   | ------------- function or associated item `method` not found for this
+   |        ------ function or associated item `method` not found for this struct
 ...
 LL |     Struct::method;
    |             ^^^^^^ function or associated item not found in `Struct`
@@ -29,7 +29,7 @@ error[E0599]: no associated item named `Assoc` found for struct `Struct` in the
   --> $DIR/issue-23173.rs:12:13
    |
 LL | struct Struct {
-   | ------------- associated item `Assoc` not found for this
+   |        ------ associated item `Assoc` not found for this struct
 ...
 LL |     Struct::Assoc;
    |             ^^^^^ associated item not found in `Struct`
diff --git a/src/test/ui/issues/issue-23217.stderr b/src/test/ui/issues/issue-23217.stderr
index a81b459a34c..c5906b8805d 100644
--- a/src/test/ui/issues/issue-23217.stderr
+++ b/src/test/ui/issues/issue-23217.stderr
@@ -2,7 +2,7 @@ error[E0599]: no variant or associated item named `A` found for enum `SomeEnum`
   --> $DIR/issue-23217.rs:2:19
    |
 LL | pub enum SomeEnum {
-   | ----------------- variant or associated item `A` not found here
+   |          -------- variant or associated item `A` not found for this enum
 LL |     B = SomeEnum::A,
    |                   ^
    |                   |
diff --git a/src/test/ui/issues/issue-2823.stderr b/src/test/ui/issues/issue-2823.stderr
index b3bc946292f..fcc007a4a88 100644
--- a/src/test/ui/issues/issue-2823.stderr
+++ b/src/test/ui/issues/issue-2823.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `clone` found for struct `C` in the current scope
   --> $DIR/issue-2823.rs:13:16
    |
 LL | struct C {
-   | -------- method `clone` not found for this
+   |        - method `clone` not found for this struct
 ...
 LL |     let _d = c.clone();
    |                ^^^^^ method not found in `C`
diff --git a/src/test/ui/issues/issue-28971.stderr b/src/test/ui/issues/issue-28971.stderr
index 2736ee881d5..e0a65e33c44 100644
--- a/src/test/ui/issues/issue-28971.stderr
+++ b/src/test/ui/issues/issue-28971.stderr
@@ -2,7 +2,7 @@ error[E0599]: no variant or associated item named `Baz` found for enum `Foo` in
   --> $DIR/issue-28971.rs:7:18
    |
 LL | enum Foo {
-   | -------- variant or associated item `Baz` not found here
+   |      --- variant or associated item `Baz` not found for this enum
 ...
 LL |             Foo::Baz(..) => (),
    |                  ^^^
diff --git a/src/test/ui/issues/issue-3044.stderr b/src/test/ui/issues/issue-3044.stderr
index 5bb07cfda21..6dbe6b59391 100644
--- a/src/test/ui/issues/issue-3044.stderr
+++ b/src/test/ui/issues/issue-3044.stderr
@@ -25,7 +25,7 @@ LL |     fn fold<B, F>(mut self, init: B, mut f: F) -> B
 help: provide the argument
    |
 LL ~     needlesArr.iter().fold(|x, y| {
-LL ~     }, {_});
+LL ~     }, /* value */);
    |
 
 error: aborting due to 2 previous errors
diff --git a/src/test/ui/issues/issue-37515.rs b/src/test/ui/issues/issue-37515.rs
index caff507c918..b3a870d505a 100644
--- a/src/test/ui/issues/issue-37515.rs
+++ b/src/test/ui/issues/issue-37515.rs
@@ -3,6 +3,6 @@
 #![warn(unused)]
 
 type Z = dyn for<'x> Send;
-//~^ WARN type alias is never used
+//~^ WARN type alias `Z` is never used
 
 fn main() {}
diff --git a/src/test/ui/issues/issue-37515.stderr b/src/test/ui/issues/issue-37515.stderr
index 204a39bc8e8..c9bb4c10010 100644
--- a/src/test/ui/issues/issue-37515.stderr
+++ b/src/test/ui/issues/issue-37515.stderr
@@ -1,4 +1,4 @@
-warning: type alias is never used: `Z`
+warning: type alias `Z` is never used
   --> $DIR/issue-37515.rs:5:1
    |
 LL | type Z = dyn for<'x> Send;
diff --git a/src/test/ui/issues/issue-38919.stderr b/src/test/ui/issues/issue-38919.stderr
index 0022065a32c..f9ab8a51507 100644
--- a/src/test/ui/issues/issue-38919.stderr
+++ b/src/test/ui/issues/issue-38919.stderr
@@ -1,6 +1,8 @@
 error[E0599]: no associated item named `Item` found for type parameter `T` in the current scope
   --> $DIR/issue-38919.rs:2:8
    |
+LL | fn foo<T: Iterator>() {
+   |        - associated item `Item` not found for this type parameter
 LL |     T::Item;
    |        ^^^^ associated item not found in `T`
 
diff --git a/src/test/ui/issues/issue-41880.stderr b/src/test/ui/issues/issue-41880.stderr
index 017dd831f71..a52dc0c9af0 100644
--- a/src/test/ui/issues/issue-41880.stderr
+++ b/src/test/ui/issues/issue-41880.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `iter` found for struct `Iterate` in the current s
   --> $DIR/issue-41880.rs:27:24
    |
 LL | pub struct Iterate<T, F> {
-   | ------------------------ method `iter` not found for this
+   |            ------- method `iter` not found for this struct
 ...
 LL |     println!("{:?}", a.iter().take(10).collect::<Vec<usize>>());
    |                        ^^^^ method not found in `Iterate<{integer}, [closure@$DIR/issue-41880.rs:26:24: 26:31]>`
diff --git a/src/test/ui/issues/issue-57924.stderr b/src/test/ui/issues/issue-57924.stderr
index 211b0dde48c..0323a4dfb8a 100644
--- a/src/test/ui/issues/issue-57924.stderr
+++ b/src/test/ui/issues/issue-57924.stderr
@@ -4,7 +4,7 @@ error[E0109]: type arguments are not allowed on self constructor
 LL |         Self::<E>(e)
    |         ----   ^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self constructor
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-60989.stderr b/src/test/ui/issues/issue-60989.stderr
index 9076f4f9385..e0236567b2f 100644
--- a/src/test/ui/issues/issue-60989.stderr
+++ b/src/test/ui/issues/issue-60989.stderr
@@ -4,7 +4,7 @@ error[E0109]: type arguments are not allowed on local variable
 LL |     c1::<()>;
    |     --   ^^ type argument not allowed
    |     |
-   |     not allowed on this
+   |     not allowed on local variable
 
 error[E0109]: type arguments are not allowed on local variable
   --> $DIR/issue-60989.rs:16:10
@@ -12,7 +12,7 @@ error[E0109]: type arguments are not allowed on local variable
 LL |     c1::<dyn Into<B>>;
    |     --   ^^^^^^^^^^^ type argument not allowed
    |     |
-   |     not allowed on this
+   |     not allowed on local variable
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/issues/issue-64430.stderr b/src/test/ui/issues/issue-64430.stderr
index e7a244e9df5..a25b6b8802a 100644
--- a/src/test/ui/issues/issue-64430.stderr
+++ b/src/test/ui/issues/issue-64430.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `bar` found for struct `Foo` in the current scope
   --> $DIR/issue-64430.rs:7:9
    |
 LL | pub struct Foo;
-   | --------------- method `bar` not found for this
+   |            --- method `bar` not found for this struct
 ...
 LL |     Foo.bar()
    |         ^^^ method not found in `Foo`
diff --git a/src/test/ui/issues/issue-76077.rs b/src/test/ui/issues/issue-76077.rs
index 1ecd37de2e1..2d29093b01b 100644
--- a/src/test/ui/issues/issue-76077.rs
+++ b/src/test/ui/issues/issue-76077.rs
@@ -6,5 +6,5 @@ pub mod foo {
 
 fn main() {
     foo::Foo {};
-    //~^ ERROR cannot construct `Foo` with struct literal syntax due to inaccessible fields
+    //~^ ERROR cannot construct `Foo` with struct literal syntax due to private fields
 }
diff --git a/src/test/ui/issues/issue-76077.stderr b/src/test/ui/issues/issue-76077.stderr
index d834ec5e0ed..197ca8d5a7b 100644
--- a/src/test/ui/issues/issue-76077.stderr
+++ b/src/test/ui/issues/issue-76077.stderr
@@ -1,8 +1,10 @@
-error: cannot construct `Foo` with struct literal syntax due to inaccessible fields
+error: cannot construct `Foo` with struct literal syntax due to private fields
   --> $DIR/issue-76077.rs:8:5
    |
 LL |     foo::Foo {};
    |     ^^^^^^^^
+   |
+   = note: ... and other private field `you_cant_use_this_field` that was not provided
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/issues/issue-7950.stderr b/src/test/ui/issues/issue-7950.stderr
index 73e13c65cf3..2a683c2d55a 100644
--- a/src/test/ui/issues/issue-7950.stderr
+++ b/src/test/ui/issues/issue-7950.stderr
@@ -2,7 +2,7 @@ error[E0599]: no function or associated item named `bar` found for struct `Foo`
   --> $DIR/issue-7950.rs:6:10
    |
 LL | struct Foo;
-   | ----------- function or associated item `bar` not found for this
+   |        --- function or associated item `bar` not found for this struct
 ...
 LL |     Foo::bar();
    |          ^^^ function or associated item not found in `Foo`
diff --git a/src/test/ui/issues/issue-98299.rs b/src/test/ui/issues/issue-98299.rs
new file mode 100644
index 00000000000..63c058f91fc
--- /dev/null
+++ b/src/test/ui/issues/issue-98299.rs
@@ -0,0 +1,18 @@
+use std::convert::TryFrom;
+
+pub fn test_usage(p: ()) {
+    SmallCString::try_from(p).map(|cstr| cstr);
+    //~^ ERROR: type annotations needed
+}
+
+pub struct SmallCString<const N: usize> {}
+
+impl<const N: usize> TryFrom<()> for SmallCString<N> {
+    type Error = ();
+
+    fn try_from(path: ()) -> Result<Self, Self::Error> {
+        unimplemented!();
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/issues/issue-98299.stderr b/src/test/ui/issues/issue-98299.stderr
new file mode 100644
index 00000000000..a61bffa91e7
--- /dev/null
+++ b/src/test/ui/issues/issue-98299.stderr
@@ -0,0 +1,9 @@
+error[E0282]: type annotations needed
+  --> $DIR/issue-98299.rs:4:5
+   |
+LL |     SmallCString::try_from(p).map(|cstr| cstr);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot infer type for enum `Result<SmallCString<{_: usize}>, ()>`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0282`.
diff --git a/src/test/ui/kindck/kindck-nonsendable-1.stderr b/src/test/ui/kindck/kindck-nonsendable-1.stderr
index b3ebe7f5c7d..727573a0be4 100644
--- a/src/test/ui/kindck/kindck-nonsendable-1.stderr
+++ b/src/test/ui/kindck/kindck-nonsendable-1.stderr
@@ -7,7 +7,11 @@ LL |     bar(move|| foo(x));
    |     `Rc<usize>` cannot be sent between threads safely
    |
    = help: within `[closure@$DIR/kindck-nonsendable-1.rs:9:9: 9:22]`, the trait `Send` is not implemented for `Rc<usize>`
-   = note: required because it appears within the type `[closure@$DIR/kindck-nonsendable-1.rs:9:9: 9:22]`
+note: required because it's used within this closure
+  --> $DIR/kindck-nonsendable-1.rs:9:9
+   |
+LL |     bar(move|| foo(x));
+   |         ^^^^^^^^^^^^^
 note: required by a bound in `bar`
   --> $DIR/kindck-nonsendable-1.rs:5:21
    |
diff --git a/src/test/ui/lexical-scopes.stderr b/src/test/ui/lexical-scopes.stderr
index 1e6a35ed479..3b2a062c1c2 100644
--- a/src/test/ui/lexical-scopes.stderr
+++ b/src/test/ui/lexical-scopes.stderr
@@ -7,6 +7,8 @@ LL |     let t = T { i: 0 };
 error[E0599]: no function or associated item named `f` found for type parameter `Foo` in the current scope
   --> $DIR/lexical-scopes.rs:10:10
    |
+LL | fn g<Foo>() {
+   |      --- function or associated item `f` not found for this type parameter
 LL |     Foo::f();
    |          ^ function or associated item not found in `Foo`
 
diff --git a/src/test/ui/lifetimes/elided-lifetime-in-path-in-pat.rs b/src/test/ui/lifetimes/elided-lifetime-in-path-in-pat.rs
new file mode 100644
index 00000000000..ff84d251149
--- /dev/null
+++ b/src/test/ui/lifetimes/elided-lifetime-in-path-in-pat.rs
@@ -0,0 +1,13 @@
+// check-pass
+
+struct Foo<'a> {
+    x: &'a (),
+}
+
+// The lifetime in pattern-position `Foo` is elided.
+// Verify that lowering does not create an independent lifetime parameter for it.
+fn foo<'a>(Foo { x }: Foo<'a>) {
+    *x
+}
+
+fn main() {}
diff --git a/src/test/ui/lifetimes/issue-97194.rs b/src/test/ui/lifetimes/issue-97194.rs
index accb4a99830..5f3560dbe94 100644
--- a/src/test/ui/lifetimes/issue-97194.rs
+++ b/src/test/ui/lifetimes/issue-97194.rs
@@ -2,7 +2,7 @@ extern "C" {
     fn bget(&self, index: [usize; Self::DIM]) -> bool {
         //~^ ERROR incorrect function inside `extern` block
         //~| ERROR `self` parameter is only allowed in associated functions
-        //~| ERROR use of undeclared type `Self`
+        //~| ERROR failed to resolve: `Self`
         type T<'a> = &'a str;
     }
 }
diff --git a/src/test/ui/lifetimes/issue-97194.stderr b/src/test/ui/lifetimes/issue-97194.stderr
index 15ad5aadf9f..93bde285a99 100644
--- a/src/test/ui/lifetimes/issue-97194.stderr
+++ b/src/test/ui/lifetimes/issue-97194.stderr
@@ -25,11 +25,11 @@ LL |     fn bget(&self, index: [usize; Self::DIM]) -> bool {
    |
    = note: associated functions are those in `impl` or `trait` definitions
 
-error[E0433]: failed to resolve: use of undeclared type `Self`
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
   --> $DIR/issue-97194.rs:2:35
    |
 LL |     fn bget(&self, index: [usize; Self::DIM]) -> bool {
-   |                                   ^^^^ use of undeclared type `Self`
+   |                                   ^^^^ `Self` is only available in impls, traits, and type definitions
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/lifetimes/lifetime-errors/ex3-both-anon-regions-using-trait-objects.stderr b/src/test/ui/lifetimes/lifetime-errors/ex3-both-anon-regions-using-trait-objects.stderr
index cce0a31bfbb..d85ea6529f6 100644
--- a/src/test/ui/lifetimes/lifetime-errors/ex3-both-anon-regions-using-trait-objects.stderr
+++ b/src/test/ui/lifetimes/lifetime-errors/ex3-both-anon-regions-using-trait-objects.stderr
@@ -10,8 +10,8 @@ LL |   y.push(z);
    |
 help: consider introducing a named lifetime parameter
    |
-LL | fn foo<'a>(x:Box<dyn Fn(&'a u8, &'a u8)> , y: Vec<&u8>, z: &u8) {
-   |       ++++               ++      ++
+LL | fn foo<'a>(x:Box<dyn Fn(&u8, &u8)> , y: Vec<&'a u8>, z: &'a u8) {
+   |       ++++                                   ++          ++
 
 error[E0596]: cannot borrow `y` as mutable, as it is not declared as mutable
   --> $DIR/ex3-both-anon-regions-using-trait-objects.rs:2:3
diff --git a/src/test/ui/limits/issue-55878.stderr b/src/test/ui/limits/issue-55878.stderr
index 90411353f08..1402d138703 100644
--- a/src/test/ui/limits/issue-55878.stderr
+++ b/src/test/ui/limits/issue-55878.stderr
@@ -23,3 +23,15 @@ LL |     println!("Size: {}", std::mem::size_of::<[u8; u64::MAX as usize]>());
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0080`.
+Future incompatibility report: Future breakage diagnostic:
+error: erroneous constant used
+  --> $DIR/issue-55878.rs:7:26
+   |
+LL |     println!("Size: {}", std::mem::size_of::<[u8; u64::MAX as usize]>());
+   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ referenced constant has errors
+   |
+   = note: `#[deny(const_err)]` on by default
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+   = note: this error originates in the macro `$crate::format_args_nl` (in Nightly builds, run with -Z macro-backtrace for more info)
+
diff --git a/src/test/ui/lint/dead-code/basic.rs b/src/test/ui/lint/dead-code/basic.rs
index 2b69985d33d..3b8ffd58cb5 100644
--- a/src/test/ui/lint/dead-code/basic.rs
+++ b/src/test/ui/lint/dead-code/basic.rs
@@ -1,7 +1,7 @@
 #![deny(dead_code)]
 #![allow(unreachable_code)]
 
-fn foo() { //~ ERROR function is never used
+fn foo() { //~ ERROR function `foo` is never used
 
     // none of these should have any dead_code exposed to the user
     panic!();
diff --git a/src/test/ui/lint/dead-code/basic.stderr b/src/test/ui/lint/dead-code/basic.stderr
index f7b9b9c613a..7d068cead44 100644
--- a/src/test/ui/lint/dead-code/basic.stderr
+++ b/src/test/ui/lint/dead-code/basic.stderr
@@ -1,4 +1,4 @@
-error: function is never used: `foo`
+error: function `foo` is never used
   --> $DIR/basic.rs:4:4
    |
 LL | fn foo() {
diff --git a/src/test/ui/lint/dead-code/const-and-self.rs b/src/test/ui/lint/dead-code/const-and-self.rs
index 0bcdd6edf0d..5c96e4d0ecb 100644
--- a/src/test/ui/lint/dead-code/const-and-self.rs
+++ b/src/test/ui/lint/dead-code/const-and-self.rs
@@ -30,8 +30,8 @@ impl Foo<Y> for X {
 
 enum E {
     A,
-    B, //~ WARN variant is never constructed: `B`
-    C, //~ WARN variant is never constructed: `C`
+    B, //~ WARN variants `B` and `C` are never constructed
+    C,
 }
 
 type F = E;
diff --git a/src/test/ui/lint/dead-code/const-and-self.stderr b/src/test/ui/lint/dead-code/const-and-self.stderr
index c0e406189e8..9d1d7d6ecde 100644
--- a/src/test/ui/lint/dead-code/const-and-self.stderr
+++ b/src/test/ui/lint/dead-code/const-and-self.stderr
@@ -1,8 +1,13 @@
-warning: variant is never constructed: `B`
+warning: variants `B` and `C` are never constructed
   --> $DIR/const-and-self.rs:33:5
    |
+LL | enum E {
+   |      - variants in this enum
+LL |     A,
 LL |     B,
    |     ^
+LL |     C,
+   |     ^
    |
 note: the lint level is defined here
   --> $DIR/const-and-self.rs:3:9
@@ -10,11 +15,5 @@ note: the lint level is defined here
 LL | #![warn(dead_code)]
    |         ^^^^^^^^^
 
-warning: variant is never constructed: `C`
-  --> $DIR/const-and-self.rs:34:5
-   |
-LL |     C,
-   |     ^
-
-warning: 2 warnings emitted
+warning: 1 warning emitted
 
diff --git a/src/test/ui/lint/dead-code/empty-unused-enum.rs b/src/test/ui/lint/dead-code/empty-unused-enum.rs
index 834681d77e6..864501e9495 100644
--- a/src/test/ui/lint/dead-code/empty-unused-enum.rs
+++ b/src/test/ui/lint/dead-code/empty-unused-enum.rs
@@ -1,5 +1,5 @@
 #![deny(unused)]
 
-enum E {} //~ ERROR enum is never used
+enum E {} //~ ERROR enum `E` is never used
 
 fn main() {}
diff --git a/src/test/ui/lint/dead-code/empty-unused-enum.stderr b/src/test/ui/lint/dead-code/empty-unused-enum.stderr
index ed9a7ccd14b..6391f0941c8 100644
--- a/src/test/ui/lint/dead-code/empty-unused-enum.stderr
+++ b/src/test/ui/lint/dead-code/empty-unused-enum.stderr
@@ -1,4 +1,4 @@
-error: enum is never used: `E`
+error: enum `E` is never used
   --> $DIR/empty-unused-enum.rs:3:6
    |
 LL | enum E {}
diff --git a/src/test/ui/lint/dead-code/impl-trait.rs b/src/test/ui/lint/dead-code/impl-trait.rs
index a2736d97308..757b8f83ef0 100644
--- a/src/test/ui/lint/dead-code/impl-trait.rs
+++ b/src/test/ui/lint/dead-code/impl-trait.rs
@@ -9,7 +9,7 @@ impl Trait for () {
 }
 
 type Used = ();
-type Unused = (); //~ ERROR type alias is never used
+type Unused = (); //~ ERROR type alias `Unused` is never used
 
 fn foo() -> impl Trait<Type = Used> {}
 
diff --git a/src/test/ui/lint/dead-code/impl-trait.stderr b/src/test/ui/lint/dead-code/impl-trait.stderr
index 09b6d08eb8f..9c47c1b5355 100644
--- a/src/test/ui/lint/dead-code/impl-trait.stderr
+++ b/src/test/ui/lint/dead-code/impl-trait.stderr
@@ -1,4 +1,4 @@
-error: type alias is never used: `Unused`
+error: type alias `Unused` is never used
   --> $DIR/impl-trait.rs:12:1
    |
 LL | type Unused = ();
diff --git a/src/test/ui/lint/dead-code/issue-85255.rs b/src/test/ui/lint/dead-code/issue-85255.rs
index 871dde91a3e..043f68137b8 100644
--- a/src/test/ui/lint/dead-code/issue-85255.rs
+++ b/src/test/ui/lint/dead-code/issue-85255.rs
@@ -4,39 +4,39 @@
 #![warn(dead_code)]
 
 struct Foo {
-    a: i32, //~ WARNING: field is never read
-    pub b: i32, //~ WARNING: field is never read
+    a: i32, //~ WARNING: fields `a` and `b` are never read
+    pub b: i32,
 }
 
 struct Bar;
 
 impl Bar {
-    fn a(&self) -> i32 { 5 } //~ WARNING: associated function is never used
-    pub fn b(&self) -> i32 { 6 } //~ WARNING: associated function is never used
+    fn a(&self) -> i32 { 5 } //~ WARNING: associated function `a` is never used
+    pub fn b(&self) -> i32 { 6 } //~ WARNING: associated function `b` is never used
 }
 
 pub(crate) struct Foo1 {
-    a: i32, //~ WARNING: field is never read
-    pub b: i32, //~ WARNING: field is never read
+    a: i32, //~ WARNING: fields `a` and `b` are never read
+    pub b: i32,
 }
 
 pub(crate) struct Bar1;
 
 impl Bar1 {
-    fn a(&self) -> i32 { 5 } //~ WARNING: associated function is never used
-    pub fn b(&self) -> i32 { 6 } //~ WARNING: associated function is never used
+    fn a(&self) -> i32 { 5 } //~ WARNING: associated function `a` is never used
+    pub fn b(&self) -> i32 { 6 } //~ WARNING: associated function `b` is never used
 }
 
 pub(crate) struct Foo2 {
-    a: i32, //~ WARNING: field is never read
-    pub b: i32, //~ WARNING: field is never read
+    a: i32, //~ WARNING: fields `a` and `b` are never read
+    pub b: i32,
 }
 
 pub(crate) struct Bar2;
 
 impl Bar2 {
-    fn a(&self) -> i32 { 5 } //~ WARNING: associated function is never used
-    pub fn b(&self) -> i32 { 6 } //~ WARNING: associated function is never used
+    fn a(&self) -> i32 { 5 } //~ WARNING: associated function `a` is never used
+    pub fn b(&self) -> i32 { 6 } //~ WARNING: associated function `b` is never used
 }
 
 
diff --git a/src/test/ui/lint/dead-code/issue-85255.stderr b/src/test/ui/lint/dead-code/issue-85255.stderr
index 5f786d5a2a8..7ebbebb1aba 100644
--- a/src/test/ui/lint/dead-code/issue-85255.stderr
+++ b/src/test/ui/lint/dead-code/issue-85255.stderr
@@ -1,8 +1,12 @@
-warning: field is never read: `a`
+warning: fields `a` and `b` are never read
   --> $DIR/issue-85255.rs:7:5
    |
+LL | struct Foo {
+   |        --- fields in this struct
 LL |     a: i32,
    |     ^^^^^^
+LL |     pub b: i32,
+   |     ^^^^^^^^^^
    |
 note: the lint level is defined here
   --> $DIR/issue-85255.rs:4:9
@@ -10,71 +14,61 @@ note: the lint level is defined here
 LL | #![warn(dead_code)]
    |         ^^^^^^^^^
 
-warning: field is never read: `b`
-  --> $DIR/issue-85255.rs:8:5
-   |
-LL |     pub b: i32,
-   |     ^^^^^^^^^^
-
-warning: associated function is never used: `a`
+warning: associated function `a` is never used
   --> $DIR/issue-85255.rs:14:8
    |
 LL |     fn a(&self) -> i32 { 5 }
    |        ^
 
-warning: associated function is never used: `b`
+warning: associated function `b` is never used
   --> $DIR/issue-85255.rs:15:12
    |
 LL |     pub fn b(&self) -> i32 { 6 }
    |            ^
 
-warning: field is never read: `a`
+warning: fields `a` and `b` are never read
   --> $DIR/issue-85255.rs:19:5
    |
+LL | pub(crate) struct Foo1 {
+   |                   ---- fields in this struct
 LL |     a: i32,
    |     ^^^^^^
-
-warning: field is never read: `b`
-  --> $DIR/issue-85255.rs:20:5
-   |
 LL |     pub b: i32,
    |     ^^^^^^^^^^
 
-warning: associated function is never used: `a`
+warning: associated function `a` is never used
   --> $DIR/issue-85255.rs:26:8
    |
 LL |     fn a(&self) -> i32 { 5 }
    |        ^
 
-warning: associated function is never used: `b`
+warning: associated function `b` is never used
   --> $DIR/issue-85255.rs:27:12
    |
 LL |     pub fn b(&self) -> i32 { 6 }
    |            ^
 
-warning: field is never read: `a`
+warning: fields `a` and `b` are never read
   --> $DIR/issue-85255.rs:31:5
    |
+LL | pub(crate) struct Foo2 {
+   |                   ---- fields in this struct
 LL |     a: i32,
    |     ^^^^^^
-
-warning: field is never read: `b`
-  --> $DIR/issue-85255.rs:32:5
-   |
 LL |     pub b: i32,
    |     ^^^^^^^^^^
 
-warning: associated function is never used: `a`
+warning: associated function `a` is never used
   --> $DIR/issue-85255.rs:38:8
    |
 LL |     fn a(&self) -> i32 { 5 }
    |        ^
 
-warning: associated function is never used: `b`
+warning: associated function `b` is never used
   --> $DIR/issue-85255.rs:39:12
    |
 LL |     pub fn b(&self) -> i32 { 6 }
    |            ^
 
-warning: 12 warnings emitted
+warning: 9 warnings emitted
 
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-1.rs b/src/test/ui/lint/dead-code/lint-dead-code-1.rs
index 896147fcc77..8f5a4c41ef2 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-1.rs
+++ b/src/test/ui/lint/dead-code/lint-dead-code-1.rs
@@ -9,7 +9,7 @@
 pub use foo2::Bar2;
 
 mod foo {
-    pub struct Bar; //~ ERROR: struct is never constructed
+    pub struct Bar; //~ ERROR: struct `Bar` is never constructed
 }
 
 mod foo2 {
@@ -17,14 +17,14 @@ mod foo2 {
 }
 
 pub static pub_static: isize = 0;
-static priv_static: isize = 0; //~ ERROR: static is never used
+static priv_static: isize = 0; //~ ERROR: static `priv_static` is never used
 const used_static: isize = 0;
 pub static used_static2: isize = used_static;
 const USED_STATIC: isize = 0;
 const STATIC_USED_IN_ENUM_DISCRIMINANT: isize = 10;
 
 pub const pub_const: isize = 0;
-const priv_const: isize = 0; //~ ERROR: constant is never used
+const priv_const: isize = 0; //~ ERROR: constant `priv_const` is never used
 const used_const: isize = 0;
 pub const used_const2: isize = used_const;
 const USED_CONST: isize = 1;
@@ -32,7 +32,7 @@ const CONST_USED_IN_ENUM_DISCRIMINANT: isize = 11;
 
 pub type typ = *const UsedStruct4;
 pub struct PubStruct;
-struct PrivStruct; //~ ERROR: struct is never constructed
+struct PrivStruct; //~ ERROR: struct `PrivStruct` is never constructed
 struct UsedStruct1 {
     #[allow(dead_code)]
     x: isize
@@ -61,10 +61,10 @@ pub enum pub_enum3 {
     Bar = CONST_USED_IN_ENUM_DISCRIMINANT,
 }
 
-enum priv_enum { foo2, bar2 } //~ ERROR: enum is never used
+enum priv_enum { foo2, bar2 } //~ ERROR: enum `priv_enum` is never used
 enum used_enum {
     foo3,
-    bar3 //~ ERROR variant is never constructed
+    bar3 //~ ERROR variant `bar3` is never constructed
 }
 
 fn f<T>() {}
@@ -85,21 +85,21 @@ pub fn pub_fn() {
     }
     f::<StructUsedInGeneric>();
 }
-fn priv_fn() { //~ ERROR: function is never used
+fn priv_fn() { //~ ERROR: function `priv_fn` is never used
     let unused_struct = PrivStruct;
 }
 fn used_fn() {}
 
-fn foo() { //~ ERROR: function is never used
+fn foo() { //~ ERROR: function `foo` is never used
     bar();
     let unused_enum = priv_enum::foo2;
 }
 
-fn bar() { //~ ERROR: function is never used
+fn bar() { //~ ERROR: function `bar` is never used
     foo();
 }
 
-fn baz() -> impl Copy { //~ ERROR: function is never used
+fn baz() -> impl Copy { //~ ERROR: function `baz` is never used
     "I'm unused, too"
 }
 
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-1.stderr b/src/test/ui/lint/dead-code/lint-dead-code-1.stderr
index 72e28e7940e..2eddc4ce21c 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-1.stderr
+++ b/src/test/ui/lint/dead-code/lint-dead-code-1.stderr
@@ -1,4 +1,4 @@
-error: static is never used: `priv_static`
+error: static `priv_static` is never used
   --> $DIR/lint-dead-code-1.rs:20:1
    |
 LL | static priv_static: isize = 0;
@@ -10,55 +10,58 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: constant is never used: `priv_const`
+error: constant `priv_const` is never used
   --> $DIR/lint-dead-code-1.rs:27:1
    |
 LL | const priv_const: isize = 0;
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: struct is never constructed: `PrivStruct`
+error: struct `PrivStruct` is never constructed
   --> $DIR/lint-dead-code-1.rs:35:8
    |
 LL | struct PrivStruct;
    |        ^^^^^^^^^^
 
-error: enum is never used: `priv_enum`
+error: enum `priv_enum` is never used
   --> $DIR/lint-dead-code-1.rs:64:6
    |
 LL | enum priv_enum { foo2, bar2 }
    |      ^^^^^^^^^
 
-error: variant is never constructed: `bar3`
+error: variant `bar3` is never constructed
   --> $DIR/lint-dead-code-1.rs:67:5
    |
+LL | enum used_enum {
+   |      --------- variant in this enum
+LL |     foo3,
 LL |     bar3
    |     ^^^^
 
-error: function is never used: `priv_fn`
+error: function `priv_fn` is never used
   --> $DIR/lint-dead-code-1.rs:88:4
    |
 LL | fn priv_fn() {
    |    ^^^^^^^
 
-error: function is never used: `foo`
+error: function `foo` is never used
   --> $DIR/lint-dead-code-1.rs:93:4
    |
 LL | fn foo() {
    |    ^^^
 
-error: function is never used: `bar`
+error: function `bar` is never used
   --> $DIR/lint-dead-code-1.rs:98:4
    |
 LL | fn bar() {
    |    ^^^
 
-error: function is never used: `baz`
+error: function `baz` is never used
   --> $DIR/lint-dead-code-1.rs:102:4
    |
 LL | fn baz() -> impl Copy {
    |    ^^^
 
-error: struct is never constructed: `Bar`
+error: struct `Bar` is never constructed
   --> $DIR/lint-dead-code-1.rs:12:16
    |
 LL |     pub struct Bar;
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-2.rs b/src/test/ui/lint/dead-code/lint-dead-code-2.rs
index 2cfe6e539db..6bfa4d96f71 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-2.rs
+++ b/src/test/ui/lint/dead-code/lint-dead-code-2.rs
@@ -19,10 +19,10 @@ impl Bar for Foo {
 
 fn live_fn() {}
 
-fn dead_fn() {} //~ ERROR: function is never used
+fn dead_fn() {} //~ ERROR: function `dead_fn` is never used
 
 #[rustc_main]
-fn dead_fn2() {} //~ ERROR: function is never used
+fn dead_fn2() {} //~ ERROR: function `dead_fn2` is never used
 
 fn used_fn() {}
 
@@ -35,7 +35,7 @@ fn start(_: isize, _: *const *const u8) -> isize {
 }
 
 // this is not main
-fn main() { //~ ERROR: function is never used
+fn main() { //~ ERROR: function `main` is never used
     dead_fn();
     dead_fn2();
 }
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-2.stderr b/src/test/ui/lint/dead-code/lint-dead-code-2.stderr
index b01ba57f985..85af553c986 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-2.stderr
+++ b/src/test/ui/lint/dead-code/lint-dead-code-2.stderr
@@ -1,4 +1,4 @@
-error: function is never used: `dead_fn`
+error: function `dead_fn` is never used
   --> $DIR/lint-dead-code-2.rs:22:4
    |
 LL | fn dead_fn() {}
@@ -10,13 +10,13 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: function is never used: `dead_fn2`
+error: function `dead_fn2` is never used
   --> $DIR/lint-dead-code-2.rs:25:4
    |
 LL | fn dead_fn2() {}
    |    ^^^^^^^^
 
-error: function is never used: `main`
+error: function `main` is never used
   --> $DIR/lint-dead-code-2.rs:38:4
    |
 LL | fn main() {
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-3.rs b/src/test/ui/lint/dead-code/lint-dead-code-3.rs
index 7f39f7965f2..c3e56063dc3 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-3.rs
+++ b/src/test/ui/lint/dead-code/lint-dead-code-3.rs
@@ -11,14 +11,14 @@ extern "C" {
     pub fn extern_foo();
 }
 
-struct Foo; //~ ERROR: struct is never constructed
+struct Foo; //~ ERROR: struct `Foo` is never constructed
 impl Foo {
-    fn foo(&self) { //~ ERROR: associated function is never used
+    fn foo(&self) { //~ ERROR: associated function `foo` is never used
         bar()
     }
 }
 
-fn bar() { //~ ERROR: function is never used
+fn bar() { //~ ERROR: function `bar` is never used
     fn baz() {}
 
     Foo.foo();
@@ -57,9 +57,9 @@ mod blah {
     }
 }
 
-enum c_void {} //~ ERROR: enum is never used
+enum c_void {} //~ ERROR: enum `c_void` is never used
 extern "C" {
-    fn free(p: *const c_void); //~ ERROR: function is never used
+    fn free(p: *const c_void); //~ ERROR: function `free` is never used
 }
 
 // Check provided method
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-3.stderr b/src/test/ui/lint/dead-code/lint-dead-code-3.stderr
index cf8f01ea19f..af59c6fec1f 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-3.stderr
+++ b/src/test/ui/lint/dead-code/lint-dead-code-3.stderr
@@ -1,4 +1,4 @@
-error: struct is never constructed: `Foo`
+error: struct `Foo` is never constructed
   --> $DIR/lint-dead-code-3.rs:14:8
    |
 LL | struct Foo;
@@ -10,25 +10,25 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: associated function is never used: `foo`
+error: associated function `foo` is never used
   --> $DIR/lint-dead-code-3.rs:16:8
    |
 LL |     fn foo(&self) {
    |        ^^^
 
-error: function is never used: `bar`
+error: function `bar` is never used
   --> $DIR/lint-dead-code-3.rs:21:4
    |
 LL | fn bar() {
    |    ^^^
 
-error: enum is never used: `c_void`
+error: enum `c_void` is never used
   --> $DIR/lint-dead-code-3.rs:60:6
    |
 LL | enum c_void {}
    |      ^^^^^^
 
-error: function is never used: `free`
+error: function `free` is never used
   --> $DIR/lint-dead-code-3.rs:62:5
    |
 LL |     fn free(p: *const c_void);
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-4.rs b/src/test/ui/lint/dead-code/lint-dead-code-4.rs
index 8bcb1e5ba8c..0fc6c6156fd 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-4.rs
+++ b/src/test/ui/lint/dead-code/lint-dead-code-4.rs
@@ -4,7 +4,7 @@
 
 struct Foo {
     x: usize,
-    b: bool, //~ ERROR: field is never read
+    b: bool, //~ ERROR: field `b` is never read
 }
 
 fn field_read(f: Foo) -> usize {
@@ -12,8 +12,8 @@ fn field_read(f: Foo) -> usize {
 }
 
 enum XYZ {
-    X, //~ ERROR variant is never constructed
-    Y { //~ ERROR variant is never constructed
+    X, //~ ERROR variants `X` and `Y` are never constructed
+    Y {
         a: String,
         b: i32,
         c: i32,
@@ -21,7 +21,7 @@ enum XYZ {
     Z
 }
 
-enum ABC { //~ ERROR enum is never used
+enum ABC { //~ ERROR enum `ABC` is never used
     A,
     B {
         a: String,
@@ -33,13 +33,13 @@ enum ABC { //~ ERROR enum is never used
 
 // ensure struct variants get warning for their fields
 enum IJK {
-    I, //~ ERROR variant is never constructed
+    I, //~ ERROR variants `I` and `K` are never constructed
     J {
         a: String,
-        b: i32, //~ ERROR field is never read
-        c: i32, //~ ERROR field is never read
+        b: i32, //~ ERROR fields `b` and `c` are never read
+        c: i32,
     },
-    K //~ ERROR variant is never constructed
+    K
 
 }
 
@@ -58,9 +58,9 @@ fn field_match_in_patterns(b: XYZ) -> String {
 }
 
 struct Bar {
-    x: usize, //~ ERROR: field is never read
+    x: usize, //~ ERROR: fields `x` and `c` are never read
     b: bool,
-    c: bool, //~ ERROR: field is never read
+    c: bool,
     _guard: ()
 }
 
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-4.stderr b/src/test/ui/lint/dead-code/lint-dead-code-4.stderr
index 3905d1a06bd..dcd810b3e48 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-4.stderr
+++ b/src/test/ui/lint/dead-code/lint-dead-code-4.stderr
@@ -1,6 +1,9 @@
-error: field is never read: `b`
+error: field `b` is never read
   --> $DIR/lint-dead-code-4.rs:7:5
    |
+LL | struct Foo {
+   |        --- field in this struct
+LL |     x: usize,
 LL |     b: bool,
    |     ^^^^^^^
    |
@@ -10,15 +13,13 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: variant is never constructed: `X`
+error: variants `X` and `Y` are never constructed
   --> $DIR/lint-dead-code-4.rs:15:5
    |
-LL |     X,
-   |     ^
-
-error: variant is never constructed: `Y`
-  --> $DIR/lint-dead-code-4.rs:16:5
-   |
+LL |   enum XYZ {
+   |        --- variants in this enum
+LL |       X,
+   |       ^
 LL | /     Y {
 LL | |         a: String,
 LL | |         b: i32,
@@ -26,47 +27,44 @@ LL | |         c: i32,
 LL | |     },
    | |_____^
 
-error: enum is never used: `ABC`
+error: enum `ABC` is never used
   --> $DIR/lint-dead-code-4.rs:24:6
    |
 LL | enum ABC {
    |      ^^^
 
-error: variant is never constructed: `I`
-  --> $DIR/lint-dead-code-4.rs:36:5
-   |
-LL |     I,
-   |     ^
-
-error: field is never read: `b`
+error: fields `b` and `c` are never read
   --> $DIR/lint-dead-code-4.rs:39:9
    |
+LL | enum IJK {
+   |      --- fields in this enum
+...
 LL |         b: i32,
    |         ^^^^^^
-
-error: field is never read: `c`
-  --> $DIR/lint-dead-code-4.rs:40:9
-   |
 LL |         c: i32,
    |         ^^^^^^
 
-error: variant is never constructed: `K`
-  --> $DIR/lint-dead-code-4.rs:42:5
+error: variants `I` and `K` are never constructed
+  --> $DIR/lint-dead-code-4.rs:36:5
    |
+LL | enum IJK {
+   |      --- variants in this enum
+LL |     I,
+   |     ^
+...
 LL |     K
    |     ^
 
-error: field is never read: `x`
+error: fields `x` and `c` are never read
   --> $DIR/lint-dead-code-4.rs:61:5
    |
+LL | struct Bar {
+   |        --- fields in this struct
 LL |     x: usize,
    |     ^^^^^^^^
-
-error: field is never read: `c`
-  --> $DIR/lint-dead-code-4.rs:63:5
-   |
+LL |     b: bool,
 LL |     c: bool,
    |     ^^^^^^^
 
-error: aborting due to 10 previous errors
+error: aborting due to 6 previous errors
 
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-5.rs b/src/test/ui/lint/dead-code/lint-dead-code-5.rs
index b477c97c545..ed90fb46429 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-5.rs
+++ b/src/test/ui/lint/dead-code/lint-dead-code-5.rs
@@ -3,15 +3,15 @@
 
 enum Enum1 {
     Variant1(isize),
-    Variant2 //~ ERROR: variant is never constructed
+    Variant2 //~ ERROR: variant `Variant2` is never constructed
 }
 
 enum Enum2 {
     Variant3(bool),
     #[allow(dead_code)]
     Variant4(isize),
-    Variant5 { _x: isize }, //~ ERROR: variant is never constructed: `Variant5`
-    Variant6(isize), //~ ERROR: variant is never constructed: `Variant6`
+    Variant5 { _x: isize }, //~ ERROR: variants `Variant5` and `Variant6` are never constructed
+    Variant6(isize),
     _Variant7,
     Variant8 { _field: bool },
     Variant9,
@@ -32,7 +32,7 @@ impl Enum2 {
     }
 }
 
-enum Enum3 { //~ ERROR: enum is never used
+enum Enum3 { //~ ERROR: enum `Enum3` is never used
     Variant8,
     Variant9
 }
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-5.stderr b/src/test/ui/lint/dead-code/lint-dead-code-5.stderr
index 519add82627..037a9be22ad 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-5.stderr
+++ b/src/test/ui/lint/dead-code/lint-dead-code-5.stderr
@@ -1,6 +1,9 @@
-error: variant is never constructed: `Variant2`
+error: variant `Variant2` is never constructed
   --> $DIR/lint-dead-code-5.rs:6:5
    |
+LL | enum Enum1 {
+   |      ----- variant in this enum
+LL |     Variant1(isize),
 LL |     Variant2
    |     ^^^^^^^^
    |
@@ -10,23 +13,22 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: variant is never constructed: `Variant5`
+error: variants `Variant5` and `Variant6` are never constructed
   --> $DIR/lint-dead-code-5.rs:13:5
    |
+LL | enum Enum2 {
+   |      ----- variants in this enum
+...
 LL |     Variant5 { _x: isize },
    |     ^^^^^^^^^^^^^^^^^^^^^^
-
-error: variant is never constructed: `Variant6`
-  --> $DIR/lint-dead-code-5.rs:14:5
-   |
 LL |     Variant6(isize),
    |     ^^^^^^^^^^^^^^^
 
-error: enum is never used: `Enum3`
+error: enum `Enum3` is never used
   --> $DIR/lint-dead-code-5.rs:35:6
    |
 LL | enum Enum3 {
    |      ^^^^^
 
-error: aborting due to 4 previous errors
+error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-6.rs b/src/test/ui/lint/dead-code/lint-dead-code-6.rs
index 0a543d5c622..e3074acf129 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-6.rs
+++ b/src/test/ui/lint/dead-code/lint-dead-code-6.rs
@@ -1,16 +1,16 @@
 #![deny(dead_code)]
 
-struct UnusedStruct; //~ ERROR struct is never constructed: `UnusedStruct`
+struct UnusedStruct; //~ ERROR struct `UnusedStruct` is never constructed
 impl UnusedStruct {
-    fn unused_impl_fn_1() { //~ ERROR associated function is never used: `unused_impl_fn_1`
+    fn unused_impl_fn_1() { //~ ERROR associated function `unused_impl_fn_1` is never used
         println!("blah");
     }
 
-    fn unused_impl_fn_2(var: i32) { //~ ERROR associated function is never used: `unused_impl_fn_2`
+    fn unused_impl_fn_2(var: i32) { //~ ERROR associated function `unused_impl_fn_2` is never used
         println!("foo {}", var);
     }
 
-    fn unused_impl_fn_3( //~ ERROR associated function is never used: `unused_impl_fn_3`
+    fn unused_impl_fn_3( //~ ERROR associated function `unused_impl_fn_3` is never used
         var: i32,
     ) {
         println!("bar {}", var);
diff --git a/src/test/ui/lint/dead-code/lint-dead-code-6.stderr b/src/test/ui/lint/dead-code/lint-dead-code-6.stderr
index 7dc60730d6a..f9d83308a3d 100644
--- a/src/test/ui/lint/dead-code/lint-dead-code-6.stderr
+++ b/src/test/ui/lint/dead-code/lint-dead-code-6.stderr
@@ -1,4 +1,4 @@
-error: struct is never constructed: `UnusedStruct`
+error: struct `UnusedStruct` is never constructed
   --> $DIR/lint-dead-code-6.rs:3:8
    |
 LL | struct UnusedStruct;
@@ -10,19 +10,19 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: associated function is never used: `unused_impl_fn_1`
+error: associated function `unused_impl_fn_1` is never used
   --> $DIR/lint-dead-code-6.rs:5:8
    |
 LL |     fn unused_impl_fn_1() {
    |        ^^^^^^^^^^^^^^^^
 
-error: associated function is never used: `unused_impl_fn_2`
+error: associated function `unused_impl_fn_2` is never used
   --> $DIR/lint-dead-code-6.rs:9:8
    |
 LL |     fn unused_impl_fn_2(var: i32) {
    |        ^^^^^^^^^^^^^^^^
 
-error: associated function is never used: `unused_impl_fn_3`
+error: associated function `unused_impl_fn_3` is never used
   --> $DIR/lint-dead-code-6.rs:13:8
    |
 LL |     fn unused_impl_fn_3(
diff --git a/src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.rs b/src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.rs
new file mode 100644
index 00000000000..e3935cf9149
--- /dev/null
+++ b/src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.rs
@@ -0,0 +1,29 @@
+#![warn(dead_code)]
+
+struct Bar {
+    #[allow(dead_code)]
+    a: usize,
+    #[forbid(dead_code)]
+    b: usize, //~ ERROR field `b` is never read
+    #[deny(dead_code)]
+    c: usize, //~ ERROR fields `c` and `e` are never read
+    d: usize, //~ WARN fields `d`, `f` and `g` are never read
+    #[deny(dead_code)]
+    e: usize,
+    f: usize,
+    g: usize,
+    _h: usize,
+}
+
+fn main() {
+    Bar {
+        a: 1,
+        b: 1,
+        c: 1,
+        d: 1,
+        e: 1,
+        f: 1,
+        g: 1,
+        _h: 1,
+    };
+}
diff --git a/src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.stderr b/src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.stderr
new file mode 100644
index 00000000000..5cc8e06c09d
--- /dev/null
+++ b/src/test/ui/lint/dead-code/multiple-dead-codes-in-the-same-struct.stderr
@@ -0,0 +1,55 @@
+warning: fields `d`, `f` and `g` are never read
+  --> $DIR/multiple-dead-codes-in-the-same-struct.rs:10:5
+   |
+LL | struct Bar {
+   |        --- fields in this struct
+...
+LL |     d: usize,
+   |     ^^^^^^^^
+...
+LL |     f: usize,
+   |     ^^^^^^^^
+LL |     g: usize,
+   |     ^^^^^^^^
+   |
+note: the lint level is defined here
+  --> $DIR/multiple-dead-codes-in-the-same-struct.rs:1:9
+   |
+LL | #![warn(dead_code)]
+   |         ^^^^^^^^^
+
+error: fields `c` and `e` are never read
+  --> $DIR/multiple-dead-codes-in-the-same-struct.rs:9:5
+   |
+LL | struct Bar {
+   |        --- fields in this struct
+...
+LL |     c: usize,
+   |     ^^^^^^^^
+...
+LL |     e: usize,
+   |     ^^^^^^^^
+   |
+note: the lint level is defined here
+  --> $DIR/multiple-dead-codes-in-the-same-struct.rs:8:12
+   |
+LL |     #[deny(dead_code)]
+   |            ^^^^^^^^^
+
+error: field `b` is never read
+  --> $DIR/multiple-dead-codes-in-the-same-struct.rs:7:5
+   |
+LL | struct Bar {
+   |        --- field in this struct
+...
+LL |     b: usize,
+   |     ^^^^^^^^
+   |
+note: the lint level is defined here
+  --> $DIR/multiple-dead-codes-in-the-same-struct.rs:6:14
+   |
+LL |     #[forbid(dead_code)]
+   |              ^^^^^^^^^
+
+error: aborting due to 2 previous errors; 1 warning emitted
+
diff --git a/src/test/ui/lint/dead-code/newline-span.rs b/src/test/ui/lint/dead-code/newline-span.rs
index a4342056419..209c3cd937f 100644
--- a/src/test/ui/lint/dead-code/newline-span.rs
+++ b/src/test/ui/lint/dead-code/newline-span.rs
@@ -1,14 +1,14 @@
 #![deny(dead_code)]
 
-fn unused() { //~ error: function is never used:
+fn unused() { //~ error: function `unused` is never used
     println!("blah");
 }
 
-fn unused2(var: i32) { //~ error: function is never used:
+fn unused2(var: i32) { //~ error: function `unused2` is never used
     println!("foo {}", var);
 }
 
-fn unused3( //~ error: function is never used:
+fn unused3( //~ error: function `unused3` is never used
     var: i32,
 ) {
     println!("bar {}", var);
diff --git a/src/test/ui/lint/dead-code/newline-span.stderr b/src/test/ui/lint/dead-code/newline-span.stderr
index fd74405f2b6..4eeadccc823 100644
--- a/src/test/ui/lint/dead-code/newline-span.stderr
+++ b/src/test/ui/lint/dead-code/newline-span.stderr
@@ -1,4 +1,4 @@
-error: function is never used: `unused`
+error: function `unused` is never used
   --> $DIR/newline-span.rs:3:4
    |
 LL | fn unused() {
@@ -10,13 +10,13 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: function is never used: `unused2`
+error: function `unused2` is never used
   --> $DIR/newline-span.rs:7:4
    |
 LL | fn unused2(var: i32) {
    |    ^^^^^^^
 
-error: function is never used: `unused3`
+error: function `unused3` is never used
   --> $DIR/newline-span.rs:11:4
    |
 LL | fn unused3(
diff --git a/src/test/ui/lint/dead-code/type-alias.rs b/src/test/ui/lint/dead-code/type-alias.rs
index 86daf3ea04d..35a7f125dda 100644
--- a/src/test/ui/lint/dead-code/type-alias.rs
+++ b/src/test/ui/lint/dead-code/type-alias.rs
@@ -1,7 +1,7 @@
 #![deny(dead_code)]
 
 type Used = u8;
-type Unused = u8; //~ ERROR type alias is never used
+type Unused = u8; //~ ERROR type alias `Unused` is never used
 
 fn id(x: Used) -> Used { x }
 
diff --git a/src/test/ui/lint/dead-code/type-alias.stderr b/src/test/ui/lint/dead-code/type-alias.stderr
index b2acd5d4213..80c6ba962b8 100644
--- a/src/test/ui/lint/dead-code/type-alias.stderr
+++ b/src/test/ui/lint/dead-code/type-alias.stderr
@@ -1,4 +1,4 @@
-error: type alias is never used: `Unused`
+error: type alias `Unused` is never used
   --> $DIR/type-alias.rs:4:1
    |
 LL | type Unused = u8;
diff --git a/src/test/ui/lint/dead-code/unused-enum.rs b/src/test/ui/lint/dead-code/unused-enum.rs
index e57fac259c5..20df3e1de6f 100644
--- a/src/test/ui/lint/dead-code/unused-enum.rs
+++ b/src/test/ui/lint/dead-code/unused-enum.rs
@@ -1,9 +1,10 @@
 #![deny(unused)]
 
-struct F; //~ ERROR struct is never constructed
-struct B; //~ ERROR struct is never constructed
+struct F; //~ ERROR struct `F` is never constructed
+struct B; //~ ERROR struct `B` is never constructed
 
-enum E { //~ ERROR enum is never used
+enum E {
+    //~^ ERROR enum `E` is never used
     Foo(F),
     Bar(B),
 }
diff --git a/src/test/ui/lint/dead-code/unused-enum.stderr b/src/test/ui/lint/dead-code/unused-enum.stderr
index 9f368fdd2f8..d2602dbb344 100644
--- a/src/test/ui/lint/dead-code/unused-enum.stderr
+++ b/src/test/ui/lint/dead-code/unused-enum.stderr
@@ -1,4 +1,4 @@
-error: struct is never constructed: `F`
+error: struct `F` is never constructed
   --> $DIR/unused-enum.rs:3:8
    |
 LL | struct F;
@@ -11,13 +11,13 @@ LL | #![deny(unused)]
    |         ^^^^^^
    = note: `#[deny(dead_code)]` implied by `#[deny(unused)]`
 
-error: struct is never constructed: `B`
+error: struct `B` is never constructed
   --> $DIR/unused-enum.rs:4:8
    |
 LL | struct B;
    |        ^
 
-error: enum is never used: `E`
+error: enum `E` is never used
   --> $DIR/unused-enum.rs:6:6
    |
 LL | enum E {
diff --git a/src/test/ui/lint/dead-code/unused-struct-variant.rs b/src/test/ui/lint/dead-code/unused-struct-variant.rs
index 69ab29042e5..a914e0c3301 100644
--- a/src/test/ui/lint/dead-code/unused-struct-variant.rs
+++ b/src/test/ui/lint/dead-code/unused-struct-variant.rs
@@ -5,7 +5,7 @@ struct B;
 
 enum E {
     Foo(F),
-    Bar(B), //~ ERROR variant is never constructed
+    Bar(B), //~ ERROR variant `Bar` is never constructed
 }
 
 fn main() {
diff --git a/src/test/ui/lint/dead-code/unused-struct-variant.stderr b/src/test/ui/lint/dead-code/unused-struct-variant.stderr
index b93d6d4ac18..b08402b671b 100644
--- a/src/test/ui/lint/dead-code/unused-struct-variant.stderr
+++ b/src/test/ui/lint/dead-code/unused-struct-variant.stderr
@@ -1,6 +1,9 @@
-error: variant is never constructed: `Bar`
+error: variant `Bar` is never constructed
   --> $DIR/unused-struct-variant.rs:8:5
    |
+LL | enum E {
+   |      - variant in this enum
+LL |     Foo(F),
 LL |     Bar(B),
    |     ^^^^^^
    |
diff --git a/src/test/ui/lint/dead-code/unused-variant.rs b/src/test/ui/lint/dead-code/unused-variant.rs
index 295ed16d4cf..82108fa9c13 100644
--- a/src/test/ui/lint/dead-code/unused-variant.rs
+++ b/src/test/ui/lint/dead-code/unused-variant.rs
@@ -2,7 +2,7 @@
 
 #[derive(Clone)]
 enum Enum {
-    Variant1, //~ ERROR: variant is never constructed
+    Variant1, //~ ERROR: variant `Variant1` is never constructed
     Variant2,
 }
 
diff --git a/src/test/ui/lint/dead-code/unused-variant.stderr b/src/test/ui/lint/dead-code/unused-variant.stderr
index 57f8ca74f83..a68f64775ad 100644
--- a/src/test/ui/lint/dead-code/unused-variant.stderr
+++ b/src/test/ui/lint/dead-code/unused-variant.stderr
@@ -1,6 +1,8 @@
-error: variant is never constructed: `Variant1`
+error: variant `Variant1` is never constructed
   --> $DIR/unused-variant.rs:5:5
    |
+LL | enum Enum {
+   |      ---- variant in this enum
 LL |     Variant1,
    |     ^^^^^^^^
    |
diff --git a/src/test/ui/lint/dead-code/with-core-crate.rs b/src/test/ui/lint/dead-code/with-core-crate.rs
index bc74e807783..0a94b528f33 100644
--- a/src/test/ui/lint/dead-code/with-core-crate.rs
+++ b/src/test/ui/lint/dead-code/with-core-crate.rs
@@ -4,7 +4,7 @@
 #[macro_use]
 extern crate core;
 
-fn foo() { //~ ERROR function is never used
+fn foo() { //~ ERROR function `foo` is never used
 
     // none of these should have any dead_code exposed to the user
     panic!();
diff --git a/src/test/ui/lint/dead-code/with-core-crate.stderr b/src/test/ui/lint/dead-code/with-core-crate.stderr
index 2c63e60d676..7adcf884886 100644
--- a/src/test/ui/lint/dead-code/with-core-crate.stderr
+++ b/src/test/ui/lint/dead-code/with-core-crate.stderr
@@ -1,4 +1,4 @@
-error: function is never used: `foo`
+error: function `foo` is never used
   --> $DIR/with-core-crate.rs:7:4
    |
 LL | fn foo() {
diff --git a/src/test/ui/lint/force-warn/allow-warnings.rs b/src/test/ui/lint/force-warn/allow-warnings.rs
index adcefc7ec78..0199381fcbb 100644
--- a/src/test/ui/lint/force-warn/allow-warnings.rs
+++ b/src/test/ui/lint/force-warn/allow-warnings.rs
@@ -6,6 +6,6 @@
 #![allow(warnings)]
 
 fn dead_function() {}
-//~^ WARN function is never used
+//~^ WARN function `dead_function` is never used
 
 fn main() {}
diff --git a/src/test/ui/lint/force-warn/allow-warnings.stderr b/src/test/ui/lint/force-warn/allow-warnings.stderr
index cac2b4e9189..4de68a079e5 100644
--- a/src/test/ui/lint/force-warn/allow-warnings.stderr
+++ b/src/test/ui/lint/force-warn/allow-warnings.stderr
@@ -1,4 +1,4 @@
-warning: function is never used: `dead_function`
+warning: function `dead_function` is never used
   --> $DIR/allow-warnings.rs:8:4
    |
 LL | fn dead_function() {}
diff --git a/src/test/ui/lint/force-warn/allowed-cli-deny-by-default-lint.stderr b/src/test/ui/lint/force-warn/allowed-cli-deny-by-default-lint.stderr
index af6308f0d1b..c14529a7d09 100644
--- a/src/test/ui/lint/force-warn/allowed-cli-deny-by-default-lint.stderr
+++ b/src/test/ui/lint/force-warn/allowed-cli-deny-by-default-lint.stderr
@@ -12,3 +12,16 @@ LL | const C: i32 = 1 / 0;
 
 warning: 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/allowed-cli-deny-by-default-lint.rs:6:16
+   |
+LL | const C: i32 = 1 / 0;
+   | ---------------^^^^^-
+   |                |
+   |                attempt to divide `1_i32` by zero
+   |
+   = note: requested on the command line with `--force-warn const-err`
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/lint/force-warn/allowed-deny-by-default-lint.stderr b/src/test/ui/lint/force-warn/allowed-deny-by-default-lint.stderr
index 05656afd22d..dd71a168960 100644
--- a/src/test/ui/lint/force-warn/allowed-deny-by-default-lint.stderr
+++ b/src/test/ui/lint/force-warn/allowed-deny-by-default-lint.stderr
@@ -12,3 +12,16 @@ LL | const C: i32 = 1 / 0;
 
 warning: 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/allowed-deny-by-default-lint.rs:7:16
+   |
+LL | const C: i32 = 1 / 0;
+   | ---------------^^^^^-
+   |                |
+   |                attempt to divide `1_i32` by zero
+   |
+   = note: requested on the command line with `--force-warn const-err`
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.rs b/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.rs
index 4ac29ff7d99..06b37286776 100644
--- a/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.rs
+++ b/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.rs
@@ -6,6 +6,6 @@
 #![allow(dead_code)]
 
 fn dead_function() {}
-//~^ WARN function is never used
+//~^ WARN function `dead_function` is never used
 
 fn main() {}
diff --git a/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.stderr b/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.stderr
index c46d7403fd0..a6634e212bd 100644
--- a/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.stderr
+++ b/src/test/ui/lint/force-warn/allowed-warn-by-default-lint.stderr
@@ -1,4 +1,4 @@
-warning: function is never used: `dead_function`
+warning: function `dead_function` is never used
   --> $DIR/allowed-warn-by-default-lint.rs:8:4
    |
 LL | fn dead_function() {}
diff --git a/src/test/ui/lint/force-warn/deny-by-default-lint.stderr b/src/test/ui/lint/force-warn/deny-by-default-lint.stderr
index ef295f99e64..d4e80584669 100644
--- a/src/test/ui/lint/force-warn/deny-by-default-lint.stderr
+++ b/src/test/ui/lint/force-warn/deny-by-default-lint.stderr
@@ -12,3 +12,16 @@ LL | const C: i32 = 1 / 0;
 
 warning: 1 warning emitted
 
+Future incompatibility report: Future breakage diagnostic:
+warning: any use of this value will cause an error
+  --> $DIR/deny-by-default-lint.rs:5:16
+   |
+LL | const C: i32 = 1 / 0;
+   | ---------------^^^^^-
+   |                |
+   |                attempt to divide `1_i32` by zero
+   |
+   = note: requested on the command line with `--force-warn const-err`
+   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
+   = note: for more information, see issue #71800 <https://github.com/rust-lang/rust/issues/71800>
+
diff --git a/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.rs b/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.rs
index 267e7b45f0c..47a480ad708 100644
--- a/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.rs
+++ b/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.rs
@@ -7,12 +7,12 @@ mod one {
     #![allow(dead_code)]
 
     fn dead_function() {}
-    //~^ WARN function is never used
+    //~^ WARN function `dead_function` is never used
 }
 
 mod two {
     fn dead_function() {}
-    //~^ WARN function is never used
+    //~^ WARN function `dead_function` is never used
 }
 
 fn main() {}
diff --git a/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.stderr b/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.stderr
index 2a3cf85a1e3..824bcccc05f 100644
--- a/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.stderr
+++ b/src/test/ui/lint/force-warn/warn-by-default-lint-two-modules.stderr
@@ -1,4 +1,4 @@
-warning: function is never used: `dead_function`
+warning: function `dead_function` is never used
   --> $DIR/warn-by-default-lint-two-modules.rs:9:8
    |
 LL |     fn dead_function() {}
@@ -6,7 +6,7 @@ LL |     fn dead_function() {}
    |
    = note: requested on the command line with `--force-warn dead-code`
 
-warning: function is never used: `dead_function`
+warning: function `dead_function` is never used
   --> $DIR/warn-by-default-lint-two-modules.rs:14:8
    |
 LL |     fn dead_function() {}
diff --git a/src/test/ui/lint/issue-17718-const-naming.rs b/src/test/ui/lint/issue-17718-const-naming.rs
index 7386478f9f0..d7f0e72769b 100644
--- a/src/test/ui/lint/issue-17718-const-naming.rs
+++ b/src/test/ui/lint/issue-17718-const-naming.rs
@@ -3,6 +3,6 @@
 
 const foo: isize = 3;
 //~^ ERROR: should have an upper case name
-//~^^ ERROR: constant is never used
+//~^^ ERROR: constant `foo` is never used
 
 fn main() {}
diff --git a/src/test/ui/lint/issue-17718-const-naming.stderr b/src/test/ui/lint/issue-17718-const-naming.stderr
index a1fc99c9a3d..4c97f6d63d4 100644
--- a/src/test/ui/lint/issue-17718-const-naming.stderr
+++ b/src/test/ui/lint/issue-17718-const-naming.stderr
@@ -1,4 +1,4 @@
-error: constant is never used: `foo`
+error: constant `foo` is never used
   --> $DIR/issue-17718-const-naming.rs:4:1
    |
 LL | const foo: isize = 3;
diff --git a/src/test/ui/issues/issue-35075.rs b/src/test/ui/lint/issue-35075.rs
index 0e54131c245..0e54131c245 100644
--- a/src/test/ui/issues/issue-35075.rs
+++ b/src/test/ui/lint/issue-35075.rs
diff --git a/src/test/ui/issues/issue-35075.stderr b/src/test/ui/lint/issue-35075.stderr
index 08bdaa72858..08bdaa72858 100644
--- a/src/test/ui/issues/issue-35075.stderr
+++ b/src/test/ui/lint/issue-35075.stderr
diff --git a/src/test/ui/lint/unused/unused-attr-doc-hidden.fixed b/src/test/ui/lint/unused/unused-attr-doc-hidden.fixed
deleted file mode 100644
index 362ad55707a..00000000000
--- a/src/test/ui/lint/unused/unused-attr-doc-hidden.fixed
+++ /dev/null
@@ -1,55 +0,0 @@
-#![feature(inherent_associated_types)]
-#![allow(dead_code, incomplete_features)]
-#![crate_type = "lib"]
-#![deny(unused_attributes)]
-// run-rustfix
-
-pub trait Trait {
-    type It;
-    const IT: ();
-    fn it0();
-    fn it1();
-    fn it2();
-}
-
-pub struct Implementor;
-
-impl Implementor {
-    #[doc(hidden)] // no error
-    type Inh = ();
-
-    #[doc(hidden)] // no error
-    const INH: () = ();
-
-    #[doc(hidden)] // no error
-    fn inh() {}
-}
-
-impl Trait for Implementor {
-    
-    type It = ();
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    
-    const IT: () = ();
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc(alias = "aka")]
-    fn it0() {}
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc(alias = "this", )]
-    fn it1() {}
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc()]
-    fn it2() {}
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-    //~|  ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-}
diff --git a/src/test/ui/lint/unused/unused-attr-doc-hidden.rs b/src/test/ui/lint/unused/unused-attr-doc-hidden.rs
deleted file mode 100644
index d493ed6dae2..00000000000
--- a/src/test/ui/lint/unused/unused-attr-doc-hidden.rs
+++ /dev/null
@@ -1,55 +0,0 @@
-#![feature(inherent_associated_types)]
-#![allow(dead_code, incomplete_features)]
-#![crate_type = "lib"]
-#![deny(unused_attributes)]
-// run-rustfix
-
-pub trait Trait {
-    type It;
-    const IT: ();
-    fn it0();
-    fn it1();
-    fn it2();
-}
-
-pub struct Implementor;
-
-impl Implementor {
-    #[doc(hidden)] // no error
-    type Inh = ();
-
-    #[doc(hidden)] // no error
-    const INH: () = ();
-
-    #[doc(hidden)] // no error
-    fn inh() {}
-}
-
-impl Trait for Implementor {
-    #[doc(hidden)]
-    type It = ();
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc(hidden)]
-    const IT: () = ();
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc(hidden, alias = "aka")]
-    fn it0() {}
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc(alias = "this", hidden,)]
-    fn it1() {}
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-
-    #[doc(hidden, hidden)]
-    fn it2() {}
-    //~^^ ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-    //~|  ERROR `#[doc(hidden)]` is ignored
-    //~|  WARNING this was previously accepted
-}
diff --git a/src/test/ui/lint/unused/unused-attr-doc-hidden.stderr b/src/test/ui/lint/unused/unused-attr-doc-hidden.stderr
deleted file mode 100644
index f167bd460db..00000000000
--- a/src/test/ui/lint/unused/unused-attr-doc-hidden.stderr
+++ /dev/null
@@ -1,67 +0,0 @@
-error: `#[doc(hidden)]` is ignored on trait impl items
-  --> $DIR/unused-attr-doc-hidden.rs:29:5
-   |
-LL |     #[doc(hidden)]
-   |     ^^^^^^^^^^^^^^ help: remove this attribute
-   |
-note: the lint level is defined here
-  --> $DIR/unused-attr-doc-hidden.rs:4:9
-   |
-LL | #![deny(unused_attributes)]
-   |         ^^^^^^^^^^^^^^^^^
-   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
-
-error: `#[doc(hidden)]` is ignored on trait impl items
-  --> $DIR/unused-attr-doc-hidden.rs:34:5
-   |
-LL |     #[doc(hidden)]
-   |     ^^^^^^^^^^^^^^ help: remove this attribute
-   |
-   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
-
-error: `#[doc(hidden)]` is ignored on trait impl items
-  --> $DIR/unused-attr-doc-hidden.rs:39:11
-   |
-LL |     #[doc(hidden, alias = "aka")]
-   |           ^^^^^^--
-   |           |
-   |           help: remove this attribute
-   |
-   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
-
-error: `#[doc(hidden)]` is ignored on trait impl items
-  --> $DIR/unused-attr-doc-hidden.rs:44:27
-   |
-LL |     #[doc(alias = "this", hidden,)]
-   |                           ^^^^^^-
-   |                           |
-   |                           help: remove this attribute
-   |
-   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
-
-error: `#[doc(hidden)]` is ignored on trait impl items
-  --> $DIR/unused-attr-doc-hidden.rs:49:11
-   |
-LL |     #[doc(hidden, hidden)]
-   |           ^^^^^^--
-   |           |
-   |           help: remove this attribute
-   |
-   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
-
-error: `#[doc(hidden)]` is ignored on trait impl items
-  --> $DIR/unused-attr-doc-hidden.rs:49:19
-   |
-LL |     #[doc(hidden, hidden)]
-   |                   ^^^^^^ help: remove this attribute
-   |
-   = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
-   = note: whether the impl item is `doc(hidden)` or not entirely depends on the corresponding trait item
-
-error: aborting due to 6 previous errors
-
diff --git a/src/test/ui/lub-glb/empty-binder-future-compat.rs b/src/test/ui/lub-glb/empty-binder-future-compat.rs
new file mode 100644
index 00000000000..8700a88a36e
--- /dev/null
+++ b/src/test/ui/lub-glb/empty-binder-future-compat.rs
@@ -0,0 +1,22 @@
+// check-pass
+fn lt_in_fn_fn<'a: 'a>() -> fn(fn(&'a ())) {
+    |_| ()
+}
+
+
+fn foo<'a, 'b, 'lower>(v: bool)
+where
+    'a: 'lower,
+    'b: 'lower,
+{
+        // if we infer `x` to be higher ranked in the future,
+        // this would cause a type error.
+        let x = match v {
+            true => lt_in_fn_fn::<'a>(),
+            false => lt_in_fn_fn::<'b>(),
+        };
+
+        let _: fn(fn(&'lower())) = x;
+}
+
+fn main() {}
diff --git a/src/test/ui/lub-glb/empty-binders-err.rs b/src/test/ui/lub-glb/empty-binders-err.rs
new file mode 100644
index 00000000000..557480173ee
--- /dev/null
+++ b/src/test/ui/lub-glb/empty-binders-err.rs
@@ -0,0 +1,55 @@
+fn lt<'a: 'a>() -> &'a () {
+    &()
+}
+
+fn lt_in_fn<'a: 'a>() -> fn(&'a ()) {
+    |_| ()
+}
+
+struct Contra<'a>(fn(&'a ()));
+fn lt_in_contra<'a: 'a>() -> Contra<'a> {
+    Contra(|_| ())
+}
+
+fn covariance<'a, 'b, 'upper>(v: bool)
+where
+    'upper: 'a,
+    'upper: 'b,
+
+{
+    let _: &'upper () = match v {
+        //~^ ERROR lifetime may not live long enough
+        //~| ERROR lifetime may not live long enough
+        true => lt::<'a>(),
+        false => lt::<'b>(),
+    };
+}
+
+fn contra_fn<'a, 'b, 'lower>(v: bool)
+where
+    'a: 'lower,
+    'b: 'lower,
+
+{
+
+    let _: fn(&'lower ()) = match v {
+        //~^ ERROR lifetime may not live long enough
+        true => lt_in_fn::<'a>(),
+        false => lt_in_fn::<'b>(),
+    };
+}
+
+fn contra_struct<'a, 'b, 'lower>(v: bool)
+where
+    'a: 'lower,
+    'b: 'lower,
+
+{
+    let _: Contra<'lower> = match v {
+        //~^ ERROR lifetime may not live long enough
+        true => lt_in_contra::<'a>(),
+        false => lt_in_contra::<'b>(),
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/lub-glb/empty-binders-err.stderr b/src/test/ui/lub-glb/empty-binders-err.stderr
new file mode 100644
index 00000000000..f86f22d5e40
--- /dev/null
+++ b/src/test/ui/lub-glb/empty-binders-err.stderr
@@ -0,0 +1,59 @@
+error: lifetime may not live long enough
+  --> $DIR/empty-binders-err.rs:20:12
+   |
+LL | fn covariance<'a, 'b, 'upper>(v: bool)
+   |               --      ------ lifetime `'upper` defined here
+   |               |
+   |               lifetime `'a` defined here
+...
+LL |     let _: &'upper () = match v {
+   |            ^^^^^^^^^^ type annotation requires that `'a` must outlive `'upper`
+   |
+   = help: consider adding the following bound: `'a: 'upper`
+
+error: lifetime may not live long enough
+  --> $DIR/empty-binders-err.rs:20:12
+   |
+LL | fn covariance<'a, 'b, 'upper>(v: bool)
+   |                   --  ------ lifetime `'upper` defined here
+   |                   |
+   |                   lifetime `'b` defined here
+...
+LL |     let _: &'upper () = match v {
+   |            ^^^^^^^^^^ type annotation requires that `'b` must outlive `'upper`
+   |
+   = help: consider adding the following bound: `'b: 'upper`
+
+help: the following changes may resolve your lifetime errors
+   |
+   = help: add bound `'a: 'upper`
+   = help: add bound `'b: 'upper`
+
+error: lifetime may not live long enough
+  --> $DIR/empty-binders-err.rs:35:12
+   |
+LL | fn contra_fn<'a, 'b, 'lower>(v: bool)
+   |              --      ------ lifetime `'lower` defined here
+   |              |
+   |              lifetime `'a` defined here
+...
+LL |     let _: fn(&'lower ()) = match v {
+   |            ^^^^^^^^^^^^^^ type annotation requires that `'lower` must outlive `'a`
+   |
+   = help: consider adding the following bound: `'lower: 'a`
+
+error: lifetime may not live long enough
+  --> $DIR/empty-binders-err.rs:48:12
+   |
+LL | fn contra_struct<'a, 'b, 'lower>(v: bool)
+   |                  --      ------ lifetime `'lower` defined here
+   |                  |
+   |                  lifetime `'a` defined here
+...
+LL |     let _: Contra<'lower> = match v {
+   |            ^^^^^^^^^^^^^^ type annotation requires that `'lower` must outlive `'a`
+   |
+   = help: consider adding the following bound: `'lower: 'a`
+
+error: aborting due to 4 previous errors
+
diff --git a/src/test/ui/lub-glb/empty-binders.rs b/src/test/ui/lub-glb/empty-binders.rs
new file mode 100644
index 00000000000..f9d07e79fda
--- /dev/null
+++ b/src/test/ui/lub-glb/empty-binders.rs
@@ -0,0 +1,45 @@
+// check-pass
+//
+// Check that computing the lub works even for empty binders.
+fn lt<'a: 'a>() -> &'a () {
+    &()
+}
+
+fn lt_in_fn<'a: 'a>() -> fn(&'a ()) {
+    |_| ()
+}
+
+struct Contra<'a>(fn(&'a ()));
+fn lt_in_contra<'a: 'a>() -> Contra<'a> {
+    Contra(|_| ())
+}
+
+fn ok<'a, 'b, 'upper, 'lower>(v: bool)
+where
+    'upper: 'a,
+    'upper: 'b,
+    'a: 'lower,
+    'b: 'lower,
+
+{
+    let _: &'lower () = match v {
+        true => lt::<'a>(),
+        false => lt::<'b>(),
+    };
+
+    // This errored in the past because LUB and GLB always
+    // bailed out when encountering binders, even if they were
+    // empty.
+    let _: fn(&'upper ()) = match v {
+        true => lt_in_fn::<'a>(),
+        false => lt_in_fn::<'b>(),
+    };
+
+    // This was already accepted, as relate didn't encounter any binders.
+    let _: Contra<'upper> = match v {
+        true => lt_in_contra::<'a>(),
+        false => lt_in_contra::<'b>(),
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/macros/cfg.rs b/src/test/ui/macros/cfg.rs
index 222161a8183..2aac50a9d01 100644
--- a/src/test/ui/macros/cfg.rs
+++ b/src/test/ui/macros/cfg.rs
@@ -2,4 +2,5 @@ fn main() {
     cfg!(); //~ ERROR macro requires a cfg-pattern
     cfg!(123); //~ ERROR expected identifier
     cfg!(foo = 123); //~ ERROR literal in `cfg` predicate value must be a string
+    cfg!(foo, bar); //~ ERROR expected 1 cfg-pattern
 }
diff --git a/src/test/ui/macros/cfg.stderr b/src/test/ui/macros/cfg.stderr
index 4785ef9aae4..2633d5f720d 100644
--- a/src/test/ui/macros/cfg.stderr
+++ b/src/test/ui/macros/cfg.stderr
@@ -18,6 +18,14 @@ error[E0565]: literal in `cfg` predicate value must be a string
 LL |     cfg!(foo = 123);
    |                ^^^
 
-error: aborting due to 3 previous errors
+error: expected 1 cfg-pattern
+  --> $DIR/cfg.rs:5:5
+   |
+LL |     cfg!(foo, bar);
+   |     ^^^^^^^^^^^^^^
+   |
+   = note: this error originates in the macro `cfg` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 4 previous errors
 
 For more information about this error, try `rustc --explain E0565`.
diff --git a/src/test/ui/issues/issue-8851.rs b/src/test/ui/macros/issue-8851.rs
index faacfe5f895..faacfe5f895 100644
--- a/src/test/ui/issues/issue-8851.rs
+++ b/src/test/ui/macros/issue-8851.rs
diff --git a/src/test/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs b/src/test/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs
index c0e9f29fdbc..f538ec64390 100644
--- a/src/test/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs
+++ b/src/test/ui/macros/rfc-2011-nicer-assert-messages/all-expr-kinds.rs
@@ -55,14 +55,56 @@ struct Foo {
   bar: i32
 }
 
+impl Foo {
+  fn add(&self, a: i32, b: i32) -> i32 { a + b }
+}
+
+fn add(a: i32, b: i32) -> i32 { a + b }
+
 fn main() {
   // ***** Allowed *****
 
   tests!(
     let mut elem = 1i32;
 
+    // addr of
+    [ &elem == &3 ] => "Assertion failed: &elem == &3\nWith captures:\n  elem = 1\n"
+
+    // array
+    [ [elem][0] == 3 ] => "Assertion failed: [elem][0] == 3\nWith captures:\n  elem = 1\n"
+
     // binary
     [ elem + 1 == 3 ] => "Assertion failed: elem + 1 == 3\nWith captures:\n  elem = 1\n"
+
+    // call
+    [ add(elem, elem) == 3 ] => "Assertion failed: add(elem, elem) == 3\nWith captures:\n  elem = 1\n"
+
+    // cast
+    [ elem as i32 == 3 ] => "Assertion failed: elem as i32 == 3\nWith captures:\n  elem = 1\n"
+
+    // index
+    [ [1i32, 1][elem as usize] == 3 ] => "Assertion failed: [1i32, 1][elem as usize] == 3\nWith captures:\n  elem = 1\n"
+
+    // method call
+    [ FOO.add(elem, elem) == 3 ] => "Assertion failed: FOO.add(elem, elem) == 3\nWith captures:\n  elem = 1\n"
+
+    // paren
+    [ (elem) == 3 ] => "Assertion failed: (elem) == 3\nWith captures:\n  elem = 1\n"
+
+    // range
+    [ (0..elem) == (0..3) ] => "Assertion failed: (0..elem) == (0..3)\nWith captures:\n  elem = 1\n"
+
+    // repeat
+    [ [elem; 1] == [3; 1] ] => "Assertion failed: [elem; 1] == [3; 1]\nWith captures:\n  elem = 1\n"
+
+    // struct
+    [ Foo { bar: elem } == Foo { bar: 3 } ] => "Assertion failed: Foo { bar: elem } == Foo { bar: 3 }\nWith captures:\n  elem = 1\n"
+
+    // tuple
+    [ (elem, 1) == (3, 3) ] => "Assertion failed: (elem, 1) == (3, 3)\nWith captures:\n  elem = 1\n"
+
+    // unary
+    [ -elem == -3 ] => "Assertion failed: -elem == -3\nWith captures:\n  elem = 1\n"
   );
 
   // ***** Disallowed *****
diff --git a/src/test/ui/issues/issue-46920-byte-array-patterns.rs b/src/test/ui/match/issue-46920-byte-array-patterns.rs
index 2a8b4bb4922..2a8b4bb4922 100644
--- a/src/test/ui/issues/issue-46920-byte-array-patterns.rs
+++ b/src/test/ui/match/issue-46920-byte-array-patterns.rs
diff --git a/src/test/ui/methods/method-call-err-msg.stderr b/src/test/ui/methods/method-call-err-msg.stderr
index 53e582f7f13..77308a2c521 100644
--- a/src/test/ui/methods/method-call-err-msg.stderr
+++ b/src/test/ui/methods/method-call-err-msg.stderr
@@ -27,8 +27,8 @@ LL |     fn one(self, _: isize) -> Foo { self }
    |        ^^^ ----  --------
 help: provide the argument
    |
-LL |      .one({isize})
-   |       ~~~~~~~~~~~~
+LL |      .one(/* isize */)
+   |       ~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 2 arguments but 1 argument was supplied
   --> $DIR/method-call-err-msg.rs:15:7
@@ -43,16 +43,16 @@ LL |     fn two(self, _: isize, _: isize) -> Foo { self }
    |        ^^^ ----  --------  --------
 help: provide the argument
    |
-LL |      .two(0, {isize});
-   |       ~~~~~~~~~~~~~~~
+LL |      .two(0, /* isize */);
+   |       ~~~~~~~~~~~~~~~~~~~
 
 error[E0599]: `Foo` is not an iterator
   --> $DIR/method-call-err-msg.rs:19:7
    |
 LL | pub struct Foo;
    | ---------------
-   | |
-   | method `take` not found for this
+   | |          |
+   | |          method `take` not found for this struct
    | doesn't satisfy `Foo: Iterator`
 ...
 LL |      .take()
@@ -89,8 +89,8 @@ LL |     fn three<T>(self, _: T, _: T, _: T) -> Foo { self }
    |        ^^^^^    ----  ----  ----  ----
 help: provide the arguments
    |
-LL |     y.three::<usize>({usize}, {usize}, {usize});
-   |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |     y.three::<usize>(/* usize */, /* usize */, /* usize */);
+   |       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to 5 previous errors
 
diff --git a/src/test/ui/methods/method-not-found-generic-arg-elision.stderr b/src/test/ui/methods/method-not-found-generic-arg-elision.stderr
index 1671e5e5e64..492d480e13e 100644
--- a/src/test/ui/methods/method-not-found-generic-arg-elision.stderr
+++ b/src/test/ui/methods/method-not-found-generic-arg-elision.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `distance` found for struct `Point<i32>` in the cu
   --> $DIR/method-not-found-generic-arg-elision.rs:82:23
    |
 LL | struct Point<T> {
-   | --------------- method `distance` not found for this
+   |        ----- method `distance` not found for this struct
 ...
 LL |     let d = point_i32.distance();
    |                       ^^^^^^^^ method not found in `Point<i32>`
@@ -14,7 +14,7 @@ error[E0599]: no method named `other` found for struct `Point` in the current sc
   --> $DIR/method-not-found-generic-arg-elision.rs:84:23
    |
 LL | struct Point<T> {
-   | --------------- method `other` not found for this
+   |        ----- method `other` not found for this struct
 ...
 LL |     let d = point_i32.other();
    |                       ^^^^^ method not found in `Point<i32>`
@@ -29,7 +29,7 @@ error[E0599]: no method named `method` found for struct `Wrapper<bool>` in the c
   --> $DIR/method-not-found-generic-arg-elision.rs:90:13
    |
 LL | struct Wrapper<T>(T);
-   | --------------------- method `method` not found for this
+   |        ------- method `method` not found for this struct
 ...
 LL |     wrapper.method();
    |             ^^^^^^ method not found in `Wrapper<bool>`
@@ -45,7 +45,7 @@ error[E0599]: no method named `other` found for struct `Wrapper` in the current
   --> $DIR/method-not-found-generic-arg-elision.rs:92:13
    |
 LL | struct Wrapper<T>(T);
-   | --------------------- method `other` not found for this
+   |        ------- method `other` not found for this struct
 ...
 LL |     wrapper.other();
    |             ^^^^^ method not found in `Wrapper<bool>`
@@ -54,7 +54,7 @@ error[E0599]: no method named `method` found for struct `Wrapper2<'_, bool, 3_us
   --> $DIR/method-not-found-generic-arg-elision.rs:96:13
    |
 LL | struct Wrapper2<'a, T, const C: usize> {
-   | -------------------------------------- method `method` not found for this
+   |        -------- method `method` not found for this struct
 ...
 LL |     wrapper.method();
    |             ^^^^^^ method not found in `Wrapper2<'_, bool, 3_usize>`
@@ -68,7 +68,7 @@ error[E0599]: no method named `other` found for struct `Wrapper2` in the current
   --> $DIR/method-not-found-generic-arg-elision.rs:98:13
    |
 LL | struct Wrapper2<'a, T, const C: usize> {
-   | -------------------------------------- method `other` not found for this
+   |        -------- method `other` not found for this struct
 ...
 LL |     wrapper.other();
    |             ^^^^^ method not found in `Wrapper2<'_, bool, 3_usize>`
@@ -83,7 +83,7 @@ error[E0599]: the method `method` exists for struct `Struct<f64>`, but its trait
   --> $DIR/method-not-found-generic-arg-elision.rs:104:7
    |
 LL | struct Struct<T>{
-   | ---------------- method `method` not found for this
+   |        ------ method `method` not found for this struct
 ...
 LL |     s.method();
    |       ^^^^^^ method cannot be called on `Struct<f64>` due to unsatisfied trait bounds
diff --git a/src/test/ui/mir/issue-92893.rs b/src/test/ui/mir/issue-92893.rs
index d2bbb4f1101..635050f376c 100644
--- a/src/test/ui/mir/issue-92893.rs
+++ b/src/test/ui/mir/issue-92893.rs
@@ -1,6 +1,7 @@
 struct Bug<A = [(); (let a = (), 1).1]> {
     //~^ `let` expressions are not supported here
-    //~^^ `let` expressions in this position are unstable [E0658]
+    //~| `let` expressions in this position are unstable [E0658]
+    //~| expected expression, found `let` statement
     a: A
 }
 
diff --git a/src/test/ui/mir/issue-92893.stderr b/src/test/ui/mir/issue-92893.stderr
index 063b5d66feb..4a0fcce31d7 100644
--- a/src/test/ui/mir/issue-92893.stderr
+++ b/src/test/ui/mir/issue-92893.stderr
@@ -1,3 +1,9 @@
+error: expected expression, found `let` statement
+  --> $DIR/issue-92893.rs:1:22
+   |
+LL | struct Bug<A = [(); (let a = (), 1).1]> {
+   |                      ^^^
+
 error: `let` expressions are not supported here
   --> $DIR/issue-92893.rs:1:22
    |
@@ -15,6 +21,6 @@ LL | struct Bug<A = [(); (let a = (), 1).1]> {
    = note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
    = help: add `#![feature(let_chains)]` to the crate attributes to enable
 
-error: aborting due to 2 previous errors
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/mir/ssa-analysis-regression-50041.rs b/src/test/ui/mir/ssa-analysis-regression-50041.rs
index 8c382ff0558..8e9c14a03c3 100644
--- a/src/test/ui/mir/ssa-analysis-regression-50041.rs
+++ b/src/test/ui/mir/ssa-analysis-regression-50041.rs
@@ -1,27 +1,29 @@
 // build-pass
 // compile-flags: -Z mir-opt-level=4
 
-#![crate_type="lib"]
+#![crate_type = "lib"]
 #![feature(lang_items)]
 #![no_std]
 
+struct NonNull<T: ?Sized>(*mut T);
+
+struct Unique<T: ?Sized>(NonNull<T>);
+
 #[lang = "owned_box"]
-pub struct Box<T: ?Sized>(*mut T, ());
+pub struct Box<T: ?Sized>(Unique<T>);
 
 impl<T: ?Sized> Drop for Box<T> {
-    fn drop(&mut self) {
-    }
+    fn drop(&mut self) {}
 }
 
 #[lang = "box_free"]
 #[inline(always)]
-unsafe fn box_free<T: ?Sized>(ptr: *mut T, _: ()) {
-    dealloc(ptr)
+unsafe fn box_free<T: ?Sized>(ptr: Unique<T>) {
+    dealloc(ptr.0.0)
 }
 
 #[inline(never)]
-fn dealloc<T: ?Sized>(_: *mut T) {
-}
+fn dealloc<T: ?Sized>(_: *mut T) {}
 
 pub struct Foo<T>(T);
 
diff --git a/src/test/ui/mismatched_types/overloaded-calls-bad.stderr b/src/test/ui/mismatched_types/overloaded-calls-bad.stderr
index a5742d6fe8c..4000b2ba312 100644
--- a/src/test/ui/mismatched_types/overloaded-calls-bad.stderr
+++ b/src/test/ui/mismatched_types/overloaded-calls-bad.stderr
@@ -25,8 +25,8 @@ LL |     extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output;
    |                           ^^^^^^^^
 help: provide the argument
    |
-LL |     let ans = s({isize});
-   |               ~~~~~~~~~~
+LL |     let ans = s(/* isize */);
+   |               ~~~~~~~~~~~~~~
 
 error[E0057]: this function takes 1 argument but 2 arguments were supplied
   --> $DIR/overloaded-calls-bad.rs:31:15
@@ -43,8 +43,8 @@ LL |     extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output;
    |                           ^^^^^^^^
 help: remove the extra argument
    |
-LL |     let ans = s({isize});
-   |               ~~~~~~~~~~
+LL |     let ans = s(/* isize */);
+   |               ~~~~~~~~~~~~~~
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/mismatched_types/ref-pat-suggestions.fixed b/src/test/ui/mismatched_types/ref-pat-suggestions.fixed
index ab8483eef49..d50acd1ac62 100644
--- a/src/test/ui/mismatched_types/ref-pat-suggestions.fixed
+++ b/src/test/ui/mismatched_types/ref-pat-suggestions.fixed
@@ -21,4 +21,17 @@ fn main() {
     let _ = |&mut _a: &mut u32| (); //~ ERROR mismatched types
     let _ = |&_a: &u32| (); //~ ERROR mismatched types
     let _ = |&mut _a: &mut u32| (); //~ ERROR mismatched types
+
+    #[allow(unused_mut)]
+    {
+        struct S(u8);
+
+        let mut _a = 0; //~ ERROR mismatched types
+        let S(_b) = S(0); //~ ERROR mismatched types
+        let (_c,) = (0,); //~ ERROR mismatched types
+
+        match 0 {
+            _d => {} //~ ERROR mismatched types
+        }
+    }
 }
diff --git a/src/test/ui/mismatched_types/ref-pat-suggestions.rs b/src/test/ui/mismatched_types/ref-pat-suggestions.rs
index 7e55539aa3d..1a77f687692 100644
--- a/src/test/ui/mismatched_types/ref-pat-suggestions.rs
+++ b/src/test/ui/mismatched_types/ref-pat-suggestions.rs
@@ -21,4 +21,17 @@ fn main() {
     let _ = |&mut &_a: &mut u32| (); //~ ERROR mismatched types
     let _ = |&&mut _a: &u32| (); //~ ERROR mismatched types
     let _ = |&mut &mut _a: &mut u32| (); //~ ERROR mismatched types
+
+    #[allow(unused_mut)]
+    {
+        struct S(u8);
+
+        let &mut _a = 0; //~ ERROR mismatched types
+        let S(&mut _b) = S(0); //~ ERROR mismatched types
+        let (&mut _c,) = (0,); //~ ERROR mismatched types
+
+        match 0 {
+            &mut _d => {} //~ ERROR mismatched types
+        }
+    }
 }
diff --git a/src/test/ui/mismatched_types/ref-pat-suggestions.stderr b/src/test/ui/mismatched_types/ref-pat-suggestions.stderr
index 0e8f8853fb7..d9501a9bbc6 100644
--- a/src/test/ui/mismatched_types/ref-pat-suggestions.stderr
+++ b/src/test/ui/mismatched_types/ref-pat-suggestions.stderr
@@ -24,6 +24,11 @@ LL | fn _f1(&mut _a: u32) {}
    |
    = note:           expected type `u32`
            found mutable reference `&mut _`
+note: to declare a mutable parameter use: `mut _a`
+  --> $DIR/ref-pat-suggestions.rs:4:8
+   |
+LL | fn _f1(&mut _a: u32) {}
+   |        ^^^^^^^
 help: to take parameter `_a` by reference, move `&mut` to the type
    |
 LL - fn _f1(&mut _a: u32) {}
@@ -122,6 +127,11 @@ LL |     let _: fn(u32) = |&mut _a| ();
    |
    = note:           expected type `u32`
            found mutable reference `&mut _`
+note: to declare a mutable parameter use: `mut _a`
+  --> $DIR/ref-pat-suggestions.rs:12:23
+   |
+LL |     let _: fn(u32) = |&mut _a| ();
+   |                       ^^^^^^^
 help: consider removing `&mut` from the pattern
    |
 LL -     let _: fn(u32) = |&mut _a| ();
@@ -222,6 +232,11 @@ LL |     let _ = |&mut _a: u32| ();
    |
    = note:           expected type `u32`
            found mutable reference `&mut _`
+note: to declare a mutable parameter use: `mut _a`
+  --> $DIR/ref-pat-suggestions.rs:19:14
+   |
+LL |     let _ = |&mut _a: u32| ();
+   |              ^^^^^^^
 help: to take parameter `_a` by reference, move `&mut` to the type
    |
 LL -     let _ = |&mut _a: u32| ();
@@ -292,6 +307,81 @@ LL -     let _ = |&mut &mut _a: &mut u32| ();
 LL +     let _ = |&mut _a: &mut u32| ();
    |
 
-error: aborting due to 18 previous errors
+error[E0308]: mismatched types
+  --> $DIR/ref-pat-suggestions.rs:29:13
+   |
+LL |         let &mut _a = 0;
+   |             ^^^^^^^   - this expression has type `{integer}`
+   |             |
+   |             expected integer, found `&mut _`
+   |             help: to declare a mutable variable use: `mut _a`
+   |
+   = note:           expected type `{integer}`
+           found mutable reference `&mut _`
+
+error[E0308]: mismatched types
+  --> $DIR/ref-pat-suggestions.rs:30:15
+   |
+LL |         let S(&mut _b) = S(0);
+   |               ^^^^^^^    ---- this expression has type `S`
+   |               |
+   |               expected `u8`, found `&mut _`
+   |
+   = note:           expected type `u8`
+           found mutable reference `&mut _`
+note: to declare a mutable binding use: `mut _b`
+  --> $DIR/ref-pat-suggestions.rs:30:15
+   |
+LL |         let S(&mut _b) = S(0);
+   |               ^^^^^^^
+help: consider removing `&mut` from the pattern
+   |
+LL -         let S(&mut _b) = S(0);
+LL +         let S(_b) = S(0);
+   |
+
+error[E0308]: mismatched types
+  --> $DIR/ref-pat-suggestions.rs:31:14
+   |
+LL |         let (&mut _c,) = (0,);
+   |              ^^^^^^^     ---- this expression has type `({integer},)`
+   |              |
+   |              expected integer, found `&mut _`
+   |
+   = note:           expected type `{integer}`
+           found mutable reference `&mut _`
+note: to declare a mutable binding use: `mut _c`
+  --> $DIR/ref-pat-suggestions.rs:31:14
+   |
+LL |         let (&mut _c,) = (0,);
+   |              ^^^^^^^
+help: consider removing `&mut` from the pattern
+   |
+LL -         let (&mut _c,) = (0,);
+LL +         let (_c,) = (0,);
+   |
+
+error[E0308]: mismatched types
+  --> $DIR/ref-pat-suggestions.rs:34:13
+   |
+LL |         match 0 {
+   |               - this expression has type `{integer}`
+LL |             &mut _d => {}
+   |             ^^^^^^^ expected integer, found `&mut _`
+   |
+   = note:           expected type `{integer}`
+           found mutable reference `&mut _`
+note: to declare a mutable binding use: `mut _d`
+  --> $DIR/ref-pat-suggestions.rs:34:13
+   |
+LL |             &mut _d => {}
+   |             ^^^^^^^
+help: consider removing `&mut` from the pattern
+   |
+LL -             &mut _d => {}
+LL +             _d => {}
+   |
+
+error: aborting due to 22 previous errors
 
 For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/mod-subitem-as-enum-variant.stderr b/src/test/ui/mod-subitem-as-enum-variant.stderr
index 15da1d155a3..cf61e94bd86 100644
--- a/src/test/ui/mod-subitem-as-enum-variant.stderr
+++ b/src/test/ui/mod-subitem-as-enum-variant.stderr
@@ -4,7 +4,7 @@ error[E0109]: type arguments are not allowed on module `Mod`
 LL |     Mod::<i32>::FakeVariant(0);
    |     ---   ^^^ type argument not allowed
    |     |
-   |     not allowed on this
+   |     not allowed on module `Mod`
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/borrowck/issue-27282-move-match-input-into-guard.rs b/src/test/ui/nll/issue-27282-move-match-input-into-guard.rs
index 4109c10e2e4..4109c10e2e4 100644
--- a/src/test/ui/borrowck/issue-27282-move-match-input-into-guard.rs
+++ b/src/test/ui/nll/issue-27282-move-match-input-into-guard.rs
diff --git a/src/test/ui/borrowck/issue-27282-move-match-input-into-guard.stderr b/src/test/ui/nll/issue-27282-move-match-input-into-guard.stderr
index 9be1a927999..9be1a927999 100644
--- a/src/test/ui/borrowck/issue-27282-move-match-input-into-guard.stderr
+++ b/src/test/ui/nll/issue-27282-move-match-input-into-guard.stderr
diff --git a/src/test/ui/issues/issue-27282-move-ref-mut-into-guard.rs b/src/test/ui/nll/issue-27282-move-ref-mut-into-guard.rs
index afa0ba780de..afa0ba780de 100644
--- a/src/test/ui/issues/issue-27282-move-ref-mut-into-guard.rs
+++ b/src/test/ui/nll/issue-27282-move-ref-mut-into-guard.rs
diff --git a/src/test/ui/issues/issue-27282-move-ref-mut-into-guard.stderr b/src/test/ui/nll/issue-27282-move-ref-mut-into-guard.stderr
index a0d32616f83..a0d32616f83 100644
--- a/src/test/ui/issues/issue-27282-move-ref-mut-into-guard.stderr
+++ b/src/test/ui/nll/issue-27282-move-ref-mut-into-guard.stderr
diff --git a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-1.rs b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-1.rs
index d17d6f07f68..d17d6f07f68 100644
--- a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-1.rs
+++ b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-1.rs
diff --git a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-1.stderr b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-1.stderr
index a1f973e0fdf..a1f973e0fdf 100644
--- a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-1.stderr
+++ b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-1.stderr
diff --git a/src/test/ui/borrowck/issue-27282-mutate-before-diverging-arm-2.rs b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-2.rs
index 9c3e7e9978e..9c3e7e9978e 100644
--- a/src/test/ui/borrowck/issue-27282-mutate-before-diverging-arm-2.rs
+++ b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-2.rs
diff --git a/src/test/ui/borrowck/issue-27282-mutate-before-diverging-arm-2.stderr b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-2.stderr
index dd46308d140..dd46308d140 100644
--- a/src/test/ui/borrowck/issue-27282-mutate-before-diverging-arm-2.stderr
+++ b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-2.stderr
diff --git a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-3.rs b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-3.rs
index cff9e963e27..cff9e963e27 100644
--- a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-3.rs
+++ b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-3.rs
diff --git a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-3.stderr b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-3.stderr
index 4a4a25790b9..4a4a25790b9 100644
--- a/src/test/ui/issues/issue-27282-mutate-before-diverging-arm-3.stderr
+++ b/src/test/ui/nll/issue-27282-mutate-before-diverging-arm-3.stderr
diff --git a/src/test/ui/borrowck/issue-27282-mutation-in-guard.rs b/src/test/ui/nll/issue-27282-mutation-in-guard.rs
index 395c7d214d0..395c7d214d0 100644
--- a/src/test/ui/borrowck/issue-27282-mutation-in-guard.rs
+++ b/src/test/ui/nll/issue-27282-mutation-in-guard.rs
diff --git a/src/test/ui/borrowck/issue-27282-mutation-in-guard.stderr b/src/test/ui/nll/issue-27282-mutation-in-guard.stderr
index c4ce7e62fda..c4ce7e62fda 100644
--- a/src/test/ui/borrowck/issue-27282-mutation-in-guard.stderr
+++ b/src/test/ui/nll/issue-27282-mutation-in-guard.stderr
diff --git a/src/test/ui/borrowck/issue-27282-reborrow-ref-mut-in-guard.rs b/src/test/ui/nll/issue-27282-reborrow-ref-mut-in-guard.rs
index 82d8b9e9ed9..82d8b9e9ed9 100644
--- a/src/test/ui/borrowck/issue-27282-reborrow-ref-mut-in-guard.rs
+++ b/src/test/ui/nll/issue-27282-reborrow-ref-mut-in-guard.rs
diff --git a/src/test/ui/borrowck/issue-27282-reborrow-ref-mut-in-guard.stderr b/src/test/ui/nll/issue-27282-reborrow-ref-mut-in-guard.stderr
index 48433432de1..48433432de1 100644
--- a/src/test/ui/borrowck/issue-27282-reborrow-ref-mut-in-guard.stderr
+++ b/src/test/ui/nll/issue-27282-reborrow-ref-mut-in-guard.stderr
diff --git a/src/test/ui/issues/issue-52057.rs b/src/test/ui/nll/issue-52057.rs
index 98f49fe8f55..98f49fe8f55 100644
--- a/src/test/ui/issues/issue-52057.rs
+++ b/src/test/ui/nll/issue-52057.rs
diff --git a/src/test/ui/nll/issue-97997.rs b/src/test/ui/nll/issue-97997.rs
new file mode 100644
index 00000000000..c64e720b12f
--- /dev/null
+++ b/src/test/ui/nll/issue-97997.rs
@@ -0,0 +1,16 @@
+trait Foo {
+    const ASSOC: bool = true;
+}
+impl<T> Foo for fn(T) {}
+
+fn foo(_x: i32) {}
+
+fn impls_foo<T: Foo>(_x: T) {}
+
+fn main() {
+    impls_foo(foo as fn(i32));
+
+    <fn(&u8) as Foo>::ASSOC;
+    //~^ ERROR implementation of `Foo` is not general enough
+    //~| ERROR implementation of `Foo` is not general enough
+}
diff --git a/src/test/ui/nll/issue-97997.stderr b/src/test/ui/nll/issue-97997.stderr
new file mode 100644
index 00000000000..78401bbf654
--- /dev/null
+++ b/src/test/ui/nll/issue-97997.stderr
@@ -0,0 +1,20 @@
+error: implementation of `Foo` is not general enough
+  --> $DIR/issue-97997.rs:13:5
+   |
+LL |     <fn(&u8) as Foo>::ASSOC;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough
+   |
+   = note: `Foo` would have to be implemented for the type `for<'r> fn(&'r u8)`
+   = note: ...but `Foo` is actually implemented for the type `fn(&'0 u8)`, for some specific lifetime `'0`
+
+error: implementation of `Foo` is not general enough
+  --> $DIR/issue-97997.rs:13:5
+   |
+LL |     <fn(&u8) as Foo>::ASSOC;
+   |     ^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough
+   |
+   = note: `Foo` would have to be implemented for the type `for<'r> fn(&'r u8)`
+   = note: ...but `Foo` is actually implemented for the type `fn(&'0 u8)`, for some specific lifetime `'0`
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/nll/issue-98170.rs b/src/test/ui/nll/issue-98170.rs
new file mode 100644
index 00000000000..6bb12f52d3f
--- /dev/null
+++ b/src/test/ui/nll/issue-98170.rs
@@ -0,0 +1,25 @@
+pub struct MyStruct<'a> {
+    field: &'a [u32],
+}
+
+impl MyStruct<'_> {
+    pub fn new<'a>(field: &'a [u32]) -> MyStruct<'a> {
+        Self { field }
+        //~^ ERROR lifetime may not live long enough
+        //~| ERROR lifetime may not live long enough
+    }
+}
+
+trait Trait<'a> {
+    fn new(field: &'a [u32]) -> MyStruct<'a>;
+}
+
+impl<'a> Trait<'a> for MyStruct<'_> {
+    fn new(field: &'a [u32]) -> MyStruct<'a> {
+        Self { field }
+        //~^ ERROR lifetime may not live long enough
+        //~| ERROR lifetime may not live long enough
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/nll/issue-98170.stderr b/src/test/ui/nll/issue-98170.stderr
new file mode 100644
index 00000000000..0d17365e71b
--- /dev/null
+++ b/src/test/ui/nll/issue-98170.stderr
@@ -0,0 +1,44 @@
+error: lifetime may not live long enough
+  --> $DIR/issue-98170.rs:7:9
+   |
+LL | impl MyStruct<'_> {
+   |               -- lifetime `'1` appears in the `impl`'s self type
+LL |     pub fn new<'a>(field: &'a [u32]) -> MyStruct<'a> {
+   |                -- lifetime `'a` defined here
+LL |         Self { field }
+   |         ^^^^^^^^^^^^^^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`
+
+error: lifetime may not live long enough
+  --> $DIR/issue-98170.rs:7:16
+   |
+LL | impl MyStruct<'_> {
+   |               -- lifetime `'1` appears in the `impl`'s self type
+LL |     pub fn new<'a>(field: &'a [u32]) -> MyStruct<'a> {
+   |                -- lifetime `'a` defined here
+LL |         Self { field }
+   |                ^^^^^ this usage requires that `'a` must outlive `'1`
+
+error: lifetime may not live long enough
+  --> $DIR/issue-98170.rs:19:9
+   |
+LL | impl<'a> Trait<'a> for MyStruct<'_> {
+   |      --                         -- lifetime `'1` appears in the `impl`'s self type
+   |      |
+   |      lifetime `'a` defined here
+LL |     fn new(field: &'a [u32]) -> MyStruct<'a> {
+LL |         Self { field }
+   |         ^^^^^^^^^^^^^^ associated function was supposed to return data with lifetime `'a` but it is returning data with lifetime `'1`
+
+error: lifetime may not live long enough
+  --> $DIR/issue-98170.rs:19:16
+   |
+LL | impl<'a> Trait<'a> for MyStruct<'_> {
+   |      --                         -- lifetime `'1` appears in the `impl`'s self type
+   |      |
+   |      lifetime `'a` defined here
+LL |     fn new(field: &'a [u32]) -> MyStruct<'a> {
+LL |         Self { field }
+   |                ^^^^^ this usage requires that `'a` must outlive `'1`
+
+error: aborting due to 4 previous errors
+
diff --git a/src/test/ui/nll/snocat-regression.rs b/src/test/ui/nll/snocat-regression.rs
new file mode 100644
index 00000000000..b2e5995aa5b
--- /dev/null
+++ b/src/test/ui/nll/snocat-regression.rs
@@ -0,0 +1,16 @@
+// Regression test from https://github.com/rust-lang/rust/pull/98109
+
+pub fn negotiate<S>(link: S)
+where
+    for<'a> &'a S: 'a,
+{
+    || {
+        //~^ ERROR `S` does not live long enough
+        //
+        // FIXME(#98437). This regressed at some point and
+        // probably should work.
+        let _x = link;
+    };
+}
+
+fn main() {}
diff --git a/src/test/ui/nll/snocat-regression.stderr b/src/test/ui/nll/snocat-regression.stderr
new file mode 100644
index 00000000000..0868984734d
--- /dev/null
+++ b/src/test/ui/nll/snocat-regression.stderr
@@ -0,0 +1,14 @@
+error: `S` does not live long enough
+  --> $DIR/snocat-regression.rs:7:5
+   |
+LL | /     || {
+LL | |
+LL | |         //
+LL | |         // FIXME(#98437). This regressed at some point and
+LL | |         // probably should work.
+LL | |         let _x = link;
+LL | |     };
+   | |_____^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/nll/type-test-universe.rs b/src/test/ui/nll/type-test-universe.rs
new file mode 100644
index 00000000000..f9801c07d7b
--- /dev/null
+++ b/src/test/ui/nll/type-test-universe.rs
@@ -0,0 +1,21 @@
+// Regression test for #98095: make sure that
+// we detect that S needs to outlive 'static.
+
+fn outlives_forall<T>()
+where
+    for<'u> T: 'u,
+{
+}
+
+fn test1<S>() {
+    outlives_forall::<S>();
+    //~^ ERROR `S` does not live long enough
+}
+
+struct Value<'a>(&'a ());
+fn test2<'a>() {
+    outlives_forall::<Value<'a>>();
+    //~^ ERROR lifetime may not live long enough
+}
+
+fn main() {}
diff --git a/src/test/ui/nll/type-test-universe.stderr b/src/test/ui/nll/type-test-universe.stderr
new file mode 100644
index 00000000000..242486c360a
--- /dev/null
+++ b/src/test/ui/nll/type-test-universe.stderr
@@ -0,0 +1,16 @@
+error: `S` does not live long enough
+  --> $DIR/type-test-universe.rs:11:5
+   |
+LL |     outlives_forall::<S>();
+   |     ^^^^^^^^^^^^^^^^^^^^^^
+
+error: lifetime may not live long enough
+  --> $DIR/type-test-universe.rs:17:5
+   |
+LL | fn test2<'a>() {
+   |          -- lifetime `'a` defined here
+LL |     outlives_forall::<Value<'a>>();
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
+
+error: aborting due to 2 previous errors
+
diff --git a/src/test/ui/nll/vimwiki-core-regression.rs b/src/test/ui/nll/vimwiki-core-regression.rs
new file mode 100644
index 00000000000..0a4ed7e0a40
--- /dev/null
+++ b/src/test/ui/nll/vimwiki-core-regression.rs
@@ -0,0 +1,37 @@
+// check-pass
+//
+// Regression test from crater run for
+// <https://github.com/rust-lang/rust/pull/98109>.
+
+
+pub trait ElementLike {}
+
+pub struct Located<T> where T: ElementLike {
+    inner: T,
+}
+
+pub struct BlockElement<'a>(&'a str);
+
+impl ElementLike for BlockElement<'_> {}
+
+
+pub struct Page<'a> {
+    /// Comprised of the elements within a page
+    pub elements: Vec<Located<BlockElement<'a>>>,
+}
+
+impl<'a, __IdxT> std::ops::Index<__IdxT> for Page<'a> where
+    Vec<Located<BlockElement<'a>>>: std::ops::Index<__IdxT>
+{
+    type Output =
+        <Vec<Located<BlockElement<'a>>> as
+        std::ops::Index<__IdxT>>::Output;
+
+    #[inline]
+    fn index(&self, idx: __IdxT) -> &Self::Output {
+        <Vec<Located<BlockElement<'a>>> as
+                std::ops::Index<__IdxT>>::index(&self.elements, idx)
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/no-send-res-ports.stderr b/src/test/ui/no-send-res-ports.stderr
index 80708c989fc..e4c57c04e72 100644
--- a/src/test/ui/no-send-res-ports.stderr
+++ b/src/test/ui/no-send-res-ports.stderr
@@ -22,7 +22,16 @@ note: required because it appears within the type `Foo`
    |
 LL |     struct Foo {
    |            ^^^
-   = note: required because it appears within the type `[closure@$DIR/no-send-res-ports.rs:25:19: 29:6]`
+note: required because it's used within this closure
+  --> $DIR/no-send-res-ports.rs:25:19
+   |
+LL |       thread::spawn(move|| {
+   |  ___________________^
+LL | |
+LL | |         let y = x;
+LL | |         println!("{:?}", y);
+LL | |     });
+   | |_____^
 note: required by a bound in `spawn`
   --> $SRC_DIR/std/src/thread/mod.rs:LL:COL
    |
diff --git a/src/test/ui/noncopyable-class.stderr b/src/test/ui/noncopyable-class.stderr
index 4674c16eb43..88e9cd6a9c0 100644
--- a/src/test/ui/noncopyable-class.stderr
+++ b/src/test/ui/noncopyable-class.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `clone` found for struct `Foo` in the current scop
   --> $DIR/noncopyable-class.rs:34:16
    |
 LL | struct Foo {
-   | ---------- method `clone` not found for this
+   |        --- method `clone` not found for this struct
 ...
 LL |     let _y = x.clone();
    |                ^^^^^ method not found in `Foo`
diff --git a/src/test/ui/not-clone-closure.stderr b/src/test/ui/not-clone-closure.stderr
index 78b35569c21..bebf561b120 100644
--- a/src/test/ui/not-clone-closure.stderr
+++ b/src/test/ui/not-clone-closure.stderr
@@ -10,7 +10,14 @@ LL |
 LL |       let hello = hello.clone();
    |                         ^^^^^ within `[closure@$DIR/not-clone-closure.rs:7:17: 9:6]`, the trait `Clone` is not implemented for `S`
    |
-   = note: required because it appears within the type `[closure@$DIR/not-clone-closure.rs:7:17: 9:6]`
+note: required because it's used within this closure
+  --> $DIR/not-clone-closure.rs:7:17
+   |
+LL |       let hello = move || {
+   |  _________________^
+LL | |         println!("Hello {}", a.0);
+LL | |     };
+   | |_____^
 help: consider annotating `S` with `#[derive(Clone)]`
    |
 LL | #[derive(Clone)]
diff --git a/src/test/ui/not-enough-arguments.stderr b/src/test/ui/not-enough-arguments.stderr
index 4f502acc95c..b1df578ea80 100644
--- a/src/test/ui/not-enough-arguments.stderr
+++ b/src/test/ui/not-enough-arguments.stderr
@@ -11,8 +11,8 @@ LL | fn foo(a: isize, b: isize, c: isize, d:isize) {
    |    ^^^ --------  --------  --------  -------
 help: provide the argument
    |
-LL |   foo(1, 2, 3, {isize});
-   |   ~~~~~~~~~~~~~~~~~~~~~
+LL |   foo(1, 2, 3, /* isize */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 6 arguments but 3 arguments were supplied
   --> $DIR/not-enough-arguments.rs:29:3
@@ -39,8 +39,8 @@ LL |     f: i32,
    |     ------
 help: provide the arguments
    |
-LL |   bar(1, 2, 3, {i32}, {i32}, {i32});
-   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |   bar(1, 2, 3, /* i32 */, /* i32 */, /* i32 */);
+   |   ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/numbers-arithmetic/promoted_overflow.rs b/src/test/ui/numbers-arithmetic/promoted_overflow.rs
index da59e81ed6b..ba168f773d8 100644
--- a/src/test/ui/numbers-arithmetic/promoted_overflow.rs
+++ b/src/test/ui/numbers-arithmetic/promoted_overflow.rs
@@ -3,6 +3,10 @@
 // run-fail
 // error-pattern: overflow
 // compile-flags: -C overflow-checks=yes
+// for some reason, fails to match error string on
+// wasm32-unknown-unknown with stripped debuginfo and symbols,
+// so don't strip it
+// compile-flags:-Cstrip=none
 
 fn main() {
     let x: &'static u32 = &(0u32 - 1);
diff --git a/src/test/ui/panics/issue-47429-short-backtraces.legacy.run.stderr b/src/test/ui/panics/issue-47429-short-backtraces.legacy.run.stderr
index fcdc070a4c3..b6223b93764 100644
--- a/src/test/ui/panics/issue-47429-short-backtraces.legacy.run.stderr
+++ b/src/test/ui/panics/issue-47429-short-backtraces.legacy.run.stderr
@@ -1,4 +1,4 @@
-thread 'main' panicked at 'explicit panic', $DIR/issue-47429-short-backtraces.rs:21:5
+thread 'main' panicked at 'explicit panic', $DIR/issue-47429-short-backtraces.rs:22:5
 stack backtrace:
    0: std::panicking::begin_panic
    1: issue_47429_short_backtraces::main
diff --git a/src/test/ui/panics/issue-47429-short-backtraces.rs b/src/test/ui/panics/issue-47429-short-backtraces.rs
index c34e00bab7c..f338ace6bb0 100644
--- a/src/test/ui/panics/issue-47429-short-backtraces.rs
+++ b/src/test/ui/panics/issue-47429-short-backtraces.rs
@@ -1,6 +1,7 @@
 // Regression test for #47429: short backtraces were not terminating correctly
 
 // compile-flags: -O
+// compile-flags:-Cstrip=none
 // run-fail
 // check-run-results
 // exec-env:RUST_BACKTRACE=1
diff --git a/src/test/ui/panics/issue-47429-short-backtraces.v0.run.stderr b/src/test/ui/panics/issue-47429-short-backtraces.v0.run.stderr
index 1cbf11739bf..c2bea449249 100644
--- a/src/test/ui/panics/issue-47429-short-backtraces.v0.run.stderr
+++ b/src/test/ui/panics/issue-47429-short-backtraces.v0.run.stderr
@@ -1,4 +1,4 @@
-thread 'main' panicked at 'explicit panic', $DIR/issue-47429-short-backtraces.rs:21:5
+thread 'main' panicked at 'explicit panic', $DIR/issue-47429-short-backtraces.rs:22:5
 stack backtrace:
    0: std::panicking::begin_panic::<&str>
    1: issue_47429_short_backtraces::main
diff --git a/src/test/ui/panics/runtime-switch.legacy.run.stderr b/src/test/ui/panics/runtime-switch.legacy.run.stderr
index 979cc56b831..f282f18839c 100644
--- a/src/test/ui/panics/runtime-switch.legacy.run.stderr
+++ b/src/test/ui/panics/runtime-switch.legacy.run.stderr
@@ -1,4 +1,4 @@
-thread 'main' panicked at 'explicit panic', $DIR/runtime-switch.rs:24:5
+thread 'main' panicked at 'explicit panic', $DIR/runtime-switch.rs:25:5
 stack backtrace:
    0: std::panicking::begin_panic
    1: runtime_switch::main
diff --git a/src/test/ui/panics/runtime-switch.rs b/src/test/ui/panics/runtime-switch.rs
index c1634811406..37ef961e2d0 100644
--- a/src/test/ui/panics/runtime-switch.rs
+++ b/src/test/ui/panics/runtime-switch.rs
@@ -1,6 +1,7 @@
 // Test for std::panic::set_backtrace_style.
 
 // compile-flags: -O
+// compile-flags:-Cstrip=none
 // run-fail
 // check-run-results
 // exec-env:RUST_BACKTRACE=0
diff --git a/src/test/ui/panics/runtime-switch.v0.run.stderr b/src/test/ui/panics/runtime-switch.v0.run.stderr
index 48f829c26d4..7ce9722e5ed 100644
--- a/src/test/ui/panics/runtime-switch.v0.run.stderr
+++ b/src/test/ui/panics/runtime-switch.v0.run.stderr
@@ -1,4 +1,4 @@
-thread 'main' panicked at 'explicit panic', $DIR/runtime-switch.rs:24:5
+thread 'main' panicked at 'explicit panic', $DIR/runtime-switch.rs:25:5
 stack backtrace:
    0: std::panicking::begin_panic::<&str>
    1: runtime_switch::main
diff --git a/src/test/ui/panics/unique-panic.rs b/src/test/ui/panics/unique-panic.rs
index 22e0d63d594..ae7911e5943 100644
--- a/src/test/ui/panics/unique-panic.rs
+++ b/src/test/ui/panics/unique-panic.rs
@@ -1,5 +1,9 @@
 // run-fail
 // error-pattern: panic
+// for some reason, fails to match error string on
+// wasm32-unknown-unknown with stripped debuginfo and symbols,
+// so don't strip it
+// compile-flags:-Cstrip=none
 
 fn main() {
     Box::new(panic!());
diff --git a/src/test/ui/parser/emoji-identifiers.stderr b/src/test/ui/parser/emoji-identifiers.stderr
index 7dc589e5563..40a85f7f74c 100644
--- a/src/test/ui/parser/emoji-identifiers.stderr
+++ b/src/test/ui/parser/emoji-identifiers.stderr
@@ -77,7 +77,7 @@ error[E0599]: no function or associated item named `full_of✨` found for struct
   --> $DIR/emoji-identifiers.rs:9:8
    |
 LL | struct 👀;
-   | ---------- function or associated item `full_of✨` not found for this
+   |        -- function or associated item `full_of✨` not found for this struct
 ...
 LL |     👀::full_of✨()
    |         ^^^^^^^^^
diff --git a/src/test/ui/parser/expr-as-stmt.stderr b/src/test/ui/parser/expr-as-stmt.stderr
index 8eb81301bc3..d4f64a7de5b 100644
--- a/src/test/ui/parser/expr-as-stmt.stderr
+++ b/src/test/ui/parser/expr-as-stmt.stderr
@@ -201,6 +201,10 @@ LL |     { true } || { true }
    |
    = note: expected type `bool`
            found closure `[closure@$DIR/expr-as-stmt.rs:51:14: 51:25]`
+help: use parentheses to call this closure
+   |
+LL |     { true } (|| { true })()
+   |              +           +++
 help: parentheses are required to parse this as an expression
    |
 LL |     ({ true }) || { true }
diff --git a/src/test/ui/parser/struct-literal-restrictions-in-lamda.stderr b/src/test/ui/parser/struct-literal-restrictions-in-lamda.stderr
index b948ab2abb5..e71f15ebfd2 100644
--- a/src/test/ui/parser/struct-literal-restrictions-in-lamda.stderr
+++ b/src/test/ui/parser/struct-literal-restrictions-in-lamda.stderr
@@ -25,6 +25,12 @@ LL | |     }.hi() {
    |
    = note: expected type `bool`
            found closure `[closure@$DIR/struct-literal-restrictions-in-lamda.rs:12:11: 14:11]`
+help: use parentheses to call this closure
+   |
+LL ~     while (|| Foo {
+LL |         x: 3
+LL ~     }.hi())() {
+   |
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/pattern/for-loop-bad-item.stderr b/src/test/ui/pattern/for-loop-bad-item.stderr
index ad737f7bd15..f064a25a9c9 100644
--- a/src/test/ui/pattern/for-loop-bad-item.stderr
+++ b/src/test/ui/pattern/for-loop-bad-item.stderr
@@ -8,6 +8,11 @@ LL |     for ((_, _), (&mut c, _)) in &mut map {
    |
    = note:           expected type `char`
            found mutable reference `&mut _`
+note: to declare a mutable binding use: `mut c`
+  --> $DIR/for-loop-bad-item.rs:7:19
+   |
+LL |     for ((_, _), (&mut c, _)) in &mut map {
+   |                   ^^^^^^
 help: consider removing `&mut` from the pattern
    |
 LL -     for ((_, _), (&mut c, _)) in &mut map {
diff --git a/src/test/ui/pattern/usefulness/integer-ranges/exhaustiveness.stderr b/src/test/ui/pattern/usefulness/integer-ranges/exhaustiveness.stderr
index fec54e89d63..f30ba05dff9 100644
--- a/src/test/ui/pattern/usefulness/integer-ranges/exhaustiveness.stderr
+++ b/src/test/ui/pattern/usefulness/integer-ranges/exhaustiveness.stderr
@@ -7,9 +7,8 @@ LL |     m!(0u8, 0..255);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `u8::MAX` not covered
   --> $DIR/exhaustiveness.rs:48:8
@@ -20,9 +19,8 @@ LL |     m!(0u8, 0..=254);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u8` not covered
   --> $DIR/exhaustiveness.rs:49:8
@@ -33,9 +31,8 @@ LL |     m!(0u8, 1..=255);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u8 => todo!() }
+   |                                +++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `42_u8` not covered
   --> $DIR/exhaustiveness.rs:50:8
@@ -46,9 +43,8 @@ LL |     m!(0u8, 0..42 | 43..=255);
    = note: the matched value is of type `u8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         42_u8 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 42_u8 => todo!() }
+   |                                ++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i8::MAX` not covered
   --> $DIR/exhaustiveness.rs:51:8
@@ -59,9 +55,8 @@ LL |     m!(0i8, -128..127);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i8::MAX` not covered
   --> $DIR/exhaustiveness.rs:52:8
@@ -72,9 +67,8 @@ LL |     m!(0i8, -128..=126);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i8::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i8::MAX => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `i8::MIN` not covered
   --> $DIR/exhaustiveness.rs:53:8
@@ -85,9 +79,8 @@ LL |     m!(0i8, -127..=127);
    = note: the matched value is of type `i8`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         i8::MIN => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, i8::MIN => todo!() }
+   |                                ++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_i8` not covered
   --> $DIR/exhaustiveness.rs:54:11
@@ -111,9 +104,8 @@ LL |     m!(0u128, 0..=ALMOST_MAX);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         u128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, u128::MAX => todo!() }
+   |                                ++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `5_u128..=u128::MAX` not covered
   --> $DIR/exhaustiveness.rs:60:8
@@ -124,9 +116,8 @@ LL |     m!(0u128, 0..=4);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         5_u128..=u128::MAX => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 5_u128..=u128::MAX => todo!() }
+   |                                +++++++++++++++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `0_u128` not covered
   --> $DIR/exhaustiveness.rs:61:8
@@ -137,9 +128,8 @@ LL |     m!(0u128, 1..=u128::MAX);
    = note: the matched value is of type `u128`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         0_u128 => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, 0_u128 => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `(126_u8..=127_u8, false)` not covered
   --> $DIR/exhaustiveness.rs:69:11
diff --git a/src/test/ui/pattern/usefulness/integer-ranges/pointer-sized-int.deny.stderr b/src/test/ui/pattern/usefulness/integer-ranges/pointer-sized-int.deny.stderr
index fa4146a7ad8..e3eb98ccdcd 100644
--- a/src/test/ui/pattern/usefulness/integer-ranges/pointer-sized-int.deny.stderr
+++ b/src/test/ui/pattern/usefulness/integer-ranges/pointer-sized-int.deny.stderr
@@ -39,9 +39,8 @@ LL |     m!(0usize, 0..=usize::MAX);
    = help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/pointer-sized-int.rs:24:8
@@ -54,9 +53,8 @@ LL |     m!(0usize, 0..5 | 5..=usize::MAX);
    = help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/pointer-sized-int.rs:26:8
@@ -69,9 +67,8 @@ LL |     m!(0usize, 0..usize::MAX | usize::MAX);
    = help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `usize` matching
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `(_, _)` not covered
   --> $DIR/pointer-sized-int.rs:28:8
@@ -82,9 +79,8 @@ LL |     m!((0usize, true), (0..5, true) | (5..=usize::MAX, true) | (0..=usize::
    = note: the matched value is of type `(usize, bool)`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         (_, _) => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, (_, _) => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/pointer-sized-int.rs:31:8
@@ -97,9 +93,8 @@ LL |     m!(0isize, isize::MIN..=isize::MAX);
    = help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/pointer-sized-int.rs:33:8
@@ -112,9 +107,8 @@ LL |     m!(0isize, isize::MIN..5 | 5..=isize::MAX);
    = help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/pointer-sized-int.rs:35:8
@@ -127,9 +121,8 @@ LL |     m!(0isize, isize::MIN..isize::MAX | isize::MAX);
    = help: add `#![feature(precise_pointer_size_matching)]` to the crate attributes to enable precise `isize` matching
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         _ => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, _ => todo!() }
+   |                                ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `(_, _)` not covered
   --> $DIR/pointer-sized-int.rs:37:8
@@ -140,9 +133,8 @@ LL |     m!((0isize, true), (isize::MIN..5, true)
    = note: the matched value is of type `(isize, bool)`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         match $s { $($t)+ => {}
-LL ~         (_, _) => todo!() }
-   |
+LL |         match $s { $($t)+ => {}, (_, _) => todo!() }
+   |                                +++++++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `_` not covered
   --> $DIR/pointer-sized-int.rs:41:11
diff --git a/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr b/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr
index e7fa6a7814f..89b4e06efda 100644
--- a/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr
+++ b/src/test/ui/pattern/usefulness/non-exhaustive-match.stderr
@@ -12,8 +12,8 @@ LL | enum T { A, B }
    = note: the matched value is of type `T`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL |     match x { T::B => { } A => todo!() }
-   |                           ++++++++++++
+LL |     match x { T::B => { }, A => todo!() }
+   |                          ++++++++++++++
 
 error[E0004]: non-exhaustive patterns: `false` not covered
   --> $DIR/non-exhaustive-match.rs:8:11
diff --git a/src/test/ui/pattern/usefulness/tuple-struct-nonexhaustive.stderr b/src/test/ui/pattern/usefulness/tuple-struct-nonexhaustive.stderr
index fc0430d06fa..e2a65ff8524 100644
--- a/src/test/ui/pattern/usefulness/tuple-struct-nonexhaustive.stderr
+++ b/src/test/ui/pattern/usefulness/tuple-struct-nonexhaustive.stderr
@@ -12,7 +12,7 @@ LL | struct Foo(isize, isize);
    = note: the matched value is of type `Foo`
 help: ensure that all possible cases are being handled by adding a match arm with a wildcard pattern or an explicit pattern as shown
    |
-LL ~         Foo(2, b) => println!("{}", b)
+LL ~         Foo(2, b) => println!("{}", b),
 LL +         Foo(_, _) => todo!()
    |
 
diff --git a/src/test/ui/privacy/issue-79593.rs b/src/test/ui/privacy/issue-79593.rs
index b94278bfdd2..39c222f7c34 100644
--- a/src/test/ui/privacy/issue-79593.rs
+++ b/src/test/ui/privacy/issue-79593.rs
@@ -16,7 +16,7 @@ mod foo {
 
 fn correct() {
     foo::Pub {};
-    //~^ ERROR cannot construct `Pub` with struct literal syntax due to inaccessible fields
+    //~^ ERROR cannot construct `Pub` with struct literal syntax due to private fields
 }
 
 fn wrong() {
diff --git a/src/test/ui/privacy/issue-79593.stderr b/src/test/ui/privacy/issue-79593.stderr
index b8c7d4f23a2..21ba760ad0b 100644
--- a/src/test/ui/privacy/issue-79593.stderr
+++ b/src/test/ui/privacy/issue-79593.stderr
@@ -10,11 +10,13 @@ error[E0063]: missing field `y` in initializer of `Enum`
 LL |         Enum::Variant { x: () };
    |         ^^^^^^^^^^^^^ missing `y`
 
-error: cannot construct `Pub` with struct literal syntax due to inaccessible fields
+error: cannot construct `Pub` with struct literal syntax due to private fields
   --> $DIR/issue-79593.rs:18:5
    |
 LL |     foo::Pub {};
    |     ^^^^^^^^
+   |
+   = note: ... and other private field `private` that was not provided
 
 error[E0063]: missing field `y` in initializer of `Enum`
   --> $DIR/issue-79593.rs:23:5
diff --git a/src/test/ui/regions/forall-wf-ref-reflexive.rs b/src/test/ui/regions/forall-wf-ref-reflexive.rs
new file mode 100644
index 00000000000..9c37d72d56b
--- /dev/null
+++ b/src/test/ui/regions/forall-wf-ref-reflexive.rs
@@ -0,0 +1,18 @@
+// Test that we consider `for<'a> &'a T: 'a` to be sufficient to prove
+// that `for<'a> &'a T: 'a`.
+//
+// FIXME. Except we don't!
+
+#![allow(warnings)]
+
+fn self_wf2<T>()
+where
+    for<'a> &'a T: 'a,
+{
+    self_wf2::<T>();
+    //~^ ERROR `T` does not live long enough
+    //
+    // FIXME. This ought to be accepted, presumably.
+}
+
+fn main() {}
diff --git a/src/test/ui/regions/forall-wf-ref-reflexive.stderr b/src/test/ui/regions/forall-wf-ref-reflexive.stderr
new file mode 100644
index 00000000000..3d059ccec72
--- /dev/null
+++ b/src/test/ui/regions/forall-wf-ref-reflexive.stderr
@@ -0,0 +1,8 @@
+error: `T` does not live long enough
+  --> $DIR/forall-wf-ref-reflexive.rs:12:5
+   |
+LL |     self_wf2::<T>();
+   |     ^^^^^^^^^^^^^^^
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/regions/forall-wf-reflexive.rs b/src/test/ui/regions/forall-wf-reflexive.rs
new file mode 100644
index 00000000000..8e6b8224b31
--- /dev/null
+++ b/src/test/ui/regions/forall-wf-reflexive.rs
@@ -0,0 +1,15 @@
+// Test that we consider `for<'a> T: 'a` to be sufficient to prove
+// that `for<'a> T: 'a`.
+//
+// check-pass
+
+#![allow(warnings)]
+
+fn self_wf1<T>()
+where
+    for<'a> T: 'a,
+{
+    self_wf1::<T>();
+}
+
+fn main() {}
diff --git a/src/test/ui/reify-intrinsic.stderr b/src/test/ui/reify-intrinsic.stderr
index 70a64446f6a..360557fb520 100644
--- a/src/test/ui/reify-intrinsic.stderr
+++ b/src/test/ui/reify-intrinsic.stderr
@@ -8,10 +8,6 @@ LL |     let _: unsafe extern "rust-intrinsic" fn(isize) -> usize = std::mem::tr
    |
    = note: expected fn pointer `unsafe extern "rust-intrinsic" fn(isize) -> usize`
                  found fn item `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}`
-help: use parentheses to call this function
-   |
-LL |     let _: unsafe extern "rust-intrinsic" fn(isize) -> usize = std::mem::transmute(...);
-   |                                                                                   +++++
 
 error[E0606]: casting `unsafe extern "rust-intrinsic" fn(_) -> _ {transmute::<_, _>}` as `unsafe extern "rust-intrinsic" fn(isize) -> usize` is invalid
   --> $DIR/reify-intrinsic.rs:11:13
diff --git a/src/test/ui/resolve/issue-24968.rs b/src/test/ui/resolve/issue-24968.rs
index 916b48205dc..19e16abcee3 100644
--- a/src/test/ui/resolve/issue-24968.rs
+++ b/src/test/ui/resolve/issue-24968.rs
@@ -1,5 +1,30 @@
+// Also includes more Self usages per #93796
+
 fn foo(_: Self) {
 //~^ ERROR cannot find type `Self`
 }
 
+fn foo2() {
+    let x: Self;
+    //~^ ERROR cannot find type `Self`
+}
+
+type Foo<T>
+where
+    Self: Clone,
+//~^ ERROR cannot find type `Self`
+= Vec<T>;
+
+const FOO: Self = 0;
+//~^ ERROR cannot find type `Self`
+
+const FOO2: u32 = Self::bar();
+//~^ ERROR failed to resolve: `Self`
+
+static FOO_S: Self = 0;
+//~^ ERROR cannot find type `Self`
+
+static FOO_S2: u32 = Self::bar();
+//~^ ERROR failed to resolve: `Self`
+
 fn main() {}
diff --git a/src/test/ui/resolve/issue-24968.stderr b/src/test/ui/resolve/issue-24968.stderr
index c891952c42b..7e539d25804 100644
--- a/src/test/ui/resolve/issue-24968.stderr
+++ b/src/test/ui/resolve/issue-24968.stderr
@@ -1,9 +1,57 @@
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
+  --> $DIR/issue-24968.rs:21:19
+   |
+LL | const FOO2: u32 = Self::bar();
+   |                   ^^^^ `Self` is only available in impls, traits, and type definitions
+
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
+  --> $DIR/issue-24968.rs:27:22
+   |
+LL | static FOO_S2: u32 = Self::bar();
+   |                      ^^^^ `Self` is only available in impls, traits, and type definitions
+
 error[E0411]: cannot find type `Self` in this scope
-  --> $DIR/issue-24968.rs:1:11
+  --> $DIR/issue-24968.rs:3:11
    |
 LL | fn foo(_: Self) {
-   |           ^^^^ `Self` is only available in impls, traits, and type definitions
+   |    ---    ^^^^ `Self` is only available in impls, traits, and type definitions
+   |    |
+   |    `Self` not allowed in a function
+
+error[E0411]: cannot find type `Self` in this scope
+  --> $DIR/issue-24968.rs:8:12
+   |
+LL | fn foo2() {
+   |    ---- `Self` not allowed in a function
+LL |     let x: Self;
+   |            ^^^^ `Self` is only available in impls, traits, and type definitions
+
+error[E0411]: cannot find type `Self` in this scope
+  --> $DIR/issue-24968.rs:14:5
+   |
+LL | type Foo<T>
+   |      --- `Self` not allowed in a type alias
+LL | where
+LL |     Self: Clone,
+   |     ^^^^ `Self` is only available in impls, traits, and type definitions
+
+error[E0411]: cannot find type `Self` in this scope
+  --> $DIR/issue-24968.rs:18:12
+   |
+LL | const FOO: Self = 0;
+   |       ---  ^^^^ `Self` is only available in impls, traits, and type definitions
+   |       |
+   |       `Self` not allowed in a constant item
+
+error[E0411]: cannot find type `Self` in this scope
+  --> $DIR/issue-24968.rs:24:15
+   |
+LL | static FOO_S: Self = 0;
+   |        -----  ^^^^ `Self` is only available in impls, traits, and type definitions
+   |        |
+   |        `Self` not allowed in a static item
 
-error: aborting due to previous error
+error: aborting due to 7 previous errors
 
-For more information about this error, try `rustc --explain E0411`.
+Some errors have detailed explanations: E0411, E0433.
+For more information about an error, try `rustc --explain E0411`.
diff --git a/src/test/ui/rfc-2294-if-let-guard/feature-gate.rs b/src/test/ui/rfc-2294-if-let-guard/feature-gate.rs
index 4a36515b991..bb1aff70d89 100644
--- a/src/test/ui/rfc-2294-if-let-guard/feature-gate.rs
+++ b/src/test/ui/rfc-2294-if-let-guard/feature-gate.rs
@@ -58,8 +58,10 @@ fn _macros() {
     }
     use_expr!((let 0 = 1 && 0 == 0));
     //~^ ERROR `let` expressions in this position are unstable
+    //~| ERROR expected expression, found `let` statement
     use_expr!((let 0 = 1));
     //~^ ERROR `let` expressions in this position are unstable
+    //~| ERROR expected expression, found `let` statement
     match () {
         #[cfg(FALSE)]
         () if let 0 = 1 => {}
diff --git a/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr b/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr
index 8d93fb87f7a..370a57318fd 100644
--- a/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr
+++ b/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr
@@ -1,5 +1,17 @@
+error: expected expression, found `let` statement
+  --> $DIR/feature-gate.rs:59:16
+   |
+LL |     use_expr!((let 0 = 1 && 0 == 0));
+   |                ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/feature-gate.rs:62:16
+   |
+LL |     use_expr!((let 0 = 1));
+   |                ^^^
+
 error: no rules expected the token `let`
-  --> $DIR/feature-gate.rs:69:15
+  --> $DIR/feature-gate.rs:71:15
    |
 LL |     macro_rules! use_expr {
    |     --------------------- when calling this macro
@@ -58,7 +70,7 @@ LL |         () if let Range { start: _, end: _ } = (true..true) && false => {}
    = help: you can write `if matches!(<expr>, <pattern>)` instead of `if let <pattern> = <expr>`
 
 error[E0658]: `if let` guards are experimental
-  --> $DIR/feature-gate.rs:65:12
+  --> $DIR/feature-gate.rs:67:12
    |
 LL |         () if let 0 = 1 => {}
    |            ^^^^^^^^^^^^
@@ -203,7 +215,7 @@ LL |     use_expr!((let 0 = 1 && 0 == 0));
    = help: add `#![feature(let_chains)]` to the crate attributes to enable
 
 error[E0658]: `let` expressions in this position are unstable
-  --> $DIR/feature-gate.rs:61:16
+  --> $DIR/feature-gate.rs:62:16
    |
 LL |     use_expr!((let 0 = 1));
    |                ^^^^^^^^^
@@ -211,6 +223,6 @@ LL |     use_expr!((let 0 = 1));
    = note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
    = help: add `#![feature(let_chains)]` to the crate attributes to enable
 
-error: aborting due to 23 previous errors
+error: aborting due to 25 previous errors
 
 For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs
index 1bd8b74240e..36b730505c2 100644
--- a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs
+++ b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.rs
@@ -81,9 +81,11 @@ fn _macros() {
     use_expr!((let 0 = 1 && 0 == 0));
     //~^ ERROR `let` expressions are not supported here
     //~| ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
     use_expr!((let 0 = 1));
     //~^ ERROR `let` expressions are not supported here
     //~| ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
 }
 
 fn nested_within_if_expr() {
@@ -147,7 +149,8 @@ fn nested_within_if_expr() {
     //~| ERROR mismatched types
     //~| ERROR mismatched types
 
-    if let true = let true = true {} //~ ERROR `let` expressions are not supported here
+    if let true = let true = true {}
+    //~^ ERROR `let` expressions are not supported here
 }
 
 fn nested_within_while_expr() {
@@ -211,7 +214,8 @@ fn nested_within_while_expr() {
     //~| ERROR mismatched types
     //~| ERROR mismatched types
 
-    while let true = let true = true {} //~ ERROR `let` expressions are not supported here
+    while let true = let true = true {}
+    //~^ ERROR `let` expressions are not supported here
 }
 
 fn not_error_because_clarified_intent() {
@@ -225,45 +229,85 @@ fn not_error_because_clarified_intent() {
 }
 
 fn outside_if_and_while_expr() {
-    &let 0 = 0; //~ ERROR `let` expressions are not supported here
+    &let 0 = 0;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
 
-    !let 0 = 0; //~ ERROR `let` expressions are not supported here
-    *let 0 = 0; //~ ERROR `let` expressions are not supported here
-    //~^ ERROR type `bool` cannot be dereferenced
-    -let 0 = 0; //~ ERROR `let` expressions are not supported here
-    //~^ ERROR cannot apply unary operator `-` to type `bool`
+    !let 0 = 0;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
+    *let 0 = 0;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR type `bool` cannot be dereferenced
+    //~| ERROR expected expression, found `let` statement
+    -let 0 = 0;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR cannot apply unary operator `-` to type `bool`
+    //~| ERROR expected expression, found `let` statement
 
     fn _check_try_binds_tighter() -> Result<(), ()> {
         let 0 = 0?;
         //~^ ERROR the `?` operator can only be applied to values that implement `Try`
         Ok(())
     }
-    (let 0 = 0)?; //~ ERROR `let` expressions are not supported here
-    //~^ ERROR the `?` operator can only be used in a function that returns `Result`
+    (let 0 = 0)?;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR the `?` operator can only be used in a function that returns `Result`
     //~| ERROR the `?` operator can only be applied to values that implement `Try`
+    //~| ERROR expected expression, found `let` statement
 
-    true || let 0 = 0; //~ ERROR `let` expressions are not supported here
-    (true || let 0 = 0); //~ ERROR `let` expressions are not supported here
-    true && (true || let 0 = 0); //~ ERROR `let` expressions are not supported here
+    true || let 0 = 0;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
+    (true || let 0 = 0);
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
+    true && (true || let 0 = 0);
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
 
     let mut x = true;
-    x = let 0 = 0; //~ ERROR `let` expressions are not supported here
+    x = let 0 = 0;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
 
-    true..(let 0 = 0); //~ ERROR `let` expressions are not supported here
-    ..(let 0 = 0); //~ ERROR `let` expressions are not supported here
-    (let 0 = 0)..; //~ ERROR `let` expressions are not supported here
+    true..(let 0 = 0);
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
+    ..(let 0 = 0);
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
+    (let 0 = 0)..;
+    //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
 
     (let Range { start: _, end: _ } = true..true || false);
     //~^ ERROR `let` expressions are not supported here
     //~| ERROR mismatched types
+    //~| ERROR expected expression, found `let` statement
 
     (let true = let true = true);
     //~^ ERROR `let` expressions are not supported here
+    //~| ERROR expected expression, found `let` statement
+    //~| ERROR expected expression, found `let` statement
+
+    {
+        #[cfg(FALSE)]
+        let x = true && let y = 1;
+        //~^ ERROR expected expression, found `let` statement
+    }
+
+    #[cfg(FALSE)]
+    {
+        [1, 2, 3][let _ = ()]
+        //~^ ERROR expected expression, found `let` statement
+    }
 
     // Check function tail position.
     &let 0 = 0
     //~^ ERROR `let` expressions are not supported here
     //~| ERROR mismatched types
+    //~| ERROR expected expression, found `let` statement
 }
 
 // Let's make sure that `let` inside const generic arguments are considered.
@@ -335,4 +379,14 @@ fn with_parenthesis() {
     let fun = || true;
     if let true = (true && fun()) && (true) {
     }
+
+    #[cfg(FALSE)]
+    let x = (true && let y = 1);
+    //~^ ERROR expected expression, found `let` statement
+
+    #[cfg(FALSE)]
+    {
+        ([1, 2, 3][let _ = ()])
+        //~^ ERROR expected expression, found `let` statement
+    }
 }
diff --git a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr
index dfc7fdc1ed2..5cf06cf4b27 100644
--- a/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr
+++ b/src/test/ui/rfc-2497-if-let-chains/disallowed-positions.stderr
@@ -1,5 +1,113 @@
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:232:6
+   |
+LL |     &let 0 = 0;
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:236:6
+   |
+LL |     !let 0 = 0;
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:239:6
+   |
+LL |     *let 0 = 0;
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:243:6
+   |
+LL |     -let 0 = 0;
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:253:6
+   |
+LL |     (let 0 = 0)?;
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:259:13
+   |
+LL |     true || let 0 = 0;
+   |             ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:262:14
+   |
+LL |     (true || let 0 = 0);
+   |              ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:265:22
+   |
+LL |     true && (true || let 0 = 0);
+   |                      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:270:9
+   |
+LL |     x = let 0 = 0;
+   |         ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:274:12
+   |
+LL |     true..(let 0 = 0);
+   |            ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:277:8
+   |
+LL |     ..(let 0 = 0);
+   |        ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:280:6
+   |
+LL |     (let 0 = 0)..;
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:284:6
+   |
+LL |     (let Range { start: _, end: _ } = true..true || false);
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:289:6
+   |
+LL |     (let true = let true = true);
+   |      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:289:17
+   |
+LL |     (let true = let true = true);
+   |                 ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:296:25
+   |
+LL |         let x = true && let y = 1;
+   |                         ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:302:19
+   |
+LL |         [1, 2, 3][let _ = ()]
+   |                   ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:307:6
+   |
+LL |     &let 0 = 0
+   |      ^^^
+
 error: expressions must be enclosed in braces to be used as const generic arguments
-  --> $DIR/disallowed-positions.rs:293:9
+  --> $DIR/disallowed-positions.rs:337:9
    |
 LL |         true && let 1 = 1
    |         ^^^^^^^^^^^^^^^^^
@@ -9,6 +117,30 @@ help: enclose the `const` expression in braces
 LL |         { true && let 1 = 1 }
    |         +                   +
 
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:384:22
+   |
+LL |     let x = (true && let y = 1);
+   |                      ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:389:20
+   |
+LL |         ([1, 2, 3][let _ = ()])
+   |                    ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:81:16
+   |
+LL |     use_expr!((let 0 = 1 && 0 == 0));
+   |                ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/disallowed-positions.rs:85:16
+   |
+LL |     use_expr!((let 0 = 1));
+   |                ^^^
+
 error: `let` expressions are not supported here
   --> $DIR/disallowed-positions.rs:29:9
    |
@@ -270,33 +402,33 @@ LL |     use_expr!((let 0 = 1 && 0 == 0));
    |                ^^^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:84:16
+  --> $DIR/disallowed-positions.rs:85:16
    |
 LL |     use_expr!((let 0 = 1));
    |                ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:84:16
+  --> $DIR/disallowed-positions.rs:85:16
    |
 LL |     use_expr!((let 0 = 1));
    |                ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:84:16
+  --> $DIR/disallowed-positions.rs:85:16
    |
 LL |     use_expr!((let 0 = 1));
    |                ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:84:16
+  --> $DIR/disallowed-positions.rs:85:16
    |
 LL |     use_expr!((let 0 = 1));
    |                ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:90:9
+  --> $DIR/disallowed-positions.rs:92:9
    |
 LL |     if &let 0 = 0 {}
    |         ^^^^^^^^^
@@ -304,7 +436,7 @@ LL |     if &let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:93:9
+  --> $DIR/disallowed-positions.rs:95:9
    |
 LL |     if !let 0 = 0 {}
    |         ^^^^^^^^^
@@ -312,7 +444,7 @@ LL |     if !let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:94:9
+  --> $DIR/disallowed-positions.rs:96:9
    |
 LL |     if *let 0 = 0 {}
    |         ^^^^^^^^^
@@ -320,7 +452,7 @@ LL |     if *let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:96:9
+  --> $DIR/disallowed-positions.rs:98:9
    |
 LL |     if -let 0 = 0 {}
    |         ^^^^^^^^^
@@ -328,72 +460,72 @@ LL |     if -let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:104:9
+  --> $DIR/disallowed-positions.rs:106:9
    |
 LL |     if (let 0 = 0)? {}
    |         ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:104:9
+  --> $DIR/disallowed-positions.rs:106:9
    |
 LL |     if (let 0 = 0)? {}
    |         ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:108:16
+  --> $DIR/disallowed-positions.rs:110:16
    |
 LL |     if true || let 0 = 0 {}
    |                ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:108:13
+  --> $DIR/disallowed-positions.rs:110:13
    |
 LL |     if true || let 0 = 0 {}
    |             ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:109:17
+  --> $DIR/disallowed-positions.rs:111:17
    |
 LL |     if (true || let 0 = 0) {}
    |                 ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:109:14
+  --> $DIR/disallowed-positions.rs:111:14
    |
 LL |     if (true || let 0 = 0) {}
    |              ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:110:25
+  --> $DIR/disallowed-positions.rs:112:25
    |
 LL |     if true && (true || let 0 = 0) {}
    |                         ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:110:22
+  --> $DIR/disallowed-positions.rs:112:22
    |
 LL |     if true && (true || let 0 = 0) {}
    |                      ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:111:25
+  --> $DIR/disallowed-positions.rs:113:25
    |
 LL |     if true || (true && let 0 = 0) {}
    |                         ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:111:17
+  --> $DIR/disallowed-positions.rs:113:17
    |
 LL |     if true || (true && let 0 = 0) {}
    |                 ^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:114:12
+  --> $DIR/disallowed-positions.rs:116:12
    |
 LL |     if x = let 0 = 0 {}
    |            ^^^^^^^^^
@@ -401,46 +533,46 @@ LL |     if x = let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:117:15
+  --> $DIR/disallowed-positions.rs:119:15
    |
 LL |     if true..(let 0 = 0) {}
    |               ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:117:15
+  --> $DIR/disallowed-positions.rs:119:15
    |
 LL |     if true..(let 0 = 0) {}
    |               ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:119:11
+  --> $DIR/disallowed-positions.rs:121:11
    |
 LL |     if ..(let 0 = 0) {}
    |           ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:119:11
+  --> $DIR/disallowed-positions.rs:121:11
    |
 LL |     if ..(let 0 = 0) {}
    |           ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:121:9
+  --> $DIR/disallowed-positions.rs:123:9
    |
 LL |     if (let 0 = 0).. {}
    |         ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:121:9
+  --> $DIR/disallowed-positions.rs:123:9
    |
 LL |     if (let 0 = 0).. {}
    |         ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:125:8
+  --> $DIR/disallowed-positions.rs:127:8
    |
 LL |     if let Range { start: _, end: _ } = true..true && false {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -448,7 +580,7 @@ LL |     if let Range { start: _, end: _ } = true..true && false {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:129:8
+  --> $DIR/disallowed-positions.rs:131:8
    |
 LL |     if let Range { start: _, end: _ } = true..true || false {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -456,7 +588,7 @@ LL |     if let Range { start: _, end: _ } = true..true || false {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:136:8
+  --> $DIR/disallowed-positions.rs:138:8
    |
 LL |     if let Range { start: F, end } = F..|| true {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -464,7 +596,7 @@ LL |     if let Range { start: F, end } = F..|| true {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:144:8
+  --> $DIR/disallowed-positions.rs:146:8
    |
 LL |     if let Range { start: true, end } = t..&&false {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -472,7 +604,7 @@ LL |     if let Range { start: true, end } = t..&&false {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:150:19
+  --> $DIR/disallowed-positions.rs:152:19
    |
 LL |     if let true = let true = true {}
    |                   ^^^^^^^^^^^^^^^
@@ -480,7 +612,7 @@ LL |     if let true = let true = true {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:154:12
+  --> $DIR/disallowed-positions.rs:157:12
    |
 LL |     while &let 0 = 0 {}
    |            ^^^^^^^^^
@@ -488,7 +620,7 @@ LL |     while &let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:157:12
+  --> $DIR/disallowed-positions.rs:160:12
    |
 LL |     while !let 0 = 0 {}
    |            ^^^^^^^^^
@@ -496,7 +628,7 @@ LL |     while !let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:158:12
+  --> $DIR/disallowed-positions.rs:161:12
    |
 LL |     while *let 0 = 0 {}
    |            ^^^^^^^^^
@@ -504,7 +636,7 @@ LL |     while *let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:160:12
+  --> $DIR/disallowed-positions.rs:163:12
    |
 LL |     while -let 0 = 0 {}
    |            ^^^^^^^^^
@@ -512,72 +644,72 @@ LL |     while -let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:168:12
+  --> $DIR/disallowed-positions.rs:171:12
    |
 LL |     while (let 0 = 0)? {}
    |            ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:168:12
+  --> $DIR/disallowed-positions.rs:171:12
    |
 LL |     while (let 0 = 0)? {}
    |            ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:172:19
+  --> $DIR/disallowed-positions.rs:175:19
    |
 LL |     while true || let 0 = 0 {}
    |                   ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:172:16
+  --> $DIR/disallowed-positions.rs:175:16
    |
 LL |     while true || let 0 = 0 {}
    |                ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:173:20
+  --> $DIR/disallowed-positions.rs:176:20
    |
 LL |     while (true || let 0 = 0) {}
    |                    ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:173:17
+  --> $DIR/disallowed-positions.rs:176:17
    |
 LL |     while (true || let 0 = 0) {}
    |                 ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:174:28
+  --> $DIR/disallowed-positions.rs:177:28
    |
 LL |     while true && (true || let 0 = 0) {}
    |                            ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:174:25
+  --> $DIR/disallowed-positions.rs:177:25
    |
 LL |     while true && (true || let 0 = 0) {}
    |                         ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:175:28
+  --> $DIR/disallowed-positions.rs:178:28
    |
 LL |     while true || (true && let 0 = 0) {}
    |                            ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:175:20
+  --> $DIR/disallowed-positions.rs:178:20
    |
 LL |     while true || (true && let 0 = 0) {}
    |                    ^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:178:15
+  --> $DIR/disallowed-positions.rs:181:15
    |
 LL |     while x = let 0 = 0 {}
    |               ^^^^^^^^^
@@ -585,46 +717,46 @@ LL |     while x = let 0 = 0 {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:181:18
+  --> $DIR/disallowed-positions.rs:184:18
    |
 LL |     while true..(let 0 = 0) {}
    |                  ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:181:18
+  --> $DIR/disallowed-positions.rs:184:18
    |
 LL |     while true..(let 0 = 0) {}
    |                  ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:183:14
+  --> $DIR/disallowed-positions.rs:186:14
    |
 LL |     while ..(let 0 = 0) {}
    |              ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:183:14
+  --> $DIR/disallowed-positions.rs:186:14
    |
 LL |     while ..(let 0 = 0) {}
    |              ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:185:12
+  --> $DIR/disallowed-positions.rs:188:12
    |
 LL |     while (let 0 = 0).. {}
    |            ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:185:12
+  --> $DIR/disallowed-positions.rs:188:12
    |
 LL |     while (let 0 = 0).. {}
    |            ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:189:11
+  --> $DIR/disallowed-positions.rs:192:11
    |
 LL |     while let Range { start: _, end: _ } = true..true && false {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -632,7 +764,7 @@ LL |     while let Range { start: _, end: _ } = true..true && false {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:193:11
+  --> $DIR/disallowed-positions.rs:196:11
    |
 LL |     while let Range { start: _, end: _ } = true..true || false {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -640,7 +772,7 @@ LL |     while let Range { start: _, end: _ } = true..true || false {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:200:11
+  --> $DIR/disallowed-positions.rs:203:11
    |
 LL |     while let Range { start: F, end } = F..|| true {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -648,7 +780,7 @@ LL |     while let Range { start: F, end } = F..|| true {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:208:11
+  --> $DIR/disallowed-positions.rs:211:11
    |
 LL |     while let Range { start: true, end } = t..&&false {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -656,7 +788,7 @@ LL |     while let Range { start: true, end } = t..&&false {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:214:22
+  --> $DIR/disallowed-positions.rs:217:22
    |
 LL |     while let true = let true = true {}
    |                      ^^^^^^^^^^^^^^^
@@ -664,7 +796,7 @@ LL |     while let true = let true = true {}
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:228:6
+  --> $DIR/disallowed-positions.rs:232:6
    |
 LL |     &let 0 = 0;
    |      ^^^^^^^^^
@@ -672,7 +804,7 @@ LL |     &let 0 = 0;
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:230:6
+  --> $DIR/disallowed-positions.rs:236:6
    |
 LL |     !let 0 = 0;
    |      ^^^^^^^^^
@@ -680,7 +812,7 @@ LL |     !let 0 = 0;
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:231:6
+  --> $DIR/disallowed-positions.rs:239:6
    |
 LL |     *let 0 = 0;
    |      ^^^^^^^^^
@@ -688,7 +820,7 @@ LL |     *let 0 = 0;
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:233:6
+  --> $DIR/disallowed-positions.rs:243:6
    |
 LL |     -let 0 = 0;
    |      ^^^^^^^^^
@@ -696,59 +828,59 @@ LL |     -let 0 = 0;
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:241:6
+  --> $DIR/disallowed-positions.rs:253:6
    |
 LL |     (let 0 = 0)?;
    |      ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:241:6
+  --> $DIR/disallowed-positions.rs:253:6
    |
 LL |     (let 0 = 0)?;
    |      ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:245:13
+  --> $DIR/disallowed-positions.rs:259:13
    |
 LL |     true || let 0 = 0;
    |             ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:245:10
+  --> $DIR/disallowed-positions.rs:259:10
    |
 LL |     true || let 0 = 0;
    |          ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:246:14
+  --> $DIR/disallowed-positions.rs:262:14
    |
 LL |     (true || let 0 = 0);
    |              ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:246:11
+  --> $DIR/disallowed-positions.rs:262:11
    |
 LL |     (true || let 0 = 0);
    |           ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:247:22
+  --> $DIR/disallowed-positions.rs:265:22
    |
 LL |     true && (true || let 0 = 0);
    |                      ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `||` operators are not supported in let chain expressions
-  --> $DIR/disallowed-positions.rs:247:19
+  --> $DIR/disallowed-positions.rs:265:19
    |
 LL |     true && (true || let 0 = 0);
    |                   ^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:250:9
+  --> $DIR/disallowed-positions.rs:270:9
    |
 LL |     x = let 0 = 0;
    |         ^^^^^^^^^
@@ -756,46 +888,46 @@ LL |     x = let 0 = 0;
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:252:12
+  --> $DIR/disallowed-positions.rs:274:12
    |
 LL |     true..(let 0 = 0);
    |            ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:252:12
+  --> $DIR/disallowed-positions.rs:274:12
    |
 LL |     true..(let 0 = 0);
    |            ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:253:8
+  --> $DIR/disallowed-positions.rs:277:8
    |
 LL |     ..(let 0 = 0);
    |        ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:253:8
+  --> $DIR/disallowed-positions.rs:277:8
    |
 LL |     ..(let 0 = 0);
    |        ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:254:6
+  --> $DIR/disallowed-positions.rs:280:6
    |
 LL |     (let 0 = 0)..;
    |      ^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:254:6
+  --> $DIR/disallowed-positions.rs:280:6
    |
 LL |     (let 0 = 0)..;
    |      ^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:256:6
+  --> $DIR/disallowed-positions.rs:284:6
    |
 LL |     (let Range { start: _, end: _ } = true..true || false);
    |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -803,20 +935,20 @@ LL |     (let Range { start: _, end: _ } = true..true || false);
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:260:6
+  --> $DIR/disallowed-positions.rs:289:6
    |
 LL |     (let true = let true = true);
    |      ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:260:6
+  --> $DIR/disallowed-positions.rs:289:6
    |
 LL |     (let true = let true = true);
    |      ^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:264:6
+  --> $DIR/disallowed-positions.rs:307:6
    |
 LL |     &let 0 = 0
    |      ^^^^^^^^^
@@ -824,7 +956,7 @@ LL |     &let 0 = 0
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:275:17
+  --> $DIR/disallowed-positions.rs:319:17
    |
 LL |         true && let 1 = 1
    |                 ^^^^^^^^^
@@ -832,7 +964,7 @@ LL |         true && let 1 = 1
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:279:17
+  --> $DIR/disallowed-positions.rs:323:17
    |
 LL |         true && let 1 = 1
    |                 ^^^^^^^^^
@@ -840,7 +972,7 @@ LL |         true && let 1 = 1
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:283:17
+  --> $DIR/disallowed-positions.rs:327:17
    |
 LL |         true && let 1 = 1
    |                 ^^^^^^^^^
@@ -848,7 +980,7 @@ LL |         true && let 1 = 1
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:293:17
+  --> $DIR/disallowed-positions.rs:337:17
    |
 LL |         true && let 1 = 1
    |                 ^^^^^^^^^
@@ -856,124 +988,124 @@ LL |         true && let 1 = 1
    = note: only supported directly in conditions of `if` and `while` expressions
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:302:9
+  --> $DIR/disallowed-positions.rs:346:9
    |
 LL |     if (let Some(a) = opt && true) {
    |         ^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:302:9
+  --> $DIR/disallowed-positions.rs:346:9
    |
 LL |     if (let Some(a) = opt && true) {
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:306:9
+  --> $DIR/disallowed-positions.rs:350:9
    |
 LL |     if (let Some(a) = opt) && true {
    |         ^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:306:9
+  --> $DIR/disallowed-positions.rs:350:9
    |
 LL |     if (let Some(a) = opt) && true {
    |         ^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:309:9
+  --> $DIR/disallowed-positions.rs:353:9
    |
 LL |     if (let Some(a) = opt) && (let Some(b) = a) {
    |         ^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:309:9
+  --> $DIR/disallowed-positions.rs:353:9
    |
 LL |     if (let Some(a) = opt) && (let Some(b) = a) {
    |         ^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:309:32
+  --> $DIR/disallowed-positions.rs:353:32
    |
 LL |     if (let Some(a) = opt) && (let Some(b) = a) {
    |                                ^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:309:32
+  --> $DIR/disallowed-positions.rs:353:32
    |
 LL |     if (let Some(a) = opt) && (let Some(b) = a) {
    |                                ^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:316:9
+  --> $DIR/disallowed-positions.rs:360:9
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
    |         ^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:316:9
+  --> $DIR/disallowed-positions.rs:360:9
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:316:31
+  --> $DIR/disallowed-positions.rs:360:31
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
    |                               ^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:316:31
+  --> $DIR/disallowed-positions.rs:360:31
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && b == 1 {
    |                               ^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:320:9
+  --> $DIR/disallowed-positions.rs:364:9
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && true {
    |         ^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:320:9
+  --> $DIR/disallowed-positions.rs:364:9
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && true {
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:320:31
+  --> $DIR/disallowed-positions.rs:364:31
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && true {
    |                               ^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:320:31
+  --> $DIR/disallowed-positions.rs:364:31
    |
 LL |     if (let Some(a) = opt && (let Some(b) = a)) && true {
    |                               ^^^^^^^^^^^^^^^
 
 error: `let` expressions are not supported here
-  --> $DIR/disallowed-positions.rs:324:9
+  --> $DIR/disallowed-positions.rs:368:9
    |
 LL |     if (let Some(a) = opt && (true)) && true {
    |         ^^^^^^^^^^^^^^^^^
    |
    = note: only supported directly in conditions of `if` and `while` expressions
 note: `let`s wrapped in parentheses are not supported in a context with let chains
-  --> $DIR/disallowed-positions.rs:324:9
+  --> $DIR/disallowed-positions.rs:368:9
    |
 LL |     if (let Some(a) = opt && (true)) && true {
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:90:8
+  --> $DIR/disallowed-positions.rs:92:8
    |
 LL |     if &let 0 = 0 {}
    |        ^^^^^^^^^^ expected `bool`, found `&bool`
@@ -985,19 +1117,19 @@ LL +     if let 0 = 0 {}
    |
 
 error[E0614]: type `bool` cannot be dereferenced
-  --> $DIR/disallowed-positions.rs:94:8
+  --> $DIR/disallowed-positions.rs:96:8
    |
 LL |     if *let 0 = 0 {}
    |        ^^^^^^^^^^
 
 error[E0600]: cannot apply unary operator `-` to type `bool`
-  --> $DIR/disallowed-positions.rs:96:8
+  --> $DIR/disallowed-positions.rs:98:8
    |
 LL |     if -let 0 = 0 {}
    |        ^^^^^^^^^^ cannot apply unary operator `-`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/disallowed-positions.rs:104:8
+  --> $DIR/disallowed-positions.rs:106:8
    |
 LL |     if (let 0 = 0)? {}
    |        ^^^^^^^^^^^^ the `?` operator cannot be applied to type `bool`
@@ -1005,7 +1137,7 @@ LL |     if (let 0 = 0)? {}
    = help: the trait `Try` is not implemented for `bool`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/disallowed-positions.rs:104:19
+  --> $DIR/disallowed-positions.rs:106:19
    |
 LL | / fn nested_within_if_expr() {
 LL | |     if &let 0 = 0 {}
@@ -1015,14 +1147,14 @@ LL | |
 LL | |     if (let 0 = 0)? {}
    | |                   ^ cannot use the `?` operator in a function that returns `()`
 ...  |
-LL | |     if let true = let true = true {}
+LL | |
 LL | | }
    | |_- this function should return `Result` or `Option` to accept `?`
    |
    = help: the trait `FromResidual<_>` is not implemented for `()`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:114:8
+  --> $DIR/disallowed-positions.rs:116:8
    |
 LL |     if x = let 0 = 0 {}
    |        ^^^^^^^^^^^^^ expected `bool`, found `()`
@@ -1033,7 +1165,7 @@ LL |     if x == let 0 = 0 {}
    |          ~~
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:117:8
+  --> $DIR/disallowed-positions.rs:119:8
    |
 LL |     if true..(let 0 = 0) {}
    |        ^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1042,7 +1174,7 @@ LL |     if true..(let 0 = 0) {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:119:8
+  --> $DIR/disallowed-positions.rs:121:8
    |
 LL |     if ..(let 0 = 0) {}
    |        ^^^^^^^^^^^^^ expected `bool`, found struct `RangeTo`
@@ -1051,7 +1183,7 @@ LL |     if ..(let 0 = 0) {}
             found struct `RangeTo<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:121:8
+  --> $DIR/disallowed-positions.rs:123:8
    |
 LL |     if (let 0 = 0).. {}
    |        ^^^^^^^^^^^^^ expected `bool`, found struct `RangeFrom`
@@ -1060,7 +1192,7 @@ LL |     if (let 0 = 0).. {}
             found struct `RangeFrom<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:125:12
+  --> $DIR/disallowed-positions.rs:127:12
    |
 LL |     if let Range { start: _, end: _ } = true..true && false {}
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^   ---- this expression has type `bool`
@@ -1071,7 +1203,7 @@ LL |     if let Range { start: _, end: _ } = true..true && false {}
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:125:8
+  --> $DIR/disallowed-positions.rs:127:8
    |
 LL |     if let Range { start: _, end: _ } = true..true && false {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1080,7 +1212,7 @@ LL |     if let Range { start: _, end: _ } = true..true && false {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:129:12
+  --> $DIR/disallowed-positions.rs:131:12
    |
 LL |     if let Range { start: _, end: _ } = true..true || false {}
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^   ---- this expression has type `bool`
@@ -1091,7 +1223,7 @@ LL |     if let Range { start: _, end: _ } = true..true || false {}
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:129:8
+  --> $DIR/disallowed-positions.rs:131:8
    |
 LL |     if let Range { start: _, end: _ } = true..true || false {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1100,7 +1232,7 @@ LL |     if let Range { start: _, end: _ } = true..true || false {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:136:12
+  --> $DIR/disallowed-positions.rs:138:12
    |
 LL |     if let Range { start: F, end } = F..|| true {}
    |            ^^^^^^^^^^^^^^^^^^^^^^^   - this expression has type `fn() -> bool`
@@ -1111,16 +1243,20 @@ LL |     if let Range { start: F, end } = F..|| true {}
                   found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:136:41
+  --> $DIR/disallowed-positions.rs:138:41
    |
 LL |     if let Range { start: F, end } = F..|| true {}
    |                                         ^^^^^^^ expected `bool`, found closure
    |
    = note: expected type `bool`
-           found closure `[closure@$DIR/disallowed-positions.rs:136:41: 136:48]`
+           found closure `[closure@$DIR/disallowed-positions.rs:138:41: 138:48]`
+help: use parentheses to call this closure
+   |
+LL |     if let Range { start: F, end } = F..(|| true)() {}
+   |                                         +       +++
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:136:8
+  --> $DIR/disallowed-positions.rs:138:8
    |
 LL |     if let Range { start: F, end } = F..|| true {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1129,7 +1265,7 @@ LL |     if let Range { start: F, end } = F..|| true {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:144:12
+  --> $DIR/disallowed-positions.rs:146:12
    |
 LL |     if let Range { start: true, end } = t..&&false {}
    |            ^^^^^^^^^^^^^^^^^^^^^^^^^^   - this expression has type `&&bool`
@@ -1140,7 +1276,7 @@ LL |     if let Range { start: true, end } = t..&&false {}
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:144:44
+  --> $DIR/disallowed-positions.rs:146:44
    |
 LL |     if let Range { start: true, end } = t..&&false {}
    |                                            ^^^^^^^ expected `bool`, found `&&bool`
@@ -1152,7 +1288,7 @@ LL +     if let Range { start: true, end } = t..false {}
    |
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:144:8
+  --> $DIR/disallowed-positions.rs:146:8
    |
 LL |     if let Range { start: true, end } = t..&&false {}
    |        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1161,7 +1297,7 @@ LL |     if let Range { start: true, end } = t..&&false {}
             found struct `std::ops::Range<bool>`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/disallowed-positions.rs:100:20
+  --> $DIR/disallowed-positions.rs:102:20
    |
 LL |         if let 0 = 0? {}
    |                    ^^ the `?` operator cannot be applied to type `{integer}`
@@ -1169,7 +1305,7 @@ LL |         if let 0 = 0? {}
    = help: the trait `Try` is not implemented for `{integer}`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:154:11
+  --> $DIR/disallowed-positions.rs:157:11
    |
 LL |     while &let 0 = 0 {}
    |           ^^^^^^^^^^ expected `bool`, found `&bool`
@@ -1181,19 +1317,19 @@ LL +     while let 0 = 0 {}
    |
 
 error[E0614]: type `bool` cannot be dereferenced
-  --> $DIR/disallowed-positions.rs:158:11
+  --> $DIR/disallowed-positions.rs:161:11
    |
 LL |     while *let 0 = 0 {}
    |           ^^^^^^^^^^
 
 error[E0600]: cannot apply unary operator `-` to type `bool`
-  --> $DIR/disallowed-positions.rs:160:11
+  --> $DIR/disallowed-positions.rs:163:11
    |
 LL |     while -let 0 = 0 {}
    |           ^^^^^^^^^^ cannot apply unary operator `-`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/disallowed-positions.rs:168:11
+  --> $DIR/disallowed-positions.rs:171:11
    |
 LL |     while (let 0 = 0)? {}
    |           ^^^^^^^^^^^^ the `?` operator cannot be applied to type `bool`
@@ -1201,7 +1337,7 @@ LL |     while (let 0 = 0)? {}
    = help: the trait `Try` is not implemented for `bool`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/disallowed-positions.rs:168:22
+  --> $DIR/disallowed-positions.rs:171:22
    |
 LL | / fn nested_within_while_expr() {
 LL | |     while &let 0 = 0 {}
@@ -1211,14 +1347,14 @@ LL | |
 LL | |     while (let 0 = 0)? {}
    | |                      ^ cannot use the `?` operator in a function that returns `()`
 ...  |
-LL | |     while let true = let true = true {}
+LL | |
 LL | | }
    | |_- this function should return `Result` or `Option` to accept `?`
    |
    = help: the trait `FromResidual<_>` is not implemented for `()`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:178:11
+  --> $DIR/disallowed-positions.rs:181:11
    |
 LL |     while x = let 0 = 0 {}
    |           ^^^^^^^^^^^^^ expected `bool`, found `()`
@@ -1229,7 +1365,7 @@ LL |     while x == let 0 = 0 {}
    |             ~~
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:181:11
+  --> $DIR/disallowed-positions.rs:184:11
    |
 LL |     while true..(let 0 = 0) {}
    |           ^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1238,7 +1374,7 @@ LL |     while true..(let 0 = 0) {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:183:11
+  --> $DIR/disallowed-positions.rs:186:11
    |
 LL |     while ..(let 0 = 0) {}
    |           ^^^^^^^^^^^^^ expected `bool`, found struct `RangeTo`
@@ -1247,7 +1383,7 @@ LL |     while ..(let 0 = 0) {}
             found struct `RangeTo<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:185:11
+  --> $DIR/disallowed-positions.rs:188:11
    |
 LL |     while (let 0 = 0).. {}
    |           ^^^^^^^^^^^^^ expected `bool`, found struct `RangeFrom`
@@ -1256,7 +1392,7 @@ LL |     while (let 0 = 0).. {}
             found struct `RangeFrom<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:189:15
+  --> $DIR/disallowed-positions.rs:192:15
    |
 LL |     while let Range { start: _, end: _ } = true..true && false {}
    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^   ---- this expression has type `bool`
@@ -1267,7 +1403,7 @@ LL |     while let Range { start: _, end: _ } = true..true && false {}
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:189:11
+  --> $DIR/disallowed-positions.rs:192:11
    |
 LL |     while let Range { start: _, end: _ } = true..true && false {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1276,7 +1412,7 @@ LL |     while let Range { start: _, end: _ } = true..true && false {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:193:15
+  --> $DIR/disallowed-positions.rs:196:15
    |
 LL |     while let Range { start: _, end: _ } = true..true || false {}
    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^   ---- this expression has type `bool`
@@ -1287,7 +1423,7 @@ LL |     while let Range { start: _, end: _ } = true..true || false {}
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:193:11
+  --> $DIR/disallowed-positions.rs:196:11
    |
 LL |     while let Range { start: _, end: _ } = true..true || false {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1296,7 +1432,7 @@ LL |     while let Range { start: _, end: _ } = true..true || false {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:200:15
+  --> $DIR/disallowed-positions.rs:203:15
    |
 LL |     while let Range { start: F, end } = F..|| true {}
    |               ^^^^^^^^^^^^^^^^^^^^^^^   - this expression has type `fn() -> bool`
@@ -1307,16 +1443,20 @@ LL |     while let Range { start: F, end } = F..|| true {}
                   found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:200:44
+  --> $DIR/disallowed-positions.rs:203:44
    |
 LL |     while let Range { start: F, end } = F..|| true {}
    |                                            ^^^^^^^ expected `bool`, found closure
    |
    = note: expected type `bool`
-           found closure `[closure@$DIR/disallowed-positions.rs:200:44: 200:51]`
+           found closure `[closure@$DIR/disallowed-positions.rs:203:44: 203:51]`
+help: use parentheses to call this closure
+   |
+LL |     while let Range { start: F, end } = F..(|| true)() {}
+   |                                            +       +++
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:200:11
+  --> $DIR/disallowed-positions.rs:203:11
    |
 LL |     while let Range { start: F, end } = F..|| true {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1325,7 +1465,7 @@ LL |     while let Range { start: F, end } = F..|| true {}
             found struct `std::ops::Range<bool>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:208:15
+  --> $DIR/disallowed-positions.rs:211:15
    |
 LL |     while let Range { start: true, end } = t..&&false {}
    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^   - this expression has type `&&bool`
@@ -1336,7 +1476,7 @@ LL |     while let Range { start: true, end } = t..&&false {}
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:208:47
+  --> $DIR/disallowed-positions.rs:211:47
    |
 LL |     while let Range { start: true, end } = t..&&false {}
    |                                               ^^^^^^^ expected `bool`, found `&&bool`
@@ -1348,7 +1488,7 @@ LL +     while let Range { start: true, end } = t..false {}
    |
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:208:11
+  --> $DIR/disallowed-positions.rs:211:11
    |
 LL |     while let Range { start: true, end } = t..&&false {}
    |           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `bool`, found struct `std::ops::Range`
@@ -1357,7 +1497,7 @@ LL |     while let Range { start: true, end } = t..&&false {}
             found struct `std::ops::Range<bool>`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/disallowed-positions.rs:164:23
+  --> $DIR/disallowed-positions.rs:167:23
    |
 LL |         while let 0 = 0? {}
    |                       ^^ the `?` operator cannot be applied to type `{integer}`
@@ -1365,19 +1505,19 @@ LL |         while let 0 = 0? {}
    = help: the trait `Try` is not implemented for `{integer}`
 
 error[E0614]: type `bool` cannot be dereferenced
-  --> $DIR/disallowed-positions.rs:231:5
+  --> $DIR/disallowed-positions.rs:239:5
    |
 LL |     *let 0 = 0;
    |     ^^^^^^^^^^
 
 error[E0600]: cannot apply unary operator `-` to type `bool`
-  --> $DIR/disallowed-positions.rs:233:5
+  --> $DIR/disallowed-positions.rs:243:5
    |
 LL |     -let 0 = 0;
    |     ^^^^^^^^^^ cannot apply unary operator `-`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/disallowed-positions.rs:241:5
+  --> $DIR/disallowed-positions.rs:253:5
    |
 LL |     (let 0 = 0)?;
    |     ^^^^^^^^^^^^ the `?` operator cannot be applied to type `bool`
@@ -1385,12 +1525,12 @@ LL |     (let 0 = 0)?;
    = help: the trait `Try` is not implemented for `bool`
 
 error[E0277]: the `?` operator can only be used in a function that returns `Result` or `Option` (or another type that implements `FromResidual`)
-  --> $DIR/disallowed-positions.rs:241:16
+  --> $DIR/disallowed-positions.rs:253:16
    |
 LL | / fn outside_if_and_while_expr() {
 LL | |     &let 0 = 0;
 LL | |
-LL | |     !let 0 = 0;
+LL | |
 ...  |
 LL | |     (let 0 = 0)?;
    | |                ^ cannot use the `?` operator in a function that returns `()`
@@ -1402,7 +1542,7 @@ LL | | }
    = help: the trait `FromResidual<_>` is not implemented for `()`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:256:10
+  --> $DIR/disallowed-positions.rs:284:10
    |
 LL |     (let Range { start: _, end: _ } = true..true || false);
    |          ^^^^^^^^^^^^^^^^^^^^^^^^^^   ---- this expression has type `bool`
@@ -1413,7 +1553,7 @@ LL |     (let Range { start: _, end: _ } = true..true || false);
             found struct `std::ops::Range<_>`
 
 error[E0308]: mismatched types
-  --> $DIR/disallowed-positions.rs:264:5
+  --> $DIR/disallowed-positions.rs:307:5
    |
 LL | fn outside_if_and_while_expr() {
    |                                - help: try adding a return type: `-> &bool`
@@ -1422,14 +1562,14 @@ LL |     &let 0 = 0
    |     ^^^^^^^^^^ expected `()`, found `&bool`
 
 error[E0277]: the `?` operator can only be applied to values that implement `Try`
-  --> $DIR/disallowed-positions.rs:237:17
+  --> $DIR/disallowed-positions.rs:249:17
    |
 LL |         let 0 = 0?;
    |                 ^^ the `?` operator cannot be applied to type `{integer}`
    |
    = help: the trait `Try` is not implemented for `{integer}`
 
-error: aborting due to 134 previous errors
+error: aborting due to 156 previous errors
 
 Some errors have detailed explanations: E0277, E0308, E0600, E0614.
 For more information about an error, try `rustc --explain E0277`.
diff --git a/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.rs b/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.rs
index e66caa19ec9..12befc637c7 100644
--- a/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.rs
+++ b/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.rs
@@ -17,6 +17,7 @@ fn main() {
     //~| ERROR `let` expressions are not supported here
     //~| ERROR mismatched types
     //~| ERROR mismatched types
+    //~| ERROR expected expression, found `let` statement
         return;
     };
 
diff --git a/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr b/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr
index eea8ed0c963..498a112fa9b 100644
--- a/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr
+++ b/src/test/ui/rfc-2497-if-let-chains/ensure-that-let-else-does-not-interact-with-let-chains.stderr
@@ -9,6 +9,12 @@ help: wrap the expression in parentheses
 LL |     let Some(n) = (opt && n == 1) else {
    |                   +             +
 
+error: expected expression, found `let` statement
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:26
+   |
+LL |     let Some(n) = opt && let another = n else {
+   |                          ^^^
+
 error: a `&&` expression cannot be directly assigned in `let...else`
   --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:15:19
    |
@@ -21,43 +27,43 @@ LL |     let Some(n) = (opt && let another = n) else {
    |                   +                      +
 
 error: this `if` expression is missing a block after the condition
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:23:5
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:24:5
    |
 LL |     if let Some(n) = opt else {
    |     ^^
    |
 help: add a block here
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:23:25
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:24:25
    |
 LL |     if let Some(n) = opt else {
    |                         ^
 
 error: this `if` expression is missing a block after the condition
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:27:5
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:28:5
    |
 LL |     if let Some(n) = opt && n == 1 else {
    |     ^^
    |
 help: add a block here
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:27:35
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:28:35
    |
 LL |     if let Some(n) = opt && n == 1 else {
    |                                   ^
 
 error: this `if` expression is missing a block after the condition
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:31:5
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:32:5
    |
 LL |     if let Some(n) = opt && let another = n else {
    |     ^^
    |
 help: add a block here
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:31:44
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:32:44
    |
 LL |     if let Some(n) = opt && let another = n else {
    |                                            ^
 
 error: expected `{`, found keyword `else`
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:37:33
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:38:33
    |
 LL |         while let Some(n) = opt else {
    |         ----- ----------------- ^^^^ expected `{`
@@ -66,7 +72,7 @@ LL |         while let Some(n) = opt else {
    |         while parsing the body of this `while` expression
 
 error: expected `{`, found keyword `else`
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:43:43
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:44:43
    |
 LL |         while let Some(n) = opt && n == 1 else {
    |         ----- --------------------------- ^^^^ expected `{`
@@ -75,7 +81,7 @@ LL |         while let Some(n) = opt && n == 1 else {
    |         while parsing the body of this `while` expression
 
 error: expected `{`, found keyword `else`
-  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:49:52
+  --> $DIR/ensure-that-let-else-does-not-interact-with-let-chains.rs:50:52
    |
 LL |         while let Some(n) = opt && let another = n else {
    |         ----- ------------------------------------ ^^^^ expected `{`
@@ -131,6 +137,6 @@ LL |     let Some(n) = opt && let another = n else {
    = note: expected type `bool`
               found enum `Option<_>`
 
-error: aborting due to 13 previous errors
+error: aborting due to 14 previous errors
 
 For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs b/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs
index ac60bc7e57f..87718211308 100644
--- a/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs
+++ b/src/test/ui/rfc-2497-if-let-chains/feature-gate.rs
@@ -39,6 +39,7 @@ fn _macros() {
 
     noop_expr!((let 0 = 1));
     //~^ ERROR `let` expressions in this position are unstable [E0658]
+    //~| ERROR expected expression, found `let` statement
 
     macro_rules! use_expr {
         ($e:expr) => {
@@ -48,9 +49,9 @@ fn _macros() {
     }
     #[cfg(FALSE)] (let 0 = 1);
     //~^ ERROR `let` expressions in this position are unstable [E0658]
+    //~| ERROR expected expression, found `let` statement
     use_expr!(let 0 = 1);
     //~^ ERROR no rules expected the token `let`
-    // ^--- FIXME(53667): Consider whether `Let` can be added to `ident_can_begin_expr`.
 }
 
 fn main() {}
diff --git a/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr b/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr
index 1eabee47c64..bcea8bbaa73 100644
--- a/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr
+++ b/src/test/ui/rfc-2497-if-let-chains/feature-gate.stderr
@@ -1,5 +1,17 @@
+error: expected expression, found `let` statement
+  --> $DIR/feature-gate.rs:50:20
+   |
+LL |     #[cfg(FALSE)] (let 0 = 1);
+   |                    ^^^
+
+error: expected expression, found `let` statement
+  --> $DIR/feature-gate.rs:40:17
+   |
+LL |     noop_expr!((let 0 = 1));
+   |                 ^^^
+
 error: no rules expected the token `let`
-  --> $DIR/feature-gate.rs:51:15
+  --> $DIR/feature-gate.rs:53:15
    |
 LL |     macro_rules! use_expr {
    |     --------------------- when calling this macro
@@ -62,7 +74,7 @@ LL |     while let Range { start: _, end: _ } = (true..true) && false {}
    = help: add `#![feature(let_chains)]` to the crate attributes to enable
 
 error[E0658]: `let` expressions in this position are unstable
-  --> $DIR/feature-gate.rs:49:20
+  --> $DIR/feature-gate.rs:50:20
    |
 LL |     #[cfg(FALSE)] (let 0 = 1);
    |                    ^^^^^^^^^
@@ -79,6 +91,6 @@ LL |     noop_expr!((let 0 = 1));
    = note: see issue #53667 <https://github.com/rust-lang/rust/issues/53667> for more information
    = help: add `#![feature(let_chains)]` to the crate attributes to enable
 
-error: aborting due to 9 previous errors
+error: aborting due to 11 previous errors
 
 For more information about this error, try `rustc --explain E0658`.
diff --git a/src/test/ui/rfc-2497-if-let-chains/invalid-let-in-a-valid-let-context.rs b/src/test/ui/rfc-2497-if-let-chains/invalid-let-in-a-valid-let-context.rs
new file mode 100644
index 00000000000..6cc53a1935b
--- /dev/null
+++ b/src/test/ui/rfc-2497-if-let-chains/invalid-let-in-a-valid-let-context.rs
@@ -0,0 +1,17 @@
+// check-pass
+// known-bug
+
+#![feature(let_chains)]
+
+fn main() {
+    let _opt = Some(1i32);
+
+    #[cfg(FALSE)]
+    {
+        if let Some(elem) = _opt && {
+            [1, 2, 3][let _ = ()];
+            true
+        } {
+        }
+    }
+}
diff --git a/src/test/ui/runtime/backtrace-debuginfo.rs b/src/test/ui/runtime/backtrace-debuginfo.rs
index b976c3a13bd..7c9f1a7f2f4 100644
--- a/src/test/ui/runtime/backtrace-debuginfo.rs
+++ b/src/test/ui/runtime/backtrace-debuginfo.rs
@@ -8,6 +8,7 @@
 
 // compile-flags:-g -Copt-level=0 -Cllvm-args=-enable-tail-merge=0
 // compile-flags:-Cforce-frame-pointers=yes
+// compile-flags:-Cstrip=none
 // ignore-pretty issue #37195
 // ignore-emscripten spawning processes is not supported
 // ignore-sgx no processes
diff --git a/src/test/ui/rust-2018/uniform-paths/issue-87932.stderr b/src/test/ui/rust-2018/uniform-paths/issue-87932.stderr
index 53272abccbb..edbea330a04 100644
--- a/src/test/ui/rust-2018/uniform-paths/issue-87932.stderr
+++ b/src/test/ui/rust-2018/uniform-paths/issue-87932.stderr
@@ -2,7 +2,7 @@ error[E0599]: no function or associated item named `deserialize` found for struc
   --> $DIR/issue-87932.rs:13:8
    |
 LL | pub struct A {}
-   | ------------ function or associated item `deserialize` not found for this
+   |            - function or associated item `deserialize` not found for this struct
 ...
 LL |     A::deserialize();
    |        ^^^^^^^^^^^ function or associated item not found in `A`
diff --git a/src/test/ui/self/point-at-arbitrary-self-type-method.stderr b/src/test/ui/self/point-at-arbitrary-self-type-method.stderr
index a0ef7e3f2cb..06ccc5b1afe 100644
--- a/src/test/ui/self/point-at-arbitrary-self-type-method.stderr
+++ b/src/test/ui/self/point-at-arbitrary-self-type-method.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `foo` found for struct `A` in the current scope
   --> $DIR/point-at-arbitrary-self-type-method.rs:8:7
    |
 LL | struct A;
-   | --------- method `foo` not found for this
+   |        - method `foo` not found for this struct
 ...
 LL |     fn foo(self: Box<Self>) {}
    |        --- the method is available for `Box<A>` here
diff --git a/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr b/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr
index 44067648283..bd77f67fb4e 100644
--- a/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr
+++ b/src/test/ui/self/point-at-arbitrary-self-type-trait-method.stderr
@@ -6,7 +6,7 @@ LL | trait B { fn foo(self: Box<Self>); }
    |              |
    |              the method is available for `Box<A>` here
 LL | struct A;
-   | --------- method `foo` not found for this
+   |        - method `foo` not found for this struct
 ...
 LL |     A.foo()
    |       ^^^ method not found in `A`
diff --git a/src/test/ui/span/issue-7575.stderr b/src/test/ui/span/issue-7575.stderr
index 783f5aca417..912618555f4 100644
--- a/src/test/ui/span/issue-7575.stderr
+++ b/src/test/ui/span/issue-7575.stderr
@@ -42,7 +42,7 @@ error[E0599]: no method named `fff` found for struct `Myisize` in the current sc
   --> $DIR/issue-7575.rs:62:30
    |
 LL | struct Myisize(isize);
-   | ---------------------- method `fff` not found for this
+   |        ------- method `fff` not found for this struct
 ...
 LL |     u.f8(42) + u.f9(342) + m.fff(42)
    |                            --^^^
@@ -60,6 +60,8 @@ LL |     fn fff(i: isize) -> isize {
 error[E0599]: no method named `is_str` found for type parameter `T` in the current scope
   --> $DIR/issue-7575.rs:70:7
    |
+LL | fn param_bound<T: ManyImplTrait>(t: T) -> bool {
+   |                - method `is_str` not found for this type parameter
 LL |     t.is_str()
    |       ^^^^^^ this is an associated function, not a method
    |
diff --git a/src/test/ui/span/macro-span-replacement.rs b/src/test/ui/span/macro-span-replacement.rs
index 25df4a2aa38..66973c58d35 100644
--- a/src/test/ui/span/macro-span-replacement.rs
+++ b/src/test/ui/span/macro-span-replacement.rs
@@ -4,7 +4,7 @@
 
 macro_rules! m {
     ($a:tt $b:tt) => {
-        $b $a; //~ WARN struct is never constructed
+        $b $a; //~ WARN struct `S` is never constructed
     }
 }
 
diff --git a/src/test/ui/span/macro-span-replacement.stderr b/src/test/ui/span/macro-span-replacement.stderr
index d08b24e9562..433d02dcbe7 100644
--- a/src/test/ui/span/macro-span-replacement.stderr
+++ b/src/test/ui/span/macro-span-replacement.stderr
@@ -1,4 +1,4 @@
-warning: struct is never constructed: `S`
+warning: struct `S` is never constructed
   --> $DIR/macro-span-replacement.rs:7:14
    |
 LL |         $b $a;
diff --git a/src/test/ui/span/move-closure.stderr b/src/test/ui/span/move-closure.stderr
index ded581dc496..3e7041f02b3 100644
--- a/src/test/ui/span/move-closure.stderr
+++ b/src/test/ui/span/move-closure.stderr
@@ -8,6 +8,10 @@ LL |     let x: () = move || ();
    |
    = note: expected unit type `()`
                 found closure `[closure@$DIR/move-closure.rs:5:17: 5:27]`
+help: use parentheses to call this closure
+   |
+LL |     let x: () = (move || ())();
+   |                 +          +++
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/span/unused-warning-point-at-identifier.rs b/src/test/ui/span/unused-warning-point-at-identifier.rs
index d4d5bc1cbc8..af4834503cd 100644
--- a/src/test/ui/span/unused-warning-point-at-identifier.rs
+++ b/src/test/ui/span/unused-warning-point-at-identifier.rs
@@ -2,26 +2,26 @@
 
 #![warn(unused)]
 
-enum Enum { //~ WARN enum is never used
+enum Enum { //~ WARN enum `Enum` is never used
     A,
     B,
     C,
     D,
 }
 
-struct Struct { //~ WARN struct is never constructed
+struct Struct { //~ WARN struct `Struct` is never constructed
     a: usize,
     b: usize,
     c: usize,
     d: usize,
 }
 
-fn func() -> usize { //~ WARN function is never used
+fn func() -> usize { //~ WARN function `func` is never used
     3
 }
 
 fn
-func_complete_span() //~ WARN function is never used
+func_complete_span() //~ WARN function `func_complete_span` is never used
 -> usize
 {
     3
diff --git a/src/test/ui/span/unused-warning-point-at-identifier.stderr b/src/test/ui/span/unused-warning-point-at-identifier.stderr
index 6ef877da122..c2cb5623194 100644
--- a/src/test/ui/span/unused-warning-point-at-identifier.stderr
+++ b/src/test/ui/span/unused-warning-point-at-identifier.stderr
@@ -1,4 +1,4 @@
-warning: enum is never used: `Enum`
+warning: enum `Enum` is never used
   --> $DIR/unused-warning-point-at-identifier.rs:5:6
    |
 LL | enum Enum {
@@ -11,19 +11,19 @@ LL | #![warn(unused)]
    |         ^^^^^^
    = note: `#[warn(dead_code)]` implied by `#[warn(unused)]`
 
-warning: struct is never constructed: `Struct`
+warning: struct `Struct` is never constructed
   --> $DIR/unused-warning-point-at-identifier.rs:12:8
    |
 LL | struct Struct {
    |        ^^^^^^
 
-warning: function is never used: `func`
+warning: function `func` is never used
   --> $DIR/unused-warning-point-at-identifier.rs:19:4
    |
 LL | fn func() -> usize {
    |    ^^^^
 
-warning: function is never used: `func_complete_span`
+warning: function `func_complete_span` is never used
   --> $DIR/unused-warning-point-at-identifier.rs:24:1
    |
 LL | func_complete_span()
diff --git a/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr b/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr
index 9894ecc64b5..d2350bc7e4f 100644
--- a/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr
+++ b/src/test/ui/specialization/defaultimpl/specialization-trait-not-implemented.stderr
@@ -13,8 +13,8 @@ error[E0599]: the method `foo_one` exists for struct `MyStruct`, but its trait b
    |
 LL | struct MyStruct;
    | ----------------
-   | |
-   | method `foo_one` not found for this
+   | |      |
+   | |      method `foo_one` not found for this struct
    | doesn't satisfy `MyStruct: Foo`
 ...
 LL |     println!("{}", MyStruct.foo_one());
diff --git a/src/test/ui/std-backtrace.rs b/src/test/ui/std-backtrace.rs
index b5e76666af1..07de066b558 100644
--- a/src/test/ui/std-backtrace.rs
+++ b/src/test/ui/std-backtrace.rs
@@ -5,6 +5,7 @@
 // ignore-sgx no processes
 // ignore-msvc see #62897 and `backtrace-debuginfo.rs` test
 // compile-flags:-g
+// compile-flags:-Cstrip=none
 
 #![feature(backtrace)]
 
diff --git a/src/test/ui/structs/struct-path-associated-type.stderr b/src/test/ui/structs/struct-path-associated-type.stderr
index 7424ceecbe3..bdce0e1b331 100644
--- a/src/test/ui/structs/struct-path-associated-type.stderr
+++ b/src/test/ui/structs/struct-path-associated-type.stderr
@@ -10,7 +10,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     let z = T::A::<u8> {};
    |                -   ^^ type argument not allowed
    |                |
-   |                not allowed on this
+   |                not allowed on this type
 
 error[E0071]: expected struct, variant or union type, found associated type
   --> $DIR/struct-path-associated-type.rs:14:13
@@ -30,7 +30,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     let z = T::A::<u8> {};
    |                -   ^^ type argument not allowed
    |                |
-   |                not allowed on this
+   |                not allowed on this type
 
 error[E0223]: ambiguous associated type
   --> $DIR/struct-path-associated-type.rs:32:13
diff --git a/src/test/ui/structs/struct-path-self.stderr b/src/test/ui/structs/struct-path-self.stderr
index 4bd0fb38985..c2a8623f9b4 100644
--- a/src/test/ui/structs/struct-path-self.stderr
+++ b/src/test/ui/structs/struct-path-self.stderr
@@ -10,7 +10,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         let z = Self::<u8> {};
    |                 ----   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on self type
    |
 help: the `Self` type doesn't accept type parameters
    |
@@ -36,7 +36,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         let z = Self::<u8> {};
    |                 ----   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on self type
    |
 note: `Self` is of type `S`
   --> $DIR/struct-path-self.rs:1:8
@@ -58,7 +58,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         let z = Self::<u8> {};
    |                 ----   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on self type
    |
 note: `Self` is of type `S`
   --> $DIR/struct-path-self.rs:1:8
diff --git a/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr b/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr
index aacbe1d9efb..3d367eca707 100644
--- a/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr
+++ b/src/test/ui/suggestions/args-instead-of-tuple-errors.stderr
@@ -15,8 +15,8 @@ LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
    |     ^^^^
 help: remove the extra argument
    |
-LL |     let _: Option<(i32, bool)> = Some({(i32, bool)});
-   |                                  ~~~~~~~~~~~~~~~~~~~
+LL |     let _: Option<(i32, bool)> = Some(/* (i32, bool) */);
+   |                                  ~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this function takes 1 argument but 2 arguments were supplied
   --> $DIR/args-instead-of-tuple-errors.rs:8:5
@@ -35,8 +35,8 @@ LL | fn int_bool(_: (i32, bool)) {
    |    ^^^^^^^^ --------------
 help: remove the extra argument
    |
-LL |     int_bool({(i32, bool)});
-   |     ~~~~~~~~~~~~~~~~~~~~~~~
+LL |     int_bool(/* (i32, bool) */);
+   |     ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this enum variant takes 1 argument but 0 arguments were supplied
   --> $DIR/args-instead-of-tuple-errors.rs:11:28
@@ -51,8 +51,8 @@ LL |     Some(#[stable(feature = "rust1", since = "1.0.0")] T),
    |     ^^^^
 help: provide the argument
    |
-LL |     let _: Option<(i8,)> = Some({(i8,)});
-   |                            ~~~~~~~~~~~~~
+LL |     let _: Option<(i8,)> = Some(/* (i8,) */);
+   |                            ~~~~~~~~~~~~~~~~~
 
 error[E0308]: mismatched types
   --> $DIR/args-instead-of-tuple-errors.rs:14:34
diff --git a/src/test/ui/suggestions/derive-trait-for-method-call.stderr b/src/test/ui/suggestions/derive-trait-for-method-call.stderr
index 2af3ba1d5bb..65167ce4a29 100644
--- a/src/test/ui/suggestions/derive-trait-for-method-call.stderr
+++ b/src/test/ui/suggestions/derive-trait-for-method-call.stderr
@@ -11,7 +11,7 @@ LL | enum CloneEnum {
    | -------------- doesn't satisfy `CloneEnum: Default`
 ...
 LL | struct Foo<X, Y> (X, Y);
-   | ------------------------ method `test` not found for this
+   |        --- method `test` not found for this struct
 ...
 LL |     let y = x.test();
    |               ^^^^ method cannot be called on `Foo<Enum, CloneEnum>` due to unsatisfied trait bounds
@@ -49,7 +49,7 @@ LL | struct CloneStruct {
    | ------------------ doesn't satisfy `CloneStruct: Default`
 ...
 LL | struct Foo<X, Y> (X, Y);
-   | ------------------------ method `test` not found for this
+   |        --- method `test` not found for this struct
 ...
 LL |     let y = x.test();
    |               ^^^^ method cannot be called on `Foo<Struct, CloneStruct>` due to unsatisfied trait bounds
@@ -71,7 +71,7 @@ error[E0599]: the method `test` exists for struct `Foo<Vec<Enum>, Instant>`, but
   --> $DIR/derive-trait-for-method-call.rs:40:15
    |
 LL | struct Foo<X, Y> (X, Y);
-   | ------------------------ method `test` not found for this
+   |        --- method `test` not found for this struct
 ...
 LL |     let y = x.test();
    |               ^^^^ method cannot be called on `Foo<Vec<Enum>, Instant>` due to unsatisfied trait bounds
diff --git a/src/test/ui/suggestions/dont-suggest-pin-array-dot-set.rs b/src/test/ui/suggestions/dont-suggest-pin-array-dot-set.rs
new file mode 100644
index 00000000000..acb897571d6
--- /dev/null
+++ b/src/test/ui/suggestions/dont-suggest-pin-array-dot-set.rs
@@ -0,0 +1,15 @@
+// https://github.com/rust-lang/rust/issues/96834
+//
+// This test case verifies that rustc does not make an unhelpful suggestion:
+//
+//     help: consider wrapping the receiver expression with the appropriate type
+//         |
+//     14  |     Pin::new(&mut a).set(0, 3);
+//         |     +++++++++++++  +
+//
+// We can tell that it isn't helpful, because `Pin::set` takes two parameters (including
+// the receiver), but the function call on line 14 supplies three.
+fn main() {
+    let mut a = [0u8; 1];
+    a.set(0, 3); //~ERROR
+}
diff --git a/src/test/ui/suggestions/dont-suggest-pin-array-dot-set.stderr b/src/test/ui/suggestions/dont-suggest-pin-array-dot-set.stderr
new file mode 100644
index 00000000000..677aa031bf7
--- /dev/null
+++ b/src/test/ui/suggestions/dont-suggest-pin-array-dot-set.stderr
@@ -0,0 +1,9 @@
+error[E0599]: no method named `set` found for array `[u8; 1]` in the current scope
+  --> $DIR/dont-suggest-pin-array-dot-set.rs:14:7
+   |
+LL |     a.set(0, 3);
+   |       ^^^ help: there is an associated function with a similar name: `get`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/src/test/ui/suggestions/dont-wrap-ambiguous-receivers.stderr b/src/test/ui/suggestions/dont-wrap-ambiguous-receivers.stderr
index 8fcadbf4c75..d5af89e3547 100644
--- a/src/test/ui/suggestions/dont-wrap-ambiguous-receivers.stderr
+++ b/src/test/ui/suggestions/dont-wrap-ambiguous-receivers.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `pick` found for struct `Chaenomeles` in the curre
   --> $DIR/dont-wrap-ambiguous-receivers.rs:18:25
    |
 LL |     pub struct Chaenomeles;
-   |     ----------------------- method `pick` not found for this
+   |                ----------- method `pick` not found for this struct
 ...
 LL |     banana::Chaenomeles.pick()
    |                         ^^^^ method not found in `Chaenomeles`
diff --git a/src/test/ui/suggestions/field-has-method.stderr b/src/test/ui/suggestions/field-has-method.stderr
index 3a57436f200..34b6230e19b 100644
--- a/src/test/ui/suggestions/field-has-method.stderr
+++ b/src/test/ui/suggestions/field-has-method.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `kind` found for struct `InferOk` in the current s
   --> $DIR/field-has-method.rs:19:15
    |
 LL | struct InferOk<T> {
-   | ----------------- method `kind` not found for this
+   |        ------- method `kind` not found for this struct
 ...
 LL |     let k = i.kind();
    |               ^^^^ method not found in `InferOk<Ty>`
diff --git a/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr b/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr
index 1ed784e8f5b..25ce458f6d8 100644
--- a/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr
+++ b/src/test/ui/suggestions/fn-or-tuple-struct-without-args.stderr
@@ -33,7 +33,7 @@ LL |     let _: usize = foo;
            found fn item `fn(usize, usize) -> usize {foo}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = foo(a, b);
+LL |     let _: usize = foo(_, _);
    |                       ++++++
 
 error[E0308]: mismatched types
@@ -105,7 +105,7 @@ LL |     let _: usize = T::baz;
            found fn item `fn(usize, usize) -> usize {<_ as T>::baz}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = T::baz(x, y);
+LL |     let _: usize = T::baz(_, _);
    |                          ++++++
 
 error[E0308]: mismatched types
@@ -123,7 +123,7 @@ LL |     let _: usize = T::bat;
            found fn item `fn(usize) -> usize {<_ as T>::bat}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = T::bat(x);
+LL |     let _: usize = T::bat(_);
    |                          +++
 
 error[E0308]: mismatched types
@@ -159,7 +159,7 @@ LL |     let _: usize = X::baz;
            found fn item `fn(usize, usize) -> usize {<X as T>::baz}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = X::baz(x, y);
+LL |     let _: usize = X::baz(_, _);
    |                          ++++++
 
 error[E0308]: mismatched types
@@ -177,7 +177,7 @@ LL |     let _: usize = X::bat;
            found fn item `fn(usize) -> usize {<X as T>::bat}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = X::bat(x);
+LL |     let _: usize = X::bat(_);
    |                          +++
 
 error[E0308]: mismatched types
@@ -195,7 +195,7 @@ LL |     let _: usize = X::bax;
            found fn item `fn(usize) -> usize {<X as T>::bax}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = X::bax(x);
+LL |     let _: usize = X::bax(_);
    |                          +++
 
 error[E0308]: mismatched types
@@ -213,7 +213,7 @@ LL |     let _: usize = X::bach;
            found fn item `fn(usize) -> usize {<X as T>::bach}`
 help: use parentheses to call this function
    |
-LL |     let _: usize = X::bach(x);
+LL |     let _: usize = X::bach(_);
    |                           +++
 
 error[E0308]: mismatched types
diff --git a/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr b/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr
index 8ec7b7bf496..20f8e65f769 100644
--- a/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr
+++ b/src/test/ui/suggestions/impl-trait-with-missing-trait-bounds-in-arg.stderr
@@ -1,6 +1,8 @@
 error[E0599]: no method named `hello` found for type parameter `impl Foo` in the current scope
   --> $DIR/impl-trait-with-missing-trait-bounds-in-arg.rs:15:9
    |
+LL | fn test(foo: impl Foo) {
+   |              -------- method `hello` not found for this type parameter
 LL |     foo.hello();
    |         ^^^^^ method not found in `impl Foo`
    |
diff --git a/src/test/ui/suggestions/issue-21673.stderr b/src/test/ui/suggestions/issue-21673.stderr
index 0a4aaa61bc7..523d7a7ccd2 100644
--- a/src/test/ui/suggestions/issue-21673.stderr
+++ b/src/test/ui/suggestions/issue-21673.stderr
@@ -13,6 +13,8 @@ LL | fn call_method<T: std::fmt::Debug + Foo>(x: &T) {
 error[E0599]: no method named `method` found for type parameter `T` in the current scope
   --> $DIR/issue-21673.rs:10:7
    |
+LL | fn call_method_2<T>(x: T) {
+   |                  - method `method` not found for this type parameter
 LL |     x.method()
    |       ^^^^^^ method not found in `T`
    |
diff --git a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr
index f1c0cd6b543..3497c31826c 100644
--- a/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr
+++ b/src/test/ui/suggestions/suggest-assoc-fn-call-with-turbofish.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `default_hello` found for struct `GenericAssocMeth
   --> $DIR/suggest-assoc-fn-call-with-turbofish.rs:9:7
    |
 LL | struct GenericAssocMethod<T>(T);
-   | -------------------------------- method `default_hello` not found for this
+   |        ------------------ method `default_hello` not found for this struct
 ...
 LL |     x.default_hello();
    |     --^^^^^^^^^^^^^
diff --git a/src/test/ui/suggestions/suggest-methods.stderr b/src/test/ui/suggestions/suggest-methods.stderr
index 9079e8f2ce7..dd9010e3295 100644
--- a/src/test/ui/suggestions/suggest-methods.stderr
+++ b/src/test/ui/suggestions/suggest-methods.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `bat` found for struct `Foo` in the current scope
   --> $DIR/suggest-methods.rs:18:7
    |
 LL | struct Foo;
-   | ----------- method `bat` not found for this
+   |        --- method `bat` not found for this struct
 ...
 LL |     f.bat(1.0);
    |       ^^^ help: there is an associated function with a similar name: `bar`
diff --git a/src/test/ui/suggestions/suggest-variants.stderr b/src/test/ui/suggestions/suggest-variants.stderr
index 9227baa3e1a..cccf9378d4d 100644
--- a/src/test/ui/suggestions/suggest-variants.stderr
+++ b/src/test/ui/suggestions/suggest-variants.stderr
@@ -29,7 +29,7 @@ error[E0599]: no variant or associated item named `Squareee` found for enum `Sha
   --> $DIR/suggest-variants.rs:15:12
    |
 LL | enum Shape {
-   | ---------- variant or associated item `Squareee` not found here
+   |      ----- variant or associated item `Squareee` not found for this enum
 ...
 LL |     Shape::Squareee;
    |            ^^^^^^^^
@@ -41,7 +41,7 @@ error[E0599]: no variant or associated item named `Circl` found for enum `Shape`
   --> $DIR/suggest-variants.rs:16:12
    |
 LL | enum Shape {
-   | ---------- variant or associated item `Circl` not found here
+   |      ----- variant or associated item `Circl` not found for this enum
 ...
 LL |     Shape::Circl;
    |            ^^^^^
@@ -53,7 +53,7 @@ error[E0599]: no variant or associated item named `Rombus` found for enum `Shape
   --> $DIR/suggest-variants.rs:17:12
    |
 LL | enum Shape {
-   | ---------- variant or associated item `Rombus` not found here
+   |      ----- variant or associated item `Rombus` not found for this enum
 ...
 LL |     Shape::Rombus;
    |            ^^^^^^ variant or associated item not found in `Shape`
diff --git a/src/test/ui/suggestions/use-placement-typeck.stderr b/src/test/ui/suggestions/use-placement-typeck.stderr
index 21f22dade2c..aa9880a60b6 100644
--- a/src/test/ui/suggestions/use-placement-typeck.stderr
+++ b/src/test/ui/suggestions/use-placement-typeck.stderr
@@ -8,7 +8,7 @@ LL |         fn abc(&self) {}
    |            --- the method is available for `S` here
 LL |     }
 LL |     pub struct S;
-   |     ------------- method `abc` not found for this
+   |                - method `abc` not found for this struct
    |
    = help: items from traits can only be used if the trait is in scope
 help: the following trait is implemented but not in scope; perhaps add a `use` for it:
diff --git a/src/test/ui/issues/issue-16597-empty.rs b/src/test/ui/test-attrs/issue-16597-empty.rs
index 2bdd08575c4..2bdd08575c4 100644
--- a/src/test/ui/issues/issue-16597-empty.rs
+++ b/src/test/ui/test-attrs/issue-16597-empty.rs
diff --git a/src/test/ui/issues/issue-16597.rs b/src/test/ui/test-attrs/issue-16597.rs
index 35769bfc117..35769bfc117 100644
--- a/src/test/ui/issues/issue-16597.rs
+++ b/src/test/ui/test-attrs/issue-16597.rs
diff --git a/src/test/ui/test-attrs/test-warns-dead-code.rs b/src/test/ui/test-attrs/test-warns-dead-code.rs
index 936461f162d..4190885b6b2 100644
--- a/src/test/ui/test-attrs/test-warns-dead-code.rs
+++ b/src/test/ui/test-attrs/test-warns-dead-code.rs
@@ -2,6 +2,6 @@
 
 #![deny(dead_code)]
 
-fn dead() {} //~ error: function is never used: `dead`
+fn dead() {} //~ error: function `dead` is never used
 
 fn main() {}
diff --git a/src/test/ui/test-attrs/test-warns-dead-code.stderr b/src/test/ui/test-attrs/test-warns-dead-code.stderr
index d3bcea29513..6c0f2884128 100644
--- a/src/test/ui/test-attrs/test-warns-dead-code.stderr
+++ b/src/test/ui/test-attrs/test-warns-dead-code.stderr
@@ -1,4 +1,4 @@
-error: function is never used: `dead`
+error: function `dead` is never used
   --> $DIR/test-warns-dead-code.rs:5:4
    |
 LL | fn dead() {}
diff --git a/src/test/ui/trait-bounds/issue-93008.rs b/src/test/ui/trait-bounds/issue-93008.rs
index 1b010566cbc..f4d21a160b6 100644
--- a/src/test/ui/trait-bounds/issue-93008.rs
+++ b/src/test/ui/trait-bounds/issue-93008.rs
@@ -1,10 +1,15 @@
-// compile-flags: -Zmir-opt-level=4
+// build-pass
+// compile-flags: -Zmir-opt-level=3 --crate-type=lib
 
-pub fn bar<T>(s: &'static mut ())
+#![feature(trivial_bounds)]
+#![allow(trivial_bounds)]
+
+trait Foo {
+    fn test(self);
+}
+fn baz<T>()
 where
-    &'static mut (): Clone, //~ ERROR the trait bound
+    &'static str: Foo,
 {
-    <&'static mut () as Clone>::clone(&s);
+    "Foo".test()
 }
-
-fn main() {}
diff --git a/src/test/ui/trait-bounds/issue-93008.stderr b/src/test/ui/trait-bounds/issue-93008.stderr
deleted file mode 100644
index 10f80f8de0c..00000000000
--- a/src/test/ui/trait-bounds/issue-93008.stderr
+++ /dev/null
@@ -1,12 +0,0 @@
-error[E0277]: the trait bound `&'static mut (): Clone` is not satisfied
-  --> $DIR/issue-93008.rs:5:5
-   |
-LL |     &'static mut (): Clone,
-   |     ^^^^^^^^^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `&'static mut ()`
-   |
-   = help: see issue #48214
-   = help: add `#![feature(trivial_bounds)]` to the crate attributes to enable
-
-error: aborting due to previous error
-
-For more information about this error, try `rustc --explain E0277`.
diff --git a/src/test/ui/trait-bounds/issue-94680.rs b/src/test/ui/trait-bounds/issue-94680.rs
new file mode 100644
index 00000000000..58e892079e6
--- /dev/null
+++ b/src/test/ui/trait-bounds/issue-94680.rs
@@ -0,0 +1,14 @@
+// check-pass
+
+fn main() {
+    println!("{:?}", {
+        type T = ();
+
+        pub fn cloneit(it: &'_ mut T) -> (&'_ mut T, &'_ mut T)
+        where
+            for<'any> &'any mut T: Clone,
+        {
+            (it.clone(), it)
+        }
+    });
+}
diff --git a/src/test/ui/trait-bounds/issue-94999.rs b/src/test/ui/trait-bounds/issue-94999.rs
new file mode 100644
index 00000000000..e131902346f
--- /dev/null
+++ b/src/test/ui/trait-bounds/issue-94999.rs
@@ -0,0 +1,34 @@
+// check-pass
+
+trait Identity<Q> {
+    type T;
+}
+
+impl<Q, T> Identity<Q> for T {
+    type T = T;
+}
+
+trait Holds {
+    type Q;
+}
+
+struct S;
+struct X(S);
+
+struct XHelper;
+
+impl Holds for X {
+    type Q = XHelper;
+}
+
+impl<Q> Clone for X
+where
+    <S as Identity<Q>>::T: Clone,
+    X: Holds<Q = Q>,
+{
+    fn clone(&self) -> Self {
+        Self(self.0.clone())
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/trait-bounds/issue-95640.rs b/src/test/ui/trait-bounds/issue-95640.rs
new file mode 100644
index 00000000000..e4e998b5d0b
--- /dev/null
+++ b/src/test/ui/trait-bounds/issue-95640.rs
@@ -0,0 +1,31 @@
+// build-pass
+// compile-flags:-Zmir-opt-level=3
+
+struct D;
+
+trait Tr {
+    type It;
+    fn foo(self) -> Option<Self::It>;
+}
+
+impl<'a> Tr for &'a D {
+    type It = ();
+    fn foo(self) -> Option<()> {
+        None
+    }
+}
+
+fn run<F>(f: F)
+where
+    for<'a> &'a D: Tr,
+    F: Fn(<&D as Tr>::It),
+{
+    let d = &D;
+    while let Some(i) = d.foo() {
+        f(i);
+    }
+}
+
+fn main() {
+    run(|_| {});
+}
diff --git a/src/test/ui/trait-bounds/select-param-env-instead-of-blanket.rs b/src/test/ui/trait-bounds/select-param-env-instead-of-blanket.rs
new file mode 100644
index 00000000000..288b2098b4c
--- /dev/null
+++ b/src/test/ui/trait-bounds/select-param-env-instead-of-blanket.rs
@@ -0,0 +1,43 @@
+// known-bug
+// build-fail
+// failure-status: 101
+// compile-flags:--crate-type=lib -Zmir-opt-level=3
+// rustc-env:RUST_BACKTRACE=0
+
+// normalize-stderr-test "thread 'rustc' panicked.*" -> "thread 'rustc' panicked"
+// normalize-stderr-test "note:.*RUST_BACKTRACE=1.*\n" -> ""
+// normalize-stderr-test "error: internal compiler error.*" -> "error: internal compiler error"
+// normalize-stderr-test "encountered.*with incompatible types:" "encountered ... with incompatible types:"
+// normalize-stderr-test "note:.*unexpectedly panicked.*\n\n" -> ""
+// normalize-stderr-test "note: we would appreciate a bug report.*\n\n" -> ""
+// normalize-stderr-test "note: compiler flags.*\n\n" -> ""
+// normalize-stderr-test "note: rustc.*running on.*\n\n" -> ""
+// normalize-stderr-test "query stack during panic:\n" -> ""
+// normalize-stderr-test "we're just showing a limited slice of the query stack\n" -> ""
+// normalize-stderr-test "end of query stack\n" -> ""
+// normalize-stderr-test "#.*\n" -> ""
+
+// This is a known bug that @compiler-errors tried to fix in #94238,
+// but the solution was probably not correct.
+
+pub trait Factory<T> {
+    type Item;
+}
+
+pub struct IntFactory;
+
+impl<T> Factory<T> for IntFactory {
+    type Item = usize;
+}
+
+pub fn foo<T>()
+where
+    IntFactory: Factory<T>,
+{
+    let mut x: <IntFactory as Factory<T>>::Item = bar::<T>();
+}
+
+#[inline]
+pub fn bar<T>() -> <IntFactory as Factory<T>>::Item {
+    0usize
+}
diff --git a/src/test/ui/trait-bounds/select-param-env-instead-of-blanket.stderr b/src/test/ui/trait-bounds/select-param-env-instead-of-blanket.stderr
new file mode 100644
index 00000000000..56cc5c93c96
--- /dev/null
+++ b/src/test/ui/trait-bounds/select-param-env-instead-of-blanket.stderr
@@ -0,0 +1,18 @@
+error: internal compiler error
+
+error: internal compiler error
+                                encountered ... with incompatible types:
+                                left-hand side has type: <IntFactory as Factory<T>>::Item
+                                right-hand side has type: usize
+  --> $DIR/select-param-env-instead-of-blanket.rs:42:5
+   |
+LL |     let mut x: <IntFactory as Factory<T>>::Item = bar::<T>();
+   |                                                   ---------- in this inlined function call
+...
+LL |     0usize
+   |     ^^^^^^
+   |
+   = note: delayed at compiler/rustc_const_eval/src/transform/validate.rs:128:36
+
+thread 'rustc' panicked
+
diff --git a/src/test/ui/traits/alias/issue-83613.stderr b/src/test/ui/traits/alias/issue-83613.stderr
index bbc240b6aec..b9d93160192 100644
--- a/src/test/ui/traits/alias/issue-83613.stderr
+++ b/src/test/ui/traits/alias/issue-83613.stderr
@@ -1,3 +1,11 @@
+error[E0119]: conflicting implementations of trait `AnotherTrait` for type `OpaqueType`
+  --> $DIR/issue-83613.rs:10:1
+   |
+LL | impl<T: Send> AnotherTrait for T {}
+   | -------------------------------- first implementation here
+LL | impl AnotherTrait for OpaqueType {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `OpaqueType`
+
 error: cannot implement trait on type alias impl trait
   --> $DIR/issue-83613.rs:10:23
    |
@@ -10,14 +18,6 @@ note: type alias impl trait defined here
 LL | type OpaqueType = impl OpaqueTrait;
    |                   ^^^^^^^^^^^^^^^^
 
-error[E0119]: conflicting implementations of trait `AnotherTrait` for type `OpaqueType`
-  --> $DIR/issue-83613.rs:10:1
-   |
-LL | impl<T: Send> AnotherTrait for T {}
-   | -------------------------------- first implementation here
-LL | impl AnotherTrait for OpaqueType {}
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `OpaqueType`
-
 error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0119`.
diff --git a/src/test/ui/issues/issue-38033.rs b/src/test/ui/traits/issue-38033.rs
index 16b867ec88f..16b867ec88f 100644
--- a/src/test/ui/issues/issue-38033.rs
+++ b/src/test/ui/traits/issue-38033.rs
diff --git a/src/test/ui/traits/issue-3973.stderr b/src/test/ui/traits/issue-3973.stderr
index 63282e8d86d..188125d248d 100644
--- a/src/test/ui/traits/issue-3973.stderr
+++ b/src/test/ui/traits/issue-3973.stderr
@@ -11,7 +11,7 @@ error[E0599]: no function or associated item named `new` found for struct `Point
   --> $DIR/issue-3973.rs:22:20
    |
 LL | struct Point {
-   | ------------ function or associated item `new` not found for this
+   |        ----- function or associated item `new` not found for this struct
 ...
 LL |     let p = Point::new(0.0, 0.0);
    |                    ^^^ function or associated item not found in `Point`
diff --git a/src/test/ui/traits/issue-65284-suggest-generic-trait-bound.stderr b/src/test/ui/traits/issue-65284-suggest-generic-trait-bound.stderr
index 35d41c62667..ae33e61d83b 100644
--- a/src/test/ui/traits/issue-65284-suggest-generic-trait-bound.stderr
+++ b/src/test/ui/traits/issue-65284-suggest-generic-trait-bound.stderr
@@ -1,6 +1,8 @@
 error[E0599]: no method named `foo` found for type parameter `T` in the current scope
   --> $DIR/issue-65284-suggest-generic-trait-bound.rs:8:7
    |
+LL | fn do_stuff<T : Bar>(t : T) {
+   |             - method `foo` not found for this type parameter
 LL |     t.foo()
    |       ^^^ method not found in `T`
    |
diff --git a/src/test/ui/traits/issue-78372.rs b/src/test/ui/traits/issue-78372.rs
index 77a8c92c81c..92f9f4b467a 100644
--- a/src/test/ui/traits/issue-78372.rs
+++ b/src/test/ui/traits/issue-78372.rs
@@ -4,7 +4,6 @@ impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {} //~ ERROR cannot find type `U`
 //~^ ERROR cannot find type `MISC` in this scope
 //~| ERROR use of unstable library feature 'dispatch_from_dyn'
 //~| ERROR the trait `DispatchFromDyn` may only be implemented for a coercion between structures
-//~| ERROR type parameter `T` must be covered by another type when it appears before the first
 trait Foo: X<u32> {}
 trait X<T> {
     fn foo(self: Smaht<Self, T>);
diff --git a/src/test/ui/traits/issue-78372.stderr b/src/test/ui/traits/issue-78372.stderr
index 49a9f479368..7574c9107d9 100644
--- a/src/test/ui/traits/issue-78372.stderr
+++ b/src/test/ui/traits/issue-78372.stderr
@@ -50,22 +50,13 @@ LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
    |
    = help: add `#![feature(dispatch_from_dyn)]` to the crate attributes to enable
 
-error[E0210]: type parameter `T` must be covered by another type when it appears before the first local type (`Smaht<[type error], [type error]>`)
-  --> $DIR/issue-78372.rs:3:6
-   |
-LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
-   |      ^ type parameter `T` must be covered by another type when it appears before the first local type (`Smaht<[type error], [type error]>`)
-   |
-   = note: implementing a foreign trait is only possible if at least one of the types for which it is implemented is local, and no uncovered type parameters appear before that first local type
-   = note: in this case, 'before' refers to the following order: `impl<..> ForeignTrait<T1, ..., Tn> for T0`, where `T0` is the first and `Tn` is the last
-
 error[E0378]: the trait `DispatchFromDyn` may only be implemented for a coercion between structures
   --> $DIR/issue-78372.rs:3:1
    |
 LL | impl<T> DispatchFromDyn<Smaht<U, MISC>> for T {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 7 previous errors
+error: aborting due to 6 previous errors
 
-Some errors have detailed explanations: E0210, E0378, E0412, E0658.
-For more information about an error, try `rustc --explain E0210`.
+Some errors have detailed explanations: E0378, E0412, E0658.
+For more information about an error, try `rustc --explain E0378`.
diff --git a/src/test/ui/traits/issue-87558.rs b/src/test/ui/traits/issue-87558.rs
new file mode 100644
index 00000000000..c5d86bd637b
--- /dev/null
+++ b/src/test/ui/traits/issue-87558.rs
@@ -0,0 +1,9 @@
+struct ErrorKind;
+struct Error(ErrorKind);
+impl Fn(&isize) for Error {
+    //~^ ERROR manual implementations of `Fn` are experimental
+    //~| ERROR associated type bindings are not allowed here
+    fn from() {} //~ ERROR method `from` is not a member of trait `Fn`
+}
+
+fn main() {}
diff --git a/src/test/ui/traits/issue-87558.stderr b/src/test/ui/traits/issue-87558.stderr
new file mode 100644
index 00000000000..494274d8c30
--- /dev/null
+++ b/src/test/ui/traits/issue-87558.stderr
@@ -0,0 +1,24 @@
+error[E0407]: method `from` is not a member of trait `Fn`
+  --> $DIR/issue-87558.rs:6:5
+   |
+LL |     fn from() {}
+   |     ^^^^^^^^^^^^ not a member of trait `Fn`
+
+error[E0183]: manual implementations of `Fn` are experimental
+  --> $DIR/issue-87558.rs:3:6
+   |
+LL | impl Fn(&isize) for Error {
+   |      ^^^^^^^^^^ manual implementations of `Fn` are experimental
+   |
+   = help: add `#![feature(unboxed_closures)]` to the crate attributes to enable
+
+error[E0229]: associated type bindings are not allowed here
+  --> $DIR/issue-87558.rs:3:6
+   |
+LL | impl Fn(&isize) for Error {
+   |      ^^^^^^^^^^ associated type not allowed here
+
+error: aborting due to 3 previous errors
+
+Some errors have detailed explanations: E0183, E0229, E0407.
+For more information about an error, try `rustc --explain E0183`.
diff --git a/src/test/ui/traits/issue-95898.stderr b/src/test/ui/traits/issue-95898.stderr
index 0a58ad4b663..ca7bacdbf41 100644
--- a/src/test/ui/traits/issue-95898.stderr
+++ b/src/test/ui/traits/issue-95898.stderr
@@ -1,6 +1,8 @@
 error[E0599]: no method named `clone` found for type parameter `T` in the current scope
   --> $DIR/issue-95898.rs:5:7
    |
+LL | fn foo<T:>(t: T) {
+   |        - method `clone` not found for this type parameter
 LL |     t.clone();
    |       ^^^^^ method not found in `T`
    |
diff --git a/src/test/ui/traits/item-privacy.stderr b/src/test/ui/traits/item-privacy.stderr
index ef5d5cdff8f..a7954f7b245 100644
--- a/src/test/ui/traits/item-privacy.stderr
+++ b/src/test/ui/traits/item-privacy.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `a` found for struct `S` in the current scope
   --> $DIR/item-privacy.rs:67:7
    |
 LL | struct S;
-   | --------- method `a` not found for this
+   |        - method `a` not found for this struct
 ...
 LL |     S.a();
    |       ^ method not found in `S`
@@ -18,7 +18,7 @@ error[E0599]: no method named `b` found for struct `S` in the current scope
   --> $DIR/item-privacy.rs:68:7
    |
 LL | struct S;
-   | --------- method `b` not found for this
+   |        - method `b` not found for this struct
 ...
 LL |         fn b(&self) { }
    |            - the method is available for `S` here
@@ -45,7 +45,7 @@ error[E0599]: no function or associated item named `a` found for struct `S` in t
   --> $DIR/item-privacy.rs:78:8
    |
 LL | struct S;
-   | --------- function or associated item `a` not found for this
+   |        - function or associated item `a` not found for this struct
 ...
 LL |     S::a(&S);
    |        ^ function or associated item not found in `S`
@@ -61,7 +61,7 @@ error[E0599]: no function or associated item named `b` found for struct `S` in t
   --> $DIR/item-privacy.rs:80:8
    |
 LL | struct S;
-   | --------- function or associated item `b` not found for this
+   |        - function or associated item `b` not found for this struct
 ...
 LL |     S::b(&S);
    |        ^ function or associated item not found in `S`
@@ -85,7 +85,7 @@ error[E0599]: no associated item named `A` found for struct `S` in the current s
   --> $DIR/item-privacy.rs:97:8
    |
 LL | struct S;
-   | --------- associated item `A` not found for this
+   |        - associated item `A` not found for this struct
 ...
 LL |     S::A;
    |        ^ associated item not found in `S`
@@ -101,7 +101,7 @@ error[E0599]: no associated item named `B` found for struct `S` in the current s
   --> $DIR/item-privacy.rs:98:8
    |
 LL | struct S;
-   | --------- associated item `B` not found for this
+   |        - associated item `B` not found for this struct
 ...
 LL |     S::B;
    |        ^ associated item not found in `S`
diff --git a/src/test/ui/traits/negative-impls/explicitly-unimplemented-error-message.stderr b/src/test/ui/traits/negative-impls/explicitly-unimplemented-error-message.stderr
index c18abf95083..d8f2f8761ff 100644
--- a/src/test/ui/traits/negative-impls/explicitly-unimplemented-error-message.stderr
+++ b/src/test/ui/traits/negative-impls/explicitly-unimplemented-error-message.stderr
@@ -2,7 +2,7 @@ error[E0599]: no method named `clone` found for struct `Qux` in the current scop
   --> $DIR/explicitly-unimplemented-error-message.rs:34:9
    |
 LL | struct Qux;
-   | ----------- method `clone` not found for this
+   |        --- method `clone` not found for this struct
 ...
 LL |     Qux.clone();
    |         ^^^^^ method not found in `Qux`
@@ -23,7 +23,7 @@ error[E0599]: no method named `foo` found for struct `Qux` in the current scope
   --> $DIR/explicitly-unimplemented-error-message.rs:44:9
    |
 LL | struct Qux;
-   | ----------- method `foo` not found for this
+   |        --- method `foo` not found for this struct
 ...
 LL |     Qux.foo();
    |         ^^^ method not found in `Qux`
diff --git a/src/test/ui/tuple/wrong_argument_ice-3.stderr b/src/test/ui/tuple/wrong_argument_ice-3.stderr
index 6ea6e670fd6..667b15776ef 100644
--- a/src/test/ui/tuple/wrong_argument_ice-3.stderr
+++ b/src/test/ui/tuple/wrong_argument_ice-3.stderr
@@ -15,8 +15,8 @@ LL |     pub fn push(&mut self, value: T) {
    |            ^^^^
 help: remove the extra argument
    |
-LL |         groups.push({(Vec<String>, Vec<Process>)});
-   |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |         groups.push(/* (Vec<String>, Vec<Process>) */);
+   |                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs
index e6f45036f85..0031a4665c8 100644
--- a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs
+++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.rs
@@ -52,7 +52,7 @@ fn main() {
     // Tuple struct variant
 
     Enum::<()>::TSVariant::<()>(());
-    //~^ ERROR type arguments are not allowed on this type [E0109]
+    //~^ ERROR type arguments are not allowed on tuple variant `TSVariant` [E0109]
 
     Alias::TSVariant::<()>(());
     //~^ ERROR type arguments are not allowed on this type [E0109]
@@ -70,7 +70,7 @@ fn main() {
     // Struct variant
 
     Enum::<()>::SVariant::<()> { v: () };
-    //~^ ERROR type arguments are not allowed on this type [E0109]
+    //~^ ERROR type arguments are not allowed on variant `SVariant` [E0109]
 
     Alias::SVariant::<()> { v: () };
     //~^ ERROR type arguments are not allowed on this type [E0109]
@@ -88,7 +88,7 @@ fn main() {
     // Unit variant
 
     Enum::<()>::UVariant::<()>;
-    //~^ ERROR type arguments are not allowed on this type [E0109]
+    //~^ ERROR type arguments are not allowed on unit variant `UVariant` [E0109]
 
     Alias::UVariant::<()>;
     //~^ ERROR type arguments are not allowed on this type [E0109]
diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr
index cfc596e1b78..5467f61bee4 100644
--- a/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr
+++ b/src/test/ui/type-alias-enum-variants/enum-variant-generic-args.stderr
@@ -23,7 +23,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |         Self::TSVariant::<()>(());
    |               ---------   ^^ type argument not allowed
    |               |
-   |               not allowed on this
+   |               not allowed on this type
 
 error[E0109]: type arguments are not allowed on self type
   --> $DIR/enum-variant-generic-args.rs:17:16
@@ -31,7 +31,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         Self::<()>::TSVariant(());
    |         ----   ^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self type
    |
 note: `Self` is of type `Enum<T>`
   --> $DIR/enum-variant-generic-args.rs:7:6
@@ -71,7 +71,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         Self::<()>::TSVariant::<()>(());
    |         ----   ^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self type
    |
 note: `Self` is of type `Enum<T>`
   --> $DIR/enum-variant-generic-args.rs:7:6
@@ -92,7 +92,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |         Self::<()>::TSVariant::<()>(());
    |                     ---------   ^^ type argument not allowed
    |                     |
-   |                     not allowed on this
+   |                     not allowed on this type
 
 error[E0308]: mismatched types
   --> $DIR/enum-variant-generic-args.rs:26:29
@@ -112,7 +112,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |         Self::SVariant::<()> { v: () };
    |               --------   ^^ type argument not allowed
    |               |
-   |               not allowed on this
+   |               not allowed on this type
    |
    = note: enum variants can't have type parameters
 help: you might have meant to specity type parameters on enum `Enum`
@@ -139,7 +139,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         Self::<()>::SVariant { v: () };
    |         ----   ^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self type
    |
 note: `Self` is of type `Enum<T>`
   --> $DIR/enum-variant-generic-args.rs:7:6
@@ -172,7 +172,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         Self::<()>::SVariant::<()> { v: () };
    |         ----   ^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self type
    |
 note: `Self` is of type `Enum<T>`
   --> $DIR/enum-variant-generic-args.rs:7:6
@@ -193,7 +193,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |         Self::<()>::SVariant::<()> { v: () };
    |                     --------   ^^ type argument not allowed
    |                     |
-   |                     not allowed on this
+   |                     not allowed on this type
    |
    = note: enum variants can't have type parameters
 help: you might have meant to specity type parameters on enum `Enum`
@@ -220,7 +220,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |         Self::UVariant::<()>;
    |               --------   ^^ type argument not allowed
    |               |
-   |               not allowed on this
+   |               not allowed on this type
 
 error[E0109]: type arguments are not allowed on self type
   --> $DIR/enum-variant-generic-args.rs:43:16
@@ -228,7 +228,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         Self::<()>::UVariant;
    |         ----   ^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self type
    |
 note: `Self` is of type `Enum<T>`
   --> $DIR/enum-variant-generic-args.rs:7:6
@@ -249,7 +249,7 @@ error[E0109]: type arguments are not allowed on self type
 LL |         Self::<()>::UVariant::<()>;
    |         ----   ^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on self type
    |
 note: `Self` is of type `Enum<T>`
   --> $DIR/enum-variant-generic-args.rs:7:6
@@ -270,15 +270,15 @@ error[E0109]: type arguments are not allowed on this type
 LL |         Self::<()>::UVariant::<()>;
    |                     --------   ^^ type argument not allowed
    |                     |
-   |                     not allowed on this
+   |                     not allowed on this type
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on tuple variant `TSVariant`
   --> $DIR/enum-variant-generic-args.rs:54:29
    |
 LL |     Enum::<()>::TSVariant::<()>(());
    |                 ---------   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on tuple variant `TSVariant`
 
 error[E0109]: type arguments are not allowed on this type
   --> $DIR/enum-variant-generic-args.rs:57:24
@@ -286,7 +286,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     Alias::TSVariant::<()>(());
    |            ---------   ^^ type argument not allowed
    |            |
-   |            not allowed on this
+   |            not allowed on this type
 
 error[E0109]: type arguments are not allowed on this type
   --> $DIR/enum-variant-generic-args.rs:59:30
@@ -294,7 +294,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     Alias::<()>::TSVariant::<()>(());
    |                  ---------   ^^ type argument not allowed
    |                  |
-   |                  not allowed on this
+   |                  not allowed on this type
 
 error[E0109]: type arguments are not allowed on this type
   --> $DIR/enum-variant-generic-args.rs:62:29
@@ -302,7 +302,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     AliasFixed::TSVariant::<()>(());
    |                 ---------   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on this type
 
 error[E0107]: this type alias takes 0 generic arguments but 1 generic argument was supplied
   --> $DIR/enum-variant-generic-args.rs:64:5
@@ -338,15 +338,15 @@ error[E0109]: type arguments are not allowed on this type
 LL |     AliasFixed::<()>::TSVariant::<()>(());
    |                       ---------   ^^ type argument not allowed
    |                       |
-   |                       not allowed on this
+   |                       not allowed on this type
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on variant `SVariant`
   --> $DIR/enum-variant-generic-args.rs:72:28
    |
 LL |     Enum::<()>::SVariant::<()> { v: () };
    |                 --------   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on variant `SVariant`
    |
    = note: enum variants can't have type parameters
 
@@ -356,7 +356,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     Alias::SVariant::<()> { v: () };
    |            --------   ^^ type argument not allowed
    |            |
-   |            not allowed on this
+   |            not allowed on this type
    |
    = note: enum variants can't have type parameters
 help: you might have meant to specity type parameters on enum `Enum`
@@ -371,7 +371,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     Alias::<()>::SVariant::<()> { v: () };
    |                  --------   ^^ type argument not allowed
    |                  |
-   |                  not allowed on this
+   |                  not allowed on this type
    |
    = note: enum variants can't have type parameters
 help: you might have meant to specity type parameters on enum `Enum`
@@ -386,7 +386,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     AliasFixed::SVariant::<()> { v: () };
    |                 --------   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on this type
    |
    = note: enum variants can't have type parameters
 help: you might have meant to specity type parameters on enum `Enum`
@@ -429,7 +429,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     AliasFixed::<()>::SVariant::<()> { v: () };
    |                       --------   ^^ type argument not allowed
    |                       |
-   |                       not allowed on this
+   |                       not allowed on this type
    |
    = note: enum variants can't have type parameters
 help: you might have meant to specity type parameters on enum `Enum`
@@ -438,13 +438,13 @@ LL -     AliasFixed::<()>::SVariant::<()> { v: () };
 LL +     AliasFixed::<()>::SVariant { v: () };
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on unit variant `UVariant`
   --> $DIR/enum-variant-generic-args.rs:90:28
    |
 LL |     Enum::<()>::UVariant::<()>;
    |                 --------   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on unit variant `UVariant`
 
 error[E0109]: type arguments are not allowed on this type
   --> $DIR/enum-variant-generic-args.rs:93:23
@@ -452,7 +452,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     Alias::UVariant::<()>;
    |            --------   ^^ type argument not allowed
    |            |
-   |            not allowed on this
+   |            not allowed on this type
 
 error[E0109]: type arguments are not allowed on this type
   --> $DIR/enum-variant-generic-args.rs:95:29
@@ -460,7 +460,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     Alias::<()>::UVariant::<()>;
    |                  --------   ^^ type argument not allowed
    |                  |
-   |                  not allowed on this
+   |                  not allowed on this type
 
 error[E0109]: type arguments are not allowed on this type
   --> $DIR/enum-variant-generic-args.rs:98:28
@@ -468,7 +468,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     AliasFixed::UVariant::<()>;
    |                 --------   ^^ type argument not allowed
    |                 |
-   |                 not allowed on this
+   |                 not allowed on this type
 
 error[E0107]: this type alias takes 0 generic arguments but 1 generic argument was supplied
   --> $DIR/enum-variant-generic-args.rs:100:5
@@ -504,7 +504,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     AliasFixed::<()>::UVariant::<()>;
    |                       --------   ^^ type argument not allowed
    |                       |
-   |                       not allowed on this
+   |                       not allowed on this type
 
 error: aborting due to 39 previous errors
 
diff --git a/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr b/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr
index 3fc5a3594d8..6ae2aa1dc77 100644
--- a/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr
+++ b/src/test/ui/type-alias-enum-variants/enum-variant-priority-higher-than-other-inherent.stderr
@@ -11,8 +11,8 @@ LL |     V(u8)
    |     ^
 help: provide the argument
    |
-LL |     <E>::V({u8});
-   |     ~~~~~~~~~~~~
+LL |     <E>::V(/* u8 */);
+   |     ~~~~~~~~~~~~~~~~
 
 error[E0308]: mismatched types
   --> $DIR/enum-variant-priority-higher-than-other-inherent.rs:22:17
diff --git a/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr b/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr
index 474548a14a9..51b1c8a1068 100644
--- a/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr
+++ b/src/test/ui/type-alias-enum-variants/no-type-application-on-aliased-enum-variant.stderr
@@ -4,7 +4,7 @@ error[E0109]: type arguments are not allowed on this type
 LL |     let _ = Alias::None::<u8>;
    |                    ----   ^^ type argument not allowed
    |                    |
-   |                    not allowed on this
+   |                    not allowed on this type
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.rs b/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.rs
index 745379efa6d..fc89b0e870e 100644
--- a/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.rs
+++ b/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.rs
@@ -4,7 +4,9 @@
 mod m {
     use std::rc::Rc;
 
-    type Foo = impl std::fmt::Debug;
+    type Foo = impl std::fmt::Debug; //~ NOTE appears within the type
+    //~^ within this `Foo`
+    //~| expansion of desugaring
 
     pub fn foo() -> Foo {
         Rc::new(22_u32)
@@ -12,8 +14,12 @@ mod m {
 }
 
 fn is_send<T: Send>(_: T) {}
+//~^ required by this bound
+//~| required by a bound
 
 fn main() {
     is_send(m::foo());
     //~^ ERROR: `Rc<u32>` cannot be sent between threads safely [E0277]
+    //~| NOTE cannot be sent
+    //~| NOTE required by a bound
 }
diff --git a/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.stderr b/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.stderr
index 0664275b2ad..d7247302dd1 100644
--- a/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.stderr
+++ b/src/test/ui/type-alias-impl-trait/auto-trait-leakage2.stderr
@@ -1,5 +1,5 @@
 error[E0277]: `Rc<u32>` cannot be sent between threads safely
-  --> $DIR/auto-trait-leakage2.rs:17:13
+  --> $DIR/auto-trait-leakage2.rs:21:13
    |
 LL |     type Foo = impl std::fmt::Debug;
    |                -------------------- within this `Foo`
@@ -10,9 +10,13 @@ LL |     is_send(m::foo());
    |     required by a bound introduced by this call
    |
    = help: within `Foo`, the trait `Send` is not implemented for `Rc<u32>`
-   = note: required because it appears within the type `Foo`
+note: required because it appears within the type `Foo`
+  --> $DIR/auto-trait-leakage2.rs:7:16
+   |
+LL |     type Foo = impl std::fmt::Debug;
+   |                ^^^^^^^^^^^^^^^^^^^^
 note: required by a bound in `is_send`
-  --> $DIR/auto-trait-leakage2.rs:14:15
+  --> $DIR/auto-trait-leakage2.rs:16:15
    |
 LL | fn is_send<T: Send>(_: T) {}
    |               ^^^^ required by this bound in `is_send`
diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.stderr b/src/test/ui/type-alias-impl-trait/issue-63279.stderr
index 33f81a77aaf..ab39ee74be4 100644
--- a/src/test/ui/type-alias-impl-trait/issue-63279.stderr
+++ b/src/test/ui/type-alias-impl-trait/issue-63279.stderr
@@ -15,6 +15,10 @@ LL |     || -> Closure { || () }
    |
    = note: expected unit type `()`
                 found closure `[closure@$DIR/issue-63279.rs:8:21: 8:26]`
+help: use parentheses to call this closure
+   |
+LL |     || -> Closure { (|| ())() }
+   |                     +     +++
 
 error[E0308]: mismatched types
   --> $DIR/issue-63279.rs:8:5
diff --git a/src/test/ui/type-alias-impl-trait/nested-tait-inference.stderr b/src/test/ui/type-alias-impl-trait/nested-tait-inference.stderr
index f98da9f7f92..62db019ed6a 100644
--- a/src/test/ui/type-alias-impl-trait/nested-tait-inference.stderr
+++ b/src/test/ui/type-alias-impl-trait/nested-tait-inference.stderr
@@ -3,6 +3,9 @@ error[E0277]: the trait bound `(): Foo<FooX>` is not satisfied
    |
 LL | fn foo() -> impl Foo<FooX> {
    |             ^^^^^^^^^^^^^^ the trait `Foo<FooX>` is not implemented for `()`
+...
+LL |     ()
+   |     -- return type was inferred to be `()` here
    |
    = help: the trait `Foo<()>` is implemented for `()`
 
diff --git a/src/test/ui/type-alias-impl-trait/nested-tait-inference2.stderr b/src/test/ui/type-alias-impl-trait/nested-tait-inference2.stderr
index 54f571ad3e3..f4d96038d91 100644
--- a/src/test/ui/type-alias-impl-trait/nested-tait-inference2.stderr
+++ b/src/test/ui/type-alias-impl-trait/nested-tait-inference2.stderr
@@ -3,6 +3,9 @@ error[E0277]: the trait bound `(): Foo<FooX>` is not satisfied
    |
 LL | fn foo() -> impl Foo<FooX> {
    |             ^^^^^^^^^^^^^^ the trait `Foo<FooX>` is not implemented for `()`
+LL |
+LL |     ()
+   |     -- return type was inferred to be `()` here
    |
    = help: the following other types implement trait `Foo<A>`:
              <() as Foo<()>>
diff --git a/src/test/ui/type-alias/issue-62263-self-in-atb.rs b/src/test/ui/type-alias/issue-62263-self-in-atb.rs
index 1f64b4cfe5c..91522d8912f 100644
--- a/src/test/ui/type-alias/issue-62263-self-in-atb.rs
+++ b/src/test/ui/type-alias/issue-62263-self-in-atb.rs
@@ -3,6 +3,6 @@ pub trait Trait {
 }
 
 pub type Alias = dyn Trait<A = Self::A>;
-//~^ ERROR failed to resolve: use of undeclared type `Self` [E0433]
+//~^ ERROR failed to resolve: `Self`
 
 fn main() {}
diff --git a/src/test/ui/type-alias/issue-62263-self-in-atb.stderr b/src/test/ui/type-alias/issue-62263-self-in-atb.stderr
index d34b6ed5038..c20074dc27c 100644
--- a/src/test/ui/type-alias/issue-62263-self-in-atb.stderr
+++ b/src/test/ui/type-alias/issue-62263-self-in-atb.stderr
@@ -1,8 +1,8 @@
-error[E0433]: failed to resolve: use of undeclared type `Self`
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
   --> $DIR/issue-62263-self-in-atb.rs:5:32
    |
 LL | pub type Alias = dyn Trait<A = Self::A>;
-   |                                ^^^^ use of undeclared type `Self`
+   |                                ^^^^ `Self` is only available in impls, traits, and type definitions
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/type-alias/issue-62305-self-assoc-ty.rs b/src/test/ui/type-alias/issue-62305-self-assoc-ty.rs
index 999902fb18b..a4d9a285485 100644
--- a/src/test/ui/type-alias/issue-62305-self-assoc-ty.rs
+++ b/src/test/ui/type-alias/issue-62305-self-assoc-ty.rs
@@ -1,4 +1,4 @@
 type Alias = Self::Target;
-//~^ ERROR failed to resolve: use of undeclared type `Self` [E0433]
+//~^ ERROR failed to resolve: `Self`
 
 fn main() {}
diff --git a/src/test/ui/type-alias/issue-62305-self-assoc-ty.stderr b/src/test/ui/type-alias/issue-62305-self-assoc-ty.stderr
index 823a5fa50fc..f3da50df926 100644
--- a/src/test/ui/type-alias/issue-62305-self-assoc-ty.stderr
+++ b/src/test/ui/type-alias/issue-62305-self-assoc-ty.stderr
@@ -1,8 +1,8 @@
-error[E0433]: failed to resolve: use of undeclared type `Self`
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
   --> $DIR/issue-62305-self-assoc-ty.rs:1:14
    |
 LL | type Alias = Self::Target;
-   |              ^^^^ use of undeclared type `Self`
+   |              ^^^^ `Self` is only available in impls, traits, and type definitions
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr b/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr
index cae41672ead..7e15e42e3cc 100644
--- a/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr
+++ b/src/test/ui/type-alias/issue-62364-self-ty-arg.stderr
@@ -2,9 +2,9 @@ error[E0411]: cannot find type `Self` in this scope
   --> $DIR/issue-62364-self-ty-arg.rs:5:29
    |
 LL | type Alias<'a> = Struct<&'a Self>;
-   |              -              ^^^^ `Self` is only available in impls, traits, and type definitions
-   |              |
-   |              help: you might be missing a type parameter: `, Self`
+   |      -----                  ^^^^ `Self` is only available in impls, traits, and type definitions
+   |      |
+   |      `Self` not allowed in a type alias
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/type/issue-91268.rs b/src/test/ui/type/issue-91268.rs
index 01ed9ea9e23..f1e16bc7bd3 100644
--- a/src/test/ui/type/issue-91268.rs
+++ b/src/test/ui/type/issue-91268.rs
@@ -1,7 +1,7 @@
 // error-pattern: this file contains an unclosed delimiter
 // error-pattern: cannot find type `Å£` in this scope
 // error-pattern: parenthesized type parameters may only be used with a `Fn` trait
-// error-pattern: type arguments are not allowed on this type
+// error-pattern: type arguments are not allowed on builtin type `u8`
 // error-pattern: mismatched types
 // ignore-tidy-trailing-newlines
 // `Å£` must be the last character in this file, it cannot be followed by a newline
diff --git a/src/test/ui/type/issue-91268.stderr b/src/test/ui/type/issue-91268.stderr
index 1df5a2cf07b..6c9ee994584 100644
--- a/src/test/ui/type/issue-91268.stderr
+++ b/src/test/ui/type/issue-91268.stderr
@@ -35,13 +35,13 @@ help: use angle brackets instead
 LL |     0: u8<Å£>
    |          ~ +
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `u8`
   --> $DIR/issue-91268.rs:9:11
    |
 LL |     0: u8(Å£
    |        -- ^ type argument not allowed
    |        |
-   |        not allowed on this
+   |        not allowed on builtin type `u8`
    |
 help: primitive type `u8` doesn't have generic parameters
    |
diff --git a/src/test/ui/issues/issue-10401.rs b/src/test/ui/typeck/issue-10401.rs
index d77ff381e1a..d77ff381e1a 100644
--- a/src/test/ui/issues/issue-10401.rs
+++ b/src/test/ui/typeck/issue-10401.rs
diff --git a/src/test/ui/issues/issue-10401.stderr b/src/test/ui/typeck/issue-10401.stderr
index 1f68abcfb43..1f68abcfb43 100644
--- a/src/test/ui/issues/issue-10401.stderr
+++ b/src/test/ui/typeck/issue-10401.stderr
diff --git a/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.rs b/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.rs
index 31761441337..326e958aaa9 100644
--- a/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.rs
+++ b/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.rs
@@ -7,5 +7,5 @@ pub mod foo {
 
 fn main() {
     foo::Foo {};
-    //~^ ERROR cannot construct `Foo` with struct literal syntax due to inaccessible fields
+    //~^ ERROR cannot construct `Foo` with struct literal syntax due to private fields
 }
diff --git a/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.stderr b/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.stderr
index 81b73c00e86..f0bd3e0ddf7 100644
--- a/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.stderr
+++ b/src/test/ui/typeck/issue-87872-missing-inaccessible-field-literal.stderr
@@ -1,8 +1,10 @@
-error: cannot construct `Foo` with struct literal syntax due to inaccessible fields
+error: cannot construct `Foo` with struct literal syntax due to private fields
   --> $DIR/issue-87872-missing-inaccessible-field-literal.rs:9:5
    |
 LL |     foo::Foo {};
    |     ^^^^^^^^
+   |
+   = note: ... and other private field `you_cant_use_this_field` that was not provided
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/typeck/missing-private-fields-in-struct-literal.rs b/src/test/ui/typeck/missing-private-fields-in-struct-literal.rs
new file mode 100644
index 00000000000..9f1560bfb8d
--- /dev/null
+++ b/src/test/ui/typeck/missing-private-fields-in-struct-literal.rs
@@ -0,0 +1,18 @@
+pub mod m {
+    pub struct S {
+        pub visible: bool,
+        a: (),
+        b: (),
+        c: (),
+        d: (),
+        e: (),
+    }
+}
+
+fn main() {
+    let _ = m::S { //~ ERROR cannot construct `S` with struct literal syntax due to private fields
+        visible: true,
+        a: (),
+        b: (),
+    };
+}
diff --git a/src/test/ui/typeck/missing-private-fields-in-struct-literal.stderr b/src/test/ui/typeck/missing-private-fields-in-struct-literal.stderr
new file mode 100644
index 00000000000..234110f31f7
--- /dev/null
+++ b/src/test/ui/typeck/missing-private-fields-in-struct-literal.stderr
@@ -0,0 +1,15 @@
+error: cannot construct `S` with struct literal syntax due to private fields
+  --> $DIR/missing-private-fields-in-struct-literal.rs:13:13
+   |
+LL |     let _ = m::S {
+   |             ^^^^
+LL |         visible: true,
+LL |         a: (),
+   |         ----- private field
+LL |         b: (),
+   |         ----- private field
+   |
+   = note: ... and other private fields `c`, `d` and `e` that were not provided
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/typeck/point-at-type-parameter-definition.rs b/src/test/ui/typeck/point-at-type-parameter-definition.rs
new file mode 100644
index 00000000000..856c0db08f7
--- /dev/null
+++ b/src/test/ui/typeck/point-at-type-parameter-definition.rs
@@ -0,0 +1,17 @@
+trait Trait {
+    fn do_stuff(&self);
+}
+
+struct Hello;
+
+impl Hello {
+    fn method(&self) {}
+}
+
+impl<Hello> Trait for Vec<Hello> {
+    fn do_stuff(&self) {
+        self[0].method(); //~ ERROR no method named `method` found for type parameter `Hello` in the current scope
+    }
+}
+
+fn main() {}
diff --git a/src/test/ui/typeck/point-at-type-parameter-definition.stderr b/src/test/ui/typeck/point-at-type-parameter-definition.stderr
new file mode 100644
index 00000000000..8a6ab61100d
--- /dev/null
+++ b/src/test/ui/typeck/point-at-type-parameter-definition.stderr
@@ -0,0 +1,12 @@
+error[E0599]: no method named `method` found for type parameter `Hello` in the current scope
+  --> $DIR/point-at-type-parameter-definition.rs:13:17
+   |
+LL | impl<Hello> Trait for Vec<Hello> {
+   |      ----- method `method` not found for this type parameter
+LL |     fn do_stuff(&self) {
+LL |         self[0].method();
+   |                 ^^^^^^ method not found in `Hello`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0599`.
diff --git a/src/test/ui/typeck/prim-with-args.fixed b/src/test/ui/typeck/prim-with-args.fixed
index 1c5fd750867..e3f99479a38 100644
--- a/src/test/ui/typeck/prim-with-args.fixed
+++ b/src/test/ui/typeck/prim-with-args.fixed
@@ -1,28 +1,28 @@
 // run-rustfix
 fn main() {
 
-let _x: isize; //~ ERROR type arguments are not allowed on this type
-let _x: i8; //~ ERROR type arguments are not allowed on this type
-let _x: i16; //~ ERROR type arguments are not allowed on this type
-let _x: i32; //~ ERROR type arguments are not allowed on this type
-let _x: i64; //~ ERROR type arguments are not allowed on this type
-let _x: usize; //~ ERROR type arguments are not allowed on this type
-let _x: u8; //~ ERROR type arguments are not allowed on this type
-let _x: u16; //~ ERROR type arguments are not allowed on this type
-let _x: u32; //~ ERROR type arguments are not allowed on this type
-let _x: u64; //~ ERROR type arguments are not allowed on this type
-let _x: char; //~ ERROR type arguments are not allowed on this type
+let _x: isize; //~ ERROR type arguments are not allowed on builtin type
+let _x: i8; //~ ERROR type arguments are not allowed on builtin type
+let _x: i16; //~ ERROR type arguments are not allowed on builtin type
+let _x: i32; //~ ERROR type arguments are not allowed on builtin type
+let _x: i64; //~ ERROR type arguments are not allowed on builtin type
+let _x: usize; //~ ERROR type arguments are not allowed on builtin type
+let _x: u8; //~ ERROR type arguments are not allowed on builtin type
+let _x: u16; //~ ERROR type arguments are not allowed on builtin type
+let _x: u32; //~ ERROR type arguments are not allowed on builtin type
+let _x: u64; //~ ERROR type arguments are not allowed on builtin type
+let _x: char; //~ ERROR type arguments are not allowed on builtin type
 
-let _x: isize; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i8; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i16; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i32; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i64; //~ ERROR lifetime arguments are not allowed on this type
-let _x: usize; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u8; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u16; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u32; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u64; //~ ERROR lifetime arguments are not allowed on this type
-let _x: char; //~ ERROR lifetime arguments are not allowed on this type
+let _x: isize; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i8; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i16; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i32; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i64; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: usize; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u8; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u16; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u32; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u64; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: char; //~ ERROR lifetime arguments are not allowed on builtin type
 
 }
diff --git a/src/test/ui/typeck/prim-with-args.rs b/src/test/ui/typeck/prim-with-args.rs
index b05d6c1cb4e..b10471eccee 100644
--- a/src/test/ui/typeck/prim-with-args.rs
+++ b/src/test/ui/typeck/prim-with-args.rs
@@ -1,28 +1,28 @@
 // run-rustfix
 fn main() {
 
-let _x: isize<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: i8<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: i16<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: i32<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: i64<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: usize<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: u8<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: u16<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: u32<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: u64<isize>; //~ ERROR type arguments are not allowed on this type
-let _x: char<isize>; //~ ERROR type arguments are not allowed on this type
+let _x: isize<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: i8<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: i16<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: i32<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: i64<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: usize<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: u8<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: u16<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: u32<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: u64<isize>; //~ ERROR type arguments are not allowed on builtin type
+let _x: char<isize>; //~ ERROR type arguments are not allowed on builtin type
 
-let _x: isize<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i8<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i16<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i32<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: i64<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: usize<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u8<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u16<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u32<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: u64<'static>; //~ ERROR lifetime arguments are not allowed on this type
-let _x: char<'static>; //~ ERROR lifetime arguments are not allowed on this type
+let _x: isize<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i8<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i16<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i32<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: i64<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: usize<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u8<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u16<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u32<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: u64<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
+let _x: char<'static>; //~ ERROR lifetime arguments are not allowed on builtin type
 
 }
diff --git a/src/test/ui/typeck/prim-with-args.stderr b/src/test/ui/typeck/prim-with-args.stderr
index cdc7e96bfc5..2ddad5ad71e 100644
--- a/src/test/ui/typeck/prim-with-args.stderr
+++ b/src/test/ui/typeck/prim-with-args.stderr
@@ -1,10 +1,10 @@
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `isize`
   --> $DIR/prim-with-args.rs:4:15
    |
 LL | let _x: isize<isize>;
    |         ----- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `isize`
    |
 help: primitive type `isize` doesn't have generic parameters
    |
@@ -12,13 +12,13 @@ LL - let _x: isize<isize>;
 LL + let _x: isize;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `i8`
   --> $DIR/prim-with-args.rs:5:12
    |
 LL | let _x: i8<isize>;
    |         -- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i8`
    |
 help: primitive type `i8` doesn't have generic parameters
    |
@@ -26,13 +26,13 @@ LL - let _x: i8<isize>;
 LL + let _x: i8;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `i16`
   --> $DIR/prim-with-args.rs:6:13
    |
 LL | let _x: i16<isize>;
    |         --- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i16`
    |
 help: primitive type `i16` doesn't have generic parameters
    |
@@ -40,13 +40,13 @@ LL - let _x: i16<isize>;
 LL + let _x: i16;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `i32`
   --> $DIR/prim-with-args.rs:7:13
    |
 LL | let _x: i32<isize>;
    |         --- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i32`
    |
 help: primitive type `i32` doesn't have generic parameters
    |
@@ -54,13 +54,13 @@ LL - let _x: i32<isize>;
 LL + let _x: i32;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `i64`
   --> $DIR/prim-with-args.rs:8:13
    |
 LL | let _x: i64<isize>;
    |         --- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i64`
    |
 help: primitive type `i64` doesn't have generic parameters
    |
@@ -68,13 +68,13 @@ LL - let _x: i64<isize>;
 LL + let _x: i64;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `usize`
   --> $DIR/prim-with-args.rs:9:15
    |
 LL | let _x: usize<isize>;
    |         ----- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `usize`
    |
 help: primitive type `usize` doesn't have generic parameters
    |
@@ -82,13 +82,13 @@ LL - let _x: usize<isize>;
 LL + let _x: usize;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `u8`
   --> $DIR/prim-with-args.rs:10:12
    |
 LL | let _x: u8<isize>;
    |         -- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u8`
    |
 help: primitive type `u8` doesn't have generic parameters
    |
@@ -96,13 +96,13 @@ LL - let _x: u8<isize>;
 LL + let _x: u8;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `u16`
   --> $DIR/prim-with-args.rs:11:13
    |
 LL | let _x: u16<isize>;
    |         --- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u16`
    |
 help: primitive type `u16` doesn't have generic parameters
    |
@@ -110,13 +110,13 @@ LL - let _x: u16<isize>;
 LL + let _x: u16;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `u32`
   --> $DIR/prim-with-args.rs:12:13
    |
 LL | let _x: u32<isize>;
    |         --- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u32`
    |
 help: primitive type `u32` doesn't have generic parameters
    |
@@ -124,13 +124,13 @@ LL - let _x: u32<isize>;
 LL + let _x: u32;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `u64`
   --> $DIR/prim-with-args.rs:13:13
    |
 LL | let _x: u64<isize>;
    |         --- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u64`
    |
 help: primitive type `u64` doesn't have generic parameters
    |
@@ -138,13 +138,13 @@ LL - let _x: u64<isize>;
 LL + let _x: u64;
    |
 
-error[E0109]: type arguments are not allowed on this type
+error[E0109]: type arguments are not allowed on builtin type `char`
   --> $DIR/prim-with-args.rs:14:14
    |
 LL | let _x: char<isize>;
    |         ---- ^^^^^ type argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `char`
    |
 help: primitive type `char` doesn't have generic parameters
    |
@@ -152,13 +152,13 @@ LL - let _x: char<isize>;
 LL + let _x: char;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `isize`
   --> $DIR/prim-with-args.rs:16:15
    |
 LL | let _x: isize<'static>;
    |         ----- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `isize`
    |
 help: primitive type `isize` doesn't have generic parameters
    |
@@ -166,13 +166,13 @@ LL - let _x: isize<'static>;
 LL + let _x: isize;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `i8`
   --> $DIR/prim-with-args.rs:17:12
    |
 LL | let _x: i8<'static>;
    |         -- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i8`
    |
 help: primitive type `i8` doesn't have generic parameters
    |
@@ -180,13 +180,13 @@ LL - let _x: i8<'static>;
 LL + let _x: i8;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `i16`
   --> $DIR/prim-with-args.rs:18:13
    |
 LL | let _x: i16<'static>;
    |         --- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i16`
    |
 help: primitive type `i16` doesn't have generic parameters
    |
@@ -194,13 +194,13 @@ LL - let _x: i16<'static>;
 LL + let _x: i16;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `i32`
   --> $DIR/prim-with-args.rs:19:13
    |
 LL | let _x: i32<'static>;
    |         --- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i32`
    |
 help: primitive type `i32` doesn't have generic parameters
    |
@@ -208,13 +208,13 @@ LL - let _x: i32<'static>;
 LL + let _x: i32;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `i64`
   --> $DIR/prim-with-args.rs:20:13
    |
 LL | let _x: i64<'static>;
    |         --- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `i64`
    |
 help: primitive type `i64` doesn't have generic parameters
    |
@@ -222,13 +222,13 @@ LL - let _x: i64<'static>;
 LL + let _x: i64;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `usize`
   --> $DIR/prim-with-args.rs:21:15
    |
 LL | let _x: usize<'static>;
    |         ----- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `usize`
    |
 help: primitive type `usize` doesn't have generic parameters
    |
@@ -236,13 +236,13 @@ LL - let _x: usize<'static>;
 LL + let _x: usize;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `u8`
   --> $DIR/prim-with-args.rs:22:12
    |
 LL | let _x: u8<'static>;
    |         -- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u8`
    |
 help: primitive type `u8` doesn't have generic parameters
    |
@@ -250,13 +250,13 @@ LL - let _x: u8<'static>;
 LL + let _x: u8;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `u16`
   --> $DIR/prim-with-args.rs:23:13
    |
 LL | let _x: u16<'static>;
    |         --- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u16`
    |
 help: primitive type `u16` doesn't have generic parameters
    |
@@ -264,13 +264,13 @@ LL - let _x: u16<'static>;
 LL + let _x: u16;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `u32`
   --> $DIR/prim-with-args.rs:24:13
    |
 LL | let _x: u32<'static>;
    |         --- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u32`
    |
 help: primitive type `u32` doesn't have generic parameters
    |
@@ -278,13 +278,13 @@ LL - let _x: u32<'static>;
 LL + let _x: u32;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `u64`
   --> $DIR/prim-with-args.rs:25:13
    |
 LL | let _x: u64<'static>;
    |         --- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `u64`
    |
 help: primitive type `u64` doesn't have generic parameters
    |
@@ -292,13 +292,13 @@ LL - let _x: u64<'static>;
 LL + let _x: u64;
    |
 
-error[E0109]: lifetime arguments are not allowed on this type
+error[E0109]: lifetime arguments are not allowed on builtin type `char`
   --> $DIR/prim-with-args.rs:26:14
    |
 LL | let _x: char<'static>;
    |         ---- ^^^^^^^ lifetime argument not allowed
    |         |
-   |         not allowed on this
+   |         not allowed on builtin type `char`
    |
 help: primitive type `char` doesn't have generic parameters
    |
diff --git a/src/test/ui/typeck/struct-enum-wrong-args.stderr b/src/test/ui/typeck/struct-enum-wrong-args.stderr
index aafb29f25d0..2ea822df275 100644
--- a/src/test/ui/typeck/struct-enum-wrong-args.stderr
+++ b/src/test/ui/typeck/struct-enum-wrong-args.stderr
@@ -45,8 +45,8 @@ LL |     Ok(#[stable(feature = "rust1", since = "1.0.0")] T),
    |     ^^
 help: provide the argument
    |
-LL |     let _ = Ok({_});
-   |             ~~~~~~~
+LL |     let _ = Ok(/* value */);
+   |             ~~~~~~~~~~~~~~~
 
 error[E0061]: this struct takes 1 argument but 0 arguments were supplied
   --> $DIR/struct-enum-wrong-args.rs:9:13
@@ -61,8 +61,8 @@ LL | struct Wrapper(i32);
    |        ^^^^^^^
 help: provide the argument
    |
-LL |     let _ = Wrapper({i32});
-   |             ~~~~~~~~~~~~~~
+LL |     let _ = Wrapper(/* i32 */);
+   |             ~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this struct takes 1 argument but 2 arguments were supplied
   --> $DIR/struct-enum-wrong-args.rs:10:13
@@ -93,8 +93,8 @@ LL | struct DoubleWrapper(i32, i32);
    |        ^^^^^^^^^^^^^
 help: provide the arguments
    |
-LL |     let _ = DoubleWrapper({i32}, {i32});
-   |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+LL |     let _ = DoubleWrapper(/* i32 */, /* i32 */);
+   |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this struct takes 2 arguments but 1 argument was supplied
   --> $DIR/struct-enum-wrong-args.rs:12:13
@@ -109,8 +109,8 @@ LL | struct DoubleWrapper(i32, i32);
    |        ^^^^^^^^^^^^^
 help: provide the argument
    |
-LL |     let _ = DoubleWrapper(5, {i32});
-   |             ~~~~~~~~~~~~~~~~~~~~~~~
+LL |     let _ = DoubleWrapper(5, /* i32 */);
+   |             ~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 error[E0061]: this struct takes 2 arguments but 3 arguments were supplied
   --> $DIR/struct-enum-wrong-args.rs:13:13
diff --git a/src/test/ui/union/union-derive-clone.mirunsafeck.stderr b/src/test/ui/union/union-derive-clone.mirunsafeck.stderr
index c242a7de7ab..b5c72aa5247 100644
--- a/src/test/ui/union/union-derive-clone.mirunsafeck.stderr
+++ b/src/test/ui/union/union-derive-clone.mirunsafeck.stderr
@@ -3,8 +3,8 @@ error[E0599]: the method `clone` exists for union `U5<CloneNoCopy>`, but its tra
    |
 LL | union U5<T> {
    | -----------
-   | |
-   | method `clone` not found for this
+   | |     |
+   | |     method `clone` not found for this union
    | doesn't satisfy `U5<CloneNoCopy>: Clone`
 ...
 LL | struct CloneNoCopy;
diff --git a/src/test/ui/union/union-derive-clone.thirunsafeck.stderr b/src/test/ui/union/union-derive-clone.thirunsafeck.stderr
index c242a7de7ab..b5c72aa5247 100644
--- a/src/test/ui/union/union-derive-clone.thirunsafeck.stderr
+++ b/src/test/ui/union/union-derive-clone.thirunsafeck.stderr
@@ -3,8 +3,8 @@ error[E0599]: the method `clone` exists for union `U5<CloneNoCopy>`, but its tra
    |
 LL | union U5<T> {
    | -----------
-   | |
-   | method `clone` not found for this
+   | |     |
+   | |     method `clone` not found for this union
    | doesn't satisfy `U5<CloneNoCopy>: Clone`
 ...
 LL | struct CloneNoCopy;
diff --git a/src/test/ui/union/union-fields-1.mirunsafeck.stderr b/src/test/ui/union/union-fields-1.mirunsafeck.stderr
index 9f1e2947c86..5b932b9626c 100644
--- a/src/test/ui/union/union-fields-1.mirunsafeck.stderr
+++ b/src/test/ui/union/union-fields-1.mirunsafeck.stderr
@@ -1,6 +1,9 @@
-error: field is never read: `c`
+error: field `c` is never read
   --> $DIR/union-fields-1.rs:9:5
    |
+LL | union U1 {
+   |       -- field in this union
+...
 LL |     c: u8,
    |     ^^^^^
    |
@@ -10,21 +13,28 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: field is never read: `a`
+error: field `a` is never read
   --> $DIR/union-fields-1.rs:12:5
    |
+LL | union U2 {
+   |       -- field in this union
 LL |     a: u8,
    |     ^^^^^
 
-error: field is never read: `a`
+error: field `a` is never read
   --> $DIR/union-fields-1.rs:16:20
    |
 LL | union NoDropLike { a: u8 }
-   |                    ^^^^^
+   |       ----------   ^^^^^
+   |       |
+   |       field in this union
 
-error: field is never read: `c`
+error: field `c` is never read
   --> $DIR/union-fields-1.rs:21:5
    |
+LL | union U {
+   |       - field in this union
+...
 LL |     c: u8,
    |     ^^^^^
 
diff --git a/src/test/ui/union/union-fields-1.rs b/src/test/ui/union/union-fields-1.rs
index 3d3e2355a26..cf2ef4c03d6 100644
--- a/src/test/ui/union/union-fields-1.rs
+++ b/src/test/ui/union/union-fields-1.rs
@@ -6,19 +6,19 @@
 union U1 {
     a: u8, // should not be reported
     b: u8, // should not be reported
-    c: u8, //~ ERROR field is never read
+    c: u8, //~ ERROR field `c` is never read
 }
 union U2 {
-    a: u8, //~ ERROR field is never read
+    a: u8, //~ ERROR field `a` is never read
     b: u8, // should not be reported
     c: u8, // should not be reported
 }
-union NoDropLike { a: u8 } //~ ERROR field is never read
+union NoDropLike { a: u8 } //~ ERROR field `a` is never read
 
 union U {
     a: u8, // should not be reported
     b: u8, // should not be reported
-    c: u8, //~ ERROR field is never read
+    c: u8, //~ ERROR field `c` is never read
 }
 type A = U;
 
diff --git a/src/test/ui/union/union-fields-1.thirunsafeck.stderr b/src/test/ui/union/union-fields-1.thirunsafeck.stderr
index 9f1e2947c86..5b932b9626c 100644
--- a/src/test/ui/union/union-fields-1.thirunsafeck.stderr
+++ b/src/test/ui/union/union-fields-1.thirunsafeck.stderr
@@ -1,6 +1,9 @@
-error: field is never read: `c`
+error: field `c` is never read
   --> $DIR/union-fields-1.rs:9:5
    |
+LL | union U1 {
+   |       -- field in this union
+...
 LL |     c: u8,
    |     ^^^^^
    |
@@ -10,21 +13,28 @@ note: the lint level is defined here
 LL | #![deny(dead_code)]
    |         ^^^^^^^^^
 
-error: field is never read: `a`
+error: field `a` is never read
   --> $DIR/union-fields-1.rs:12:5
    |
+LL | union U2 {
+   |       -- field in this union
 LL |     a: u8,
    |     ^^^^^
 
-error: field is never read: `a`
+error: field `a` is never read
   --> $DIR/union-fields-1.rs:16:20
    |
 LL | union NoDropLike { a: u8 }
-   |                    ^^^^^
+   |       ----------   ^^^^^
+   |       |
+   |       field in this union
 
-error: field is never read: `c`
+error: field `c` is never read
   --> $DIR/union-fields-1.rs:21:5
    |
+LL | union U {
+   |       - field in this union
+...
 LL |     c: u8,
    |     ^^^^^
 
diff --git a/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr b/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr
index 22d4428c902..f6e515f8400 100644
--- a/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr
+++ b/src/test/ui/union/union-lint-dead-code.mirunsafeck.stderr
@@ -1,6 +1,9 @@
-error: field is never read: `b`
+error: field `b` is never read
   --> $DIR/union-lint-dead-code.rs:8:5
    |
+LL | union Foo {
+   |       --- field in this union
+LL |     x: usize,
 LL |     b: bool,
    |     ^^^^^^^
    |
diff --git a/src/test/ui/union/union-lint-dead-code.rs b/src/test/ui/union/union-lint-dead-code.rs
index 64c28d72e9e..65aaf0a1d35 100644
--- a/src/test/ui/union/union-lint-dead-code.rs
+++ b/src/test/ui/union/union-lint-dead-code.rs
@@ -5,7 +5,7 @@
 
 union Foo {
     x: usize,
-    b: bool, //~ ERROR: field is never read
+    b: bool, //~ ERROR: field `b` is never read
     _unused: u16,
 }
 
diff --git a/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr b/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr
index 22d4428c902..f6e515f8400 100644
--- a/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr
+++ b/src/test/ui/union/union-lint-dead-code.thirunsafeck.stderr
@@ -1,6 +1,9 @@
-error: field is never read: `b`
+error: field `b` is never read
   --> $DIR/union-lint-dead-code.rs:8:5
    |
+LL | union Foo {
+   |       --- field in this union
+LL |     x: usize,
 LL |     b: bool,
    |     ^^^^^^^
    |
diff --git a/src/test/ui/issues/issue-3080.mir.stderr b/src/test/ui/unsafe/issue-3080.mir.stderr
index f395c30b815..f395c30b815 100644
--- a/src/test/ui/issues/issue-3080.mir.stderr
+++ b/src/test/ui/unsafe/issue-3080.mir.stderr
diff --git a/src/test/ui/issues/issue-3080.rs b/src/test/ui/unsafe/issue-3080.rs
index 2b5269dda8f..2b5269dda8f 100644
--- a/src/test/ui/issues/issue-3080.rs
+++ b/src/test/ui/unsafe/issue-3080.rs
diff --git a/src/test/ui/issues/issue-3080.thir.stderr b/src/test/ui/unsafe/issue-3080.thir.stderr
index 4d8acac61d9..4d8acac61d9 100644
--- a/src/test/ui/issues/issue-3080.thir.stderr
+++ b/src/test/ui/unsafe/issue-3080.thir.stderr
diff --git a/src/test/ui/issues/issue-47412.mir.stderr b/src/test/ui/unsafe/issue-47412.mir.stderr
index 305f482e8c2..305f482e8c2 100644
--- a/src/test/ui/issues/issue-47412.mir.stderr
+++ b/src/test/ui/unsafe/issue-47412.mir.stderr
diff --git a/src/test/ui/issues/issue-47412.rs b/src/test/ui/unsafe/issue-47412.rs
index df6d6e4222e..df6d6e4222e 100644
--- a/src/test/ui/issues/issue-47412.rs
+++ b/src/test/ui/unsafe/issue-47412.rs
diff --git a/src/test/ui/issues/issue-47412.thir.stderr b/src/test/ui/unsafe/issue-47412.thir.stderr
index 305f482e8c2..305f482e8c2 100644
--- a/src/test/ui/issues/issue-47412.thir.stderr
+++ b/src/test/ui/unsafe/issue-47412.thir.stderr
diff --git a/src/test/ui/use/use-self-type.rs b/src/test/ui/use/use-self-type.rs
index 370593b2eb2..3b4ce429701 100644
--- a/src/test/ui/use/use-self-type.rs
+++ b/src/test/ui/use/use-self-type.rs
@@ -4,7 +4,7 @@ impl S {
     fn f() {}
     fn g() {
         use Self::f; //~ ERROR unresolved import
-        pub(in Self::f) struct Z; //~ ERROR use of undeclared type `Self`
+        pub(in Self::f) struct Z; //~ ERROR failed to resolve: `Self`
     }
 }
 
diff --git a/src/test/ui/use/use-self-type.stderr b/src/test/ui/use/use-self-type.stderr
index d1469fb3490..e6153941151 100644
--- a/src/test/ui/use/use-self-type.stderr
+++ b/src/test/ui/use/use-self-type.stderr
@@ -1,14 +1,14 @@
-error[E0433]: failed to resolve: use of undeclared type `Self`
+error[E0433]: failed to resolve: `Self` is only available in impls, traits, and type definitions
   --> $DIR/use-self-type.rs:7:16
    |
 LL |         pub(in Self::f) struct Z;
-   |                ^^^^ use of undeclared type `Self`
+   |                ^^^^ `Self` is only available in impls, traits, and type definitions
 
 error[E0432]: unresolved import `Self`
   --> $DIR/use-self-type.rs:6:13
    |
 LL |         use Self::f;
-   |             ^^^^ use of undeclared type `Self`
+   |             ^^^^ `Self` is only available in impls, traits, and type definitions
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/usize-generic-argument-parent.rs b/src/test/ui/usize-generic-argument-parent.rs
index 6d17ba9b5b2..4ab80d944a5 100644
--- a/src/test/ui/usize-generic-argument-parent.rs
+++ b/src/test/ui/usize-generic-argument-parent.rs
@@ -1,5 +1,5 @@
 fn foo() {
-    let x: usize<foo>; //~ ERROR const arguments are not allowed on this type
+    let x: usize<foo>; //~ ERROR const arguments are not allowed on builtin type `usize`
 }
 
 fn main() {}
diff --git a/src/test/ui/usize-generic-argument-parent.stderr b/src/test/ui/usize-generic-argument-parent.stderr
index b3980101104..131c476aa55 100644
--- a/src/test/ui/usize-generic-argument-parent.stderr
+++ b/src/test/ui/usize-generic-argument-parent.stderr
@@ -1,10 +1,10 @@
-error[E0109]: const arguments are not allowed on this type
+error[E0109]: const arguments are not allowed on builtin type `usize`
   --> $DIR/usize-generic-argument-parent.rs:2:18
    |
 LL |     let x: usize<foo>;
    |            ----- ^^^ const argument not allowed
    |            |
-   |            not allowed on this
+   |            not allowed on builtin type `usize`
    |
 help: primitive type `usize` doesn't have generic parameters
    |
diff --git a/src/test/ui/wf/issue-95665.rs b/src/test/ui/wf/issue-95665.rs
new file mode 100644
index 00000000000..67923cbb2d6
--- /dev/null
+++ b/src/test/ui/wf/issue-95665.rs
@@ -0,0 +1,18 @@
+// Regression test for the ICE described in #95665.
+// Ensure that the expected error is output (and thus that there is no ICE)
+
+pub trait Trait: {}
+
+pub struct Struct<T: Trait> {
+    member: T,
+}
+
+// uncomment and bug goes away
+// impl Trait for u8 {}
+
+extern "C" {
+    static VAR: Struct<u8>;
+                //~^ 14:17: 14:27: the trait bound `u8: Trait` is not satisfied [E0277]
+}
+
+fn main() {}
diff --git a/src/test/ui/wf/issue-95665.stderr b/src/test/ui/wf/issue-95665.stderr
new file mode 100644
index 00000000000..b1cda59a916
--- /dev/null
+++ b/src/test/ui/wf/issue-95665.stderr
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `u8: Trait` is not satisfied
+  --> $DIR/issue-95665.rs:14:17
+   |
+LL |     static VAR: Struct<u8>;
+   |                 ^^^^^^^^^^ the trait `Trait` is not implemented for `u8`
+   |
+note: required by a bound in `Struct`
+  --> $DIR/issue-95665.rs:6:22
+   |
+LL | pub struct Struct<T: Trait> {
+   |                      ^^^^^ required by this bound in `Struct`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/src/tools/cargo b/src/tools/cargo
-Subproject 8d42b0e8794ce3787c9f7d6d88b02ae80ebe8d1
+Subproject a5e08c4703f202e30cdaf80ca3e7c00baa59c49
diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs
index b758bb9cf67..160b9785d97 100644
--- a/src/tools/compiletest/src/runtest.rs
+++ b/src/tools/compiletest/src/runtest.rs
@@ -1882,6 +1882,8 @@ impl<'test> TestCx<'test> {
                 rustc.arg("-Ccodegen-units=1");
                 rustc.arg("-Zui-testing");
                 rustc.arg("-Zdeduplicate-diagnostics=no");
+                // FIXME: use this for other modes too, for perf?
+                rustc.arg("-Cstrip=debuginfo");
             }
             MirOpt => {
                 rustc.args(&[
diff --git a/src/tools/miri b/src/tools/miri
-Subproject c4dd3f4ef98f8527aa652e8154ff044ca3e8845
+Subproject 9e2dac4787e5470ecd9e245420e8da9528620ed
diff --git a/src/tools/rls b/src/tools/rls
-Subproject 7241c6cc45badc0e30cefd6c123a539f82c50cd
+Subproject ece09b88c0365947af79c0ffdeea02bc6c1eec2
diff --git a/src/tools/rust-analyzer b/src/tools/rust-analyzer
-Subproject 366bd7242ed00c65f293497a26eb81c7510ac68
+Subproject 427061da19723f2206fe4dcb175c9c43b9a6193
diff --git a/src/tools/rustfmt/.github/workflows/linux.yml b/src/tools/rustfmt/.github/workflows/linux.yml
index 6a3f9d89d98..bce9b0c8d5a 100644
--- a/src/tools/rustfmt/.github/workflows/linux.yml
+++ b/src/tools/rustfmt/.github/workflows/linux.yml
@@ -35,15 +35,5 @@ jobs:
         sh rustup-init.sh -y --default-toolchain none
         rustup target add ${{ matrix.target }}
 
-    - name: build
-      run: |
-        rustc -Vv
-        cargo -V
-        cargo build
-      env:
-        RUSTFLAGS: '-D warnings'
-
-    - name: test
-      run: cargo test
-      env:
-        RUSTFLAGS: '-D warnings'
+    - name: Build and Test
+      run: ./ci/build_and_test.sh
diff --git a/src/tools/rustfmt/.github/workflows/mac.yml b/src/tools/rustfmt/.github/workflows/mac.yml
index 7dfda3142ca..89a980c42c5 100644
--- a/src/tools/rustfmt/.github/workflows/mac.yml
+++ b/src/tools/rustfmt/.github/workflows/mac.yml
@@ -32,11 +32,5 @@ jobs:
         sh rustup-init.sh -y --default-toolchain none
         rustup target add ${{ matrix.target }}
 
-    - name: build
-      run: |
-        rustc -Vv
-        cargo -V
-        cargo build
-
-    - name: test
-      run: cargo test
+    - name: Build and Test
+      run: ./ci/build_and_test.sh
diff --git a/src/tools/rustfmt/.github/workflows/windows.yml b/src/tools/rustfmt/.github/workflows/windows.yml
index 4ebc2963849..ec37c714b08 100644
--- a/src/tools/rustfmt/.github/workflows/windows.yml
+++ b/src/tools/rustfmt/.github/workflows/windows.yml
@@ -57,13 +57,6 @@ jobs:
       if: matrix.target == 'x86_64-pc-windows-gnu' && matrix.channel == 'nightly'
       shell: bash
 
-    - name: build
-      run: |
-        rustc -Vv
-        cargo -V
-        cargo build
-      shell: cmd
-
-    - name: test
-      run: cargo test
+    - name: Build and Test
       shell: cmd
+      run: ci\build_and_test.bat
diff --git a/src/tools/rustfmt/CHANGELOG.md b/src/tools/rustfmt/CHANGELOG.md
index bfc155cd656..0c1893bf8c3 100644
--- a/src/tools/rustfmt/CHANGELOG.md
+++ b/src/tools/rustfmt/CHANGELOG.md
@@ -2,7 +2,29 @@
 
 ## [Unreleased]
 
-## [1.5.0] 2022-06-13
+## [1.5.1] 2022-06-24
+
+**N.B** A bug was introduced in v1.5.0/nightly-2022-06-15 which modified formatting. If you happened to run rustfmt over your code with one of those ~10 nightlies it's possible you may have seen formatting changes, and you may see additional changes after this fix since that bug has now been reverted.
+
+### Fixed
+
+- Correct an issue introduced in v1.5.0 where formatting changes were unintentionally introduced in a few cases with a large/long construct in a right hand side position (e.g. a large chain on the RHS of a local/assignment statement)
+- `cargo fmt --version` properly displays the version value again [#5395](https://github.com/rust-lang/rustfmt/issues/5395)
+
+### Changed
+
+- Properly sort imports containing raw identifiers [#3791](https://github.com/rust-lang/rustfmt/issues/3791) (note this is change version gated, and not applied by default)
+
+### Added
+
+- Add new configuration option, `doc_comment_code_block_width`, which allows for setting a shorter width limit to use for formatting code snippets in doc comments [#5384](https://github.com/rust-lang/rustfmt/issues/5384)
+
+### Install/Download Options
+- **rustup (nightly)** - nightly-2022-06-24
+- **GitHub Release Binaries** - [Release v1.5.1](https://github.com/rust-lang/rustfmt/releases/tag/v1.5.0)
+- **Build from source** - [Tag v1.5.1](https://github.com/rust-lang/rustfmt/tree/v1.5.1), see instructions for how to [install rustfmt from source][install-from-source]
+
+## [1.5.0] 2022-06-14
 
 ### Changed
 
@@ -75,7 +97,7 @@
 - Improved performance when formatting large and deeply nested expression trees, often found in generated code, which have many expressions that exceed `max_width` [#5128](https://github.com/rust-lang/rustfmt/issues/5128), [#4867](https://github.com/rust-lang/rustfmt/issues/4867), [#4476](https://github.com/rust-lang/rustfmt/issues/4476), [#5139](https://github.com/rust-lang/rustfmt/pull/5139)
 
 ### Install/Download Options
-- **rustup (nightly)** - *pending*
+- **rustup (nightly)** - nightly-2022-06-15
 - **GitHub Release Binaries** - [Release v1.5.0](https://github.com/rust-lang/rustfmt/releases/tag/v1.5.0)
 - **Build from source** - [Tag v1.5.0](https://github.com/rust-lang/rustfmt/tree/v1.5.0), see instructions for how to [install rustfmt from source][install-from-source]
 
diff --git a/src/tools/rustfmt/Cargo.lock b/src/tools/rustfmt/Cargo.lock
index 639d35886dc..311df226da1 100644
--- a/src/tools/rustfmt/Cargo.lock
+++ b/src/tools/rustfmt/Cargo.lock
@@ -485,7 +485,7 @@ dependencies = [
 
 [[package]]
 name = "rustfmt-nightly"
-version = "1.5.0"
+version = "1.5.1"
 dependencies = [
  "annotate-snippets",
  "anyhow",
diff --git a/src/tools/rustfmt/Cargo.toml b/src/tools/rustfmt/Cargo.toml
index f26e9824062..7a4e02d69ed 100644
--- a/src/tools/rustfmt/Cargo.toml
+++ b/src/tools/rustfmt/Cargo.toml
@@ -1,7 +1,7 @@
 [package]
 
 name = "rustfmt-nightly"
-version = "1.5.0"
+version = "1.5.1"
 description = "Tool to find and fix Rust formatting issues"
 repository = "https://github.com/rust-lang/rustfmt"
 readme = "README.md"
@@ -65,3 +65,7 @@ rustfmt-config_proc_macro = { version = "0.2", path = "config_proc_macro" }
 rustc-workspace-hack = "1.0.0"
 
 # Rustc dependencies are loaded from the sysroot, Cargo doesn't know about them.
+
+[package.metadata.rust-analyzer]
+# This package uses #[feature(rustc_private)]
+rustc_private = true
diff --git a/src/tools/rustfmt/Configurations.md b/src/tools/rustfmt/Configurations.md
index 8c84614352c..8b96b9d3689 100644
--- a/src/tools/rustfmt/Configurations.md
+++ b/src/tools/rustfmt/Configurations.md
@@ -926,6 +926,14 @@ fn add_one(x: i32) -> i32 {
 }
 ```
 
+## `doc_comment_code_block_width`
+
+Max width for code snippets included in doc comments. Only used if [`format_code_in_doc_comments`](#format_code_in_doc_comments) is true.
+
+- **Default value**: `100`
+- **Possible values**: any positive integer that is less than or equal to the value specified for [`max_width`](#max_width)
+- **Stable**: No (tracking issue: [#5359](https://github.com/rust-lang/rustfmt/issues/5359))
+
 ## `format_generated_files`
 
 Format generated files. A file is considered generated
diff --git a/src/tools/rustfmt/ci/build_and_test.bat b/src/tools/rustfmt/ci/build_and_test.bat
new file mode 100755
index 00000000000..ef41017783f
--- /dev/null
+++ b/src/tools/rustfmt/ci/build_and_test.bat
@@ -0,0 +1,14 @@
+set "RUSTFLAGS=-D warnings"
+
+:: Print version information
+rustc -Vv || exit /b 1
+cargo -V || exit /b 1
+
+:: Build and test main crate
+cargo build --locked || exit /b 1
+cargo test || exit /b 1
+
+:: Build and test other crates
+cd config_proc_macro || exit /b 1
+cargo build --locked || exit /b 1
+cargo test || exit /b 1
diff --git a/src/tools/rustfmt/ci/build_and_test.sh b/src/tools/rustfmt/ci/build_and_test.sh
new file mode 100755
index 00000000000..8fa0f67b0d0
--- /dev/null
+++ b/src/tools/rustfmt/ci/build_and_test.sh
@@ -0,0 +1,18 @@
+#!/bin/bash
+
+set -euo pipefail
+
+export RUSTFLAGS="-D warnings"
+
+# Print version information
+rustc -Vv
+cargo -V
+
+# Build and test main crate
+cargo build --locked
+cargo test
+
+# Build and test other crates
+cd config_proc_macro
+cargo build --locked
+cargo test
diff --git a/src/tools/rustfmt/ci/integration.sh b/src/tools/rustfmt/ci/integration.sh
index 0269e3ee4af..562d5d70c70 100755
--- a/src/tools/rustfmt/ci/integration.sh
+++ b/src/tools/rustfmt/ci/integration.sh
@@ -15,7 +15,7 @@ set -ex
 # it again.
 #
 #which cargo-fmt || cargo install --force
-CFG_RELEASE=nightly CFG_RELEASE_CHANNEL=nightly cargo install --path . --force
+CFG_RELEASE=nightly CFG_RELEASE_CHANNEL=nightly cargo install --path . --force --locked
 
 echo "Integration tests for: ${INTEGRATION}"
 cargo fmt -- --version
diff --git a/src/tools/rustfmt/config_proc_macro/Cargo.lock b/src/tools/rustfmt/config_proc_macro/Cargo.lock
index abcf9654e5d..ecf561f28fb 100644
--- a/src/tools/rustfmt/config_proc_macro/Cargo.lock
+++ b/src/tools/rustfmt/config_proc_macro/Cargo.lock
@@ -1,68 +1,68 @@
 # This file is automatically @generated by Cargo.
 # It is not intended for manual editing.
+version = 3
+
 [[package]]
 name = "proc-macro2"
 version = "1.0.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "e98a83a9f9b331f54b924e68a66acb1bb35cb01fb0a23645139967abefb697e8"
 dependencies = [
- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "unicode-xid",
 ]
 
 [[package]]
 name = "quote"
 version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
 dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2",
 ]
 
 [[package]]
 name = "rustfmt-config_proc_macro"
-version = "0.1.2"
+version = "0.2.0"
 dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2",
+ "quote",
+ "serde",
+ "syn",
 ]
 
 [[package]]
 name = "serde"
 version = "1.0.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "fec2851eb56d010dc9a21b89ca53ee75e6528bab60c11e89d38390904982da9f"
 dependencies = [
- "serde_derive 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)",
+ "serde_derive",
 ]
 
 [[package]]
 name = "serde_derive"
 version = "1.0.99"
 source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cb4dc18c61206b08dc98216c98faa0232f4337e1e1b8574551d5bad29ea1b425"
 dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2",
+ "quote",
+ "syn",
 ]
 
 [[package]]
 name = "syn"
 version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
 dependencies = [
- "proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)",
- "quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
+ "proc-macro2",
+ "quote",
+ "unicode-xid",
 ]
 
 [[package]]
 name = "unicode-xid"
 version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-
-[metadata]
-"checksum proc-macro2 1.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e98a83a9f9b331f54b924e68a66acb1bb35cb01fb0a23645139967abefb697e8"
-"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
-"checksum serde 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)" = "fec2851eb56d010dc9a21b89ca53ee75e6528bab60c11e89d38390904982da9f"
-"checksum serde_derive 1.0.99 (registry+https://github.com/rust-lang/crates.io-index)" = "cb4dc18c61206b08dc98216c98faa0232f4337e1e1b8574551d5bad29ea1b425"
-"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf"
-"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
+checksum = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c"
diff --git a/src/tools/rustfmt/config_proc_macro/src/lib.rs b/src/tools/rustfmt/config_proc_macro/src/lib.rs
index 51301821319..e772c53f423 100644
--- a/src/tools/rustfmt/config_proc_macro/src/lib.rs
+++ b/src/tools/rustfmt/config_proc_macro/src/lib.rs
@@ -29,6 +29,8 @@ pub fn config_type(_args: TokenStream, input: TokenStream) -> TokenStream {
 /// Used to conditionally output the TokenStream for tests that need to be run on nightly only.
 ///
 /// ```rust
+/// # use rustfmt_config_proc_macro::nightly_only_test;
+///
 /// #[nightly_only_test]
 /// #[test]
 /// fn test_needs_nightly_rustfmt() {
@@ -49,6 +51,8 @@ pub fn nightly_only_test(_args: TokenStream, input: TokenStream) -> TokenStream
 /// Used to conditionally output the TokenStream for tests that need to be run on stable only.
 ///
 /// ```rust
+/// # use rustfmt_config_proc_macro::stable_only_test;
+///
 /// #[stable_only_test]
 /// #[test]
 /// fn test_needs_stable_rustfmt() {
diff --git a/src/tools/rustfmt/rust-toolchain b/src/tools/rustfmt/rust-toolchain
index 813e5e2c10f..2640a9e0ecc 100644
--- a/src/tools/rustfmt/rust-toolchain
+++ b/src/tools/rustfmt/rust-toolchain
@@ -1,3 +1,3 @@
 [toolchain]
-channel = "nightly-2022-06-06"
+channel = "nightly-2022-06-21"
 components = ["rustc-dev"]
diff --git a/src/tools/rustfmt/src/cargo-fmt/main.rs b/src/tools/rustfmt/src/cargo-fmt/main.rs
index 55fd75f6de9..9031d29b45f 100644
--- a/src/tools/rustfmt/src/cargo-fmt/main.rs
+++ b/src/tools/rustfmt/src/cargo-fmt/main.rs
@@ -14,7 +14,7 @@ use std::path::{Path, PathBuf};
 use std::process::Command;
 use std::str;
 
-use clap::{CommandFactory, Parser};
+use clap::{AppSettings, CommandFactory, Parser};
 
 #[path = "test/mod.rs"]
 #[cfg(test)]
@@ -22,6 +22,7 @@ mod cargo_fmt_tests;
 
 #[derive(Parser)]
 #[clap(
+    global_setting(AppSettings::NoAutoVersion),
     bin_name = "cargo fmt",
     about = "This utility formats all bin and lib files of \
              the current crate using rustfmt."
diff --git a/src/tools/rustfmt/src/comment.rs b/src/tools/rustfmt/src/comment.rs
index eb195b1f762..4d565afc1e0 100644
--- a/src/tools/rustfmt/src/comment.rs
+++ b/src/tools/rustfmt/src/comment.rs
@@ -730,6 +730,10 @@ impl<'a> CommentRewrite<'a> {
                     {
                         let mut config = self.fmt.config.clone();
                         config.set().wrap_comments(false);
+                        let comment_max_width = config
+                            .doc_comment_code_block_width()
+                            .min(config.max_width());
+                        config.set().max_width(comment_max_width);
                         if let Some(s) =
                             crate::format_code_block(&self.code_block_buffer, &config, false)
                         {
diff --git a/src/tools/rustfmt/src/config/mod.rs b/src/tools/rustfmt/src/config/mod.rs
index a5169528187..f49c18d3a46 100644
--- a/src/tools/rustfmt/src/config/mod.rs
+++ b/src/tools/rustfmt/src/config/mod.rs
@@ -57,6 +57,8 @@ create_config! {
     // Comments. macros, and strings
     wrap_comments: bool, false, false, "Break comments to fit on the line";
     format_code_in_doc_comments: bool, false, false, "Format the code snippet in doc comments.";
+    doc_comment_code_block_width: usize, 100, false, "Maximum width for code snippets in doc \
+        comments. No effect unless format_code_in_doc_comments = true";
     comment_width: usize, 80, false,
         "Maximum length of comments. No effect unless wrap_comments = true";
     normalize_comments: bool, false, false, "Convert /* */ comments to // comments where possible";
@@ -532,6 +534,7 @@ chain_width = 60
 single_line_if_else_max_width = 50
 wrap_comments = false
 format_code_in_doc_comments = false
+doc_comment_code_block_width = 100
 comment_width = 80
 normalize_comments = false
 normalize_doc_attributes = false
diff --git a/src/tools/rustfmt/src/expr.rs b/src/tools/rustfmt/src/expr.rs
index 4ccf1ca70c9..e4cc93026f1 100644
--- a/src/tools/rustfmt/src/expr.rs
+++ b/src/tools/rustfmt/src/expr.rs
@@ -1,6 +1,5 @@
 use std::borrow::Cow;
 use std::cmp::min;
-use std::collections::HashMap;
 
 use itertools::Itertools;
 use rustc_ast::token::{Delimiter, LitKind};
@@ -23,7 +22,7 @@ use crate::macros::{rewrite_macro, MacroPosition};
 use crate::matches::rewrite_match;
 use crate::overflow::{self, IntoOverflowableItem, OverflowableItem};
 use crate::pairs::{rewrite_all_pairs, rewrite_pair, PairParts};
-use crate::rewrite::{QueryId, Rewrite, RewriteContext};
+use crate::rewrite::{Rewrite, RewriteContext};
 use crate::shape::{Indent, Shape};
 use crate::source_map::{LineRangeUtils, SpanUtils};
 use crate::spanned::Spanned;
@@ -55,54 +54,6 @@ pub(crate) fn format_expr(
     context: &RewriteContext<'_>,
     shape: Shape,
 ) -> Option<String> {
-    // when max_width is tight, we should check all possible formattings, in order to find
-    // if we can fit expression in the limit. Doing it recursively takes exponential time
-    // relative to input size, and people hit it with rustfmt takes minutes in #4476 #4867 #5128
-    // By memoization of format_expr function, we format each pair of expression and shape
-    // only once, so worst case execution time becomes O(n*max_width^3).
-    if context.inside_macro() || context.is_macro_def {
-        // span ids are not unique in macros, so we don't memoize result of them.
-        return format_expr_inner(expr, expr_type, context, shape);
-    }
-    let clean;
-    let query_id = QueryId {
-        shape,
-        span: expr.span,
-    };
-    if let Some(map) = context.memoize.take() {
-        if let Some(r) = map.get(&query_id) {
-            let r = r.clone();
-            context.memoize.set(Some(map)); // restore map in the memoize cell for other users
-            return r;
-        }
-        context.memoize.set(Some(map));
-        clean = false;
-    } else {
-        context.memoize.set(Some(HashMap::default()));
-        clean = true; // We got None, so we are the top level called function. When
-        // this function finishes, no one is interested in what is in the map, because
-        // all of them are sub expressions of this top level expression, and this is
-        // done. So we should clean up memoize map to save some memory.
-    }
-
-    let r = format_expr_inner(expr, expr_type, context, shape);
-    if clean {
-        context.memoize.set(None);
-    } else {
-        if let Some(mut map) = context.memoize.take() {
-            map.insert(query_id, r.clone()); // insert the result in the memoize map
-            context.memoize.set(Some(map)); // so it won't be computed again
-        }
-    }
-    r
-}
-
-fn format_expr_inner(
-    expr: &ast::Expr,
-    expr_type: ExprType,
-    context: &RewriteContext<'_>,
-    shape: Shape,
-) -> Option<String> {
     skip_out_of_file_lines_range!(context, expr.span);
 
     if contains_skip(&*expr.attrs) {
diff --git a/src/tools/rustfmt/src/formatting.rs b/src/tools/rustfmt/src/formatting.rs
index e644ea50eff..1dfd8a514f0 100644
--- a/src/tools/rustfmt/src/formatting.rs
+++ b/src/tools/rustfmt/src/formatting.rs
@@ -2,7 +2,6 @@
 
 use std::collections::HashMap;
 use std::io::{self, Write};
-use std::rc::Rc;
 use std::time::{Duration, Instant};
 
 use rustc_ast::ast;
@@ -203,7 +202,6 @@ impl<'a, T: FormatHandler + 'a> FormatContext<'a, T> {
             self.config,
             &snippet_provider,
             self.report.clone(),
-            Rc::default(),
         );
         visitor.skip_context.update_with_attrs(&self.krate.attrs);
         visitor.is_macro_def = is_macro_def;
diff --git a/src/tools/rustfmt/src/imports.rs b/src/tools/rustfmt/src/imports.rs
index 559ed3917db..8d41c881589 100644
--- a/src/tools/rustfmt/src/imports.rs
+++ b/src/tools/rustfmt/src/imports.rs
@@ -15,7 +15,7 @@ use rustc_span::{
 use crate::comment::combine_strs_with_missing_comments;
 use crate::config::lists::*;
 use crate::config::ImportGranularity;
-use crate::config::{Edition, IndentStyle};
+use crate::config::{Edition, IndentStyle, Version};
 use crate::lists::{
     definitive_tactic, itemize_list, write_list, ListFormatting, ListItem, Separator,
 };
@@ -92,7 +92,7 @@ impl<'a> FmtVisitor<'a> {
 
 // FIXME we do a lot of allocation to make our own representation.
 #[derive(Clone, Eq, Hash, PartialEq)]
-pub(crate) enum UseSegment {
+pub(crate) enum UseSegmentKind {
     Ident(String, Option<String>),
     Slf(Option<String>),
     Super(Option<String>),
@@ -101,6 +101,12 @@ pub(crate) enum UseSegment {
     List(Vec<UseTree>),
 }
 
+#[derive(Clone, Eq, PartialEq)]
+pub(crate) struct UseSegment {
+    pub(crate) kind: UseSegmentKind,
+    pub(crate) version: Version,
+}
+
 #[derive(Clone)]
 pub(crate) struct UseTree {
     pub(crate) path: Vec<UseSegment>,
@@ -134,34 +140,38 @@ impl Spanned for UseTree {
 impl UseSegment {
     // Clone a version of self with any top-level alias removed.
     fn remove_alias(&self) -> UseSegment {
-        match *self {
-            UseSegment::Ident(ref s, _) => UseSegment::Ident(s.clone(), None),
-            UseSegment::Slf(_) => UseSegment::Slf(None),
-            UseSegment::Super(_) => UseSegment::Super(None),
-            UseSegment::Crate(_) => UseSegment::Crate(None),
-            _ => self.clone(),
+        let kind = match self.kind {
+            UseSegmentKind::Ident(ref s, _) => UseSegmentKind::Ident(s.clone(), None),
+            UseSegmentKind::Slf(_) => UseSegmentKind::Slf(None),
+            UseSegmentKind::Super(_) => UseSegmentKind::Super(None),
+            UseSegmentKind::Crate(_) => UseSegmentKind::Crate(None),
+            _ => return self.clone(),
+        };
+        UseSegment {
+            kind,
+            version: self.version,
         }
     }
 
     // Check if self == other with their aliases removed.
     fn equal_except_alias(&self, other: &Self) -> bool {
-        match (self, other) {
-            (UseSegment::Ident(ref s1, _), UseSegment::Ident(ref s2, _)) => s1 == s2,
-            (UseSegment::Slf(_), UseSegment::Slf(_))
-            | (UseSegment::Super(_), UseSegment::Super(_))
-            | (UseSegment::Crate(_), UseSegment::Crate(_))
-            | (UseSegment::Glob, UseSegment::Glob) => true,
-            (UseSegment::List(ref list1), UseSegment::List(ref list2)) => list1 == list2,
+        match (&self.kind, &other.kind) {
+            (UseSegmentKind::Ident(ref s1, _), UseSegmentKind::Ident(ref s2, _)) => s1 == s2,
+            (UseSegmentKind::Slf(_), UseSegmentKind::Slf(_))
+            | (UseSegmentKind::Super(_), UseSegmentKind::Super(_))
+            | (UseSegmentKind::Crate(_), UseSegmentKind::Crate(_))
+            | (UseSegmentKind::Glob, UseSegmentKind::Glob) => true,
+            (UseSegmentKind::List(ref list1), UseSegmentKind::List(ref list2)) => list1 == list2,
             _ => false,
         }
     }
 
     fn get_alias(&self) -> Option<&str> {
-        match self {
-            UseSegment::Ident(_, a)
-            | UseSegment::Slf(a)
-            | UseSegment::Super(a)
-            | UseSegment::Crate(a) => a.as_deref(),
+        match &self.kind {
+            UseSegmentKind::Ident(_, a)
+            | UseSegmentKind::Slf(a)
+            | UseSegmentKind::Super(a)
+            | UseSegmentKind::Crate(a) => a.as_deref(),
             _ => None,
         }
     }
@@ -175,19 +185,24 @@ impl UseSegment {
         if name.is_empty() || name == "{{root}}" {
             return None;
         }
-        Some(match name {
-            "self" => UseSegment::Slf(None),
-            "super" => UseSegment::Super(None),
-            "crate" => UseSegment::Crate(None),
+        let kind = match name {
+            "self" => UseSegmentKind::Slf(None),
+            "super" => UseSegmentKind::Super(None),
+            "crate" => UseSegmentKind::Crate(None),
             _ => {
                 let mod_sep = if modsep { "::" } else { "" };
-                UseSegment::Ident(format!("{}{}", mod_sep, name), None)
+                UseSegmentKind::Ident(format!("{}{}", mod_sep, name), None)
             }
+        };
+
+        Some(UseSegment {
+            kind,
+            version: context.config.version(),
         })
     }
 
     fn contains_comment(&self) -> bool {
-        if let UseSegment::List(list) = self {
+        if let UseSegmentKind::List(list) = &self.kind {
             list.iter().any(|subtree| subtree.contains_comment())
         } else {
             false
@@ -254,20 +269,38 @@ impl fmt::Debug for UseTree {
 
 impl fmt::Debug for UseSegment {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
-        fmt::Display::fmt(self, f)
+        fmt::Display::fmt(&self.kind, f)
     }
 }
 
 impl fmt::Display for UseSegment {
     fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        fmt::Display::fmt(&self.kind, f)
+    }
+}
+
+impl Hash for UseSegment {
+    fn hash<H: Hasher>(&self, state: &mut H) {
+        self.kind.hash(state);
+    }
+}
+
+impl fmt::Debug for UseSegmentKind {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
+        fmt::Display::fmt(self, f)
+    }
+}
+
+impl fmt::Display for UseSegmentKind {
+    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
         match *self {
-            UseSegment::Glob => write!(f, "*"),
-            UseSegment::Ident(ref s, Some(ref alias)) => write!(f, "{} as {}", s, alias),
-            UseSegment::Ident(ref s, None) => write!(f, "{}", s),
-            UseSegment::Slf(..) => write!(f, "self"),
-            UseSegment::Super(..) => write!(f, "super"),
-            UseSegment::Crate(..) => write!(f, "crate"),
-            UseSegment::List(ref list) => {
+            UseSegmentKind::Glob => write!(f, "*"),
+            UseSegmentKind::Ident(ref s, Some(ref alias)) => write!(f, "{} as {}", s, alias),
+            UseSegmentKind::Ident(ref s, None) => write!(f, "{}", s),
+            UseSegmentKind::Slf(..) => write!(f, "self"),
+            UseSegmentKind::Super(..) => write!(f, "super"),
+            UseSegmentKind::Crate(..) => write!(f, "crate"),
+            UseSegmentKind::List(ref list) => {
                 write!(f, "{{")?;
                 for (i, item) in list.iter().enumerate() {
                     if i != 0 {
@@ -411,13 +444,19 @@ impl UseTree {
             }
         }
 
+        let version = context.config.version();
+
         match a.kind {
             UseTreeKind::Glob => {
                 // in case of a global path and the glob starts at the root, e.g., "::*"
                 if a.prefix.segments.len() == 1 && leading_modsep {
-                    result.path.push(UseSegment::Ident("".to_owned(), None));
+                    let kind = UseSegmentKind::Ident("".to_owned(), None);
+                    result.path.push(UseSegment { kind, version });
                 }
-                result.path.push(UseSegment::Glob);
+                result.path.push(UseSegment {
+                    kind: UseSegmentKind::Glob,
+                    version,
+                });
             }
             UseTreeKind::Nested(ref list) => {
                 // Extract comments between nested use items.
@@ -438,16 +477,18 @@ impl UseTree {
                 // in case of a global path and the nested list starts at the root,
                 // e.g., "::{foo, bar}"
                 if a.prefix.segments.len() == 1 && leading_modsep {
-                    result.path.push(UseSegment::Ident("".to_owned(), None));
+                    let kind = UseSegmentKind::Ident("".to_owned(), None);
+                    result.path.push(UseSegment { kind, version });
                 }
-                result.path.push(UseSegment::List(
+                let kind = UseSegmentKind::List(
                     list.iter()
                         .zip(items)
                         .map(|(t, list_item)| {
                             Self::from_ast(context, &t.0, Some(list_item), None, None, None)
                         })
                         .collect(),
-                ));
+                );
+                result.path.push(UseSegment { kind, version });
             }
             UseTreeKind::Simple(ref rename, ..) => {
                 // If the path has leading double colons and is composed of only 2 segments, then we
@@ -469,13 +510,15 @@ impl UseTree {
                         Some(rewrite_ident(context, ident).to_owned())
                     }
                 });
-                let segment = match name.as_ref() {
-                    "self" => UseSegment::Slf(alias),
-                    "super" => UseSegment::Super(alias),
-                    "crate" => UseSegment::Crate(alias),
-                    _ => UseSegment::Ident(name, alias),
+                let kind = match name.as_ref() {
+                    "self" => UseSegmentKind::Slf(alias),
+                    "super" => UseSegmentKind::Super(alias),
+                    "crate" => UseSegmentKind::Crate(alias),
+                    _ => UseSegmentKind::Ident(name, alias),
                 };
 
+                let segment = UseSegment { kind, version };
+
                 // `name` is already in result.
                 result.path.pop();
                 result.path.push(segment);
@@ -492,13 +535,13 @@ impl UseTree {
         let mut aliased_self = false;
 
         // Remove foo::{} or self without attributes.
-        match last {
+        match last.kind {
             _ if self.attrs.is_some() => (),
-            UseSegment::List(ref list) if list.is_empty() => {
+            UseSegmentKind::List(ref list) if list.is_empty() => {
                 self.path = vec![];
                 return self;
             }
-            UseSegment::Slf(None) if self.path.is_empty() && self.visibility.is_some() => {
+            UseSegmentKind::Slf(None) if self.path.is_empty() && self.visibility.is_some() => {
                 self.path = vec![];
                 return self;
             }
@@ -506,15 +549,19 @@ impl UseTree {
         }
 
         // Normalise foo::self -> foo.
-        if let UseSegment::Slf(None) = last {
+        if let UseSegmentKind::Slf(None) = last.kind {
             if !self.path.is_empty() {
                 return self;
             }
         }
 
         // Normalise foo::self as bar -> foo as bar.
-        if let UseSegment::Slf(_) = last {
-            if let Some(UseSegment::Ident(_, None)) = self.path.last() {
+        if let UseSegmentKind::Slf(_) = last.kind {
+            if let Some(UseSegment {
+                kind: UseSegmentKind::Ident(_, None),
+                ..
+            }) = self.path.last()
+            {
                 aliased_self = true;
             }
         }
@@ -522,9 +569,12 @@ impl UseTree {
         let mut done = false;
         if aliased_self {
             match self.path.last_mut() {
-                Some(UseSegment::Ident(_, ref mut old_rename)) => {
+                Some(UseSegment {
+                    kind: UseSegmentKind::Ident(_, ref mut old_rename),
+                    ..
+                }) => {
                     assert!(old_rename.is_none());
-                    if let UseSegment::Slf(Some(rename)) = last.clone() {
+                    if let UseSegmentKind::Slf(Some(rename)) = last.clone().kind {
                         *old_rename = Some(rename);
                         done = true;
                     }
@@ -538,15 +588,15 @@ impl UseTree {
         }
 
         // Normalise foo::{bar} -> foo::bar
-        if let UseSegment::List(ref list) = last {
+        if let UseSegmentKind::List(ref list) = last.kind {
             if list.len() == 1 && list[0].to_string() != "self" {
                 normalize_sole_list = true;
             }
         }
 
         if normalize_sole_list {
-            match last {
-                UseSegment::List(list) => {
+            match last.kind {
+                UseSegmentKind::List(list) => {
                     for seg in &list[0].path {
                         self.path.push(seg.clone());
                     }
@@ -557,10 +607,13 @@ impl UseTree {
         }
 
         // Recursively normalize elements of a list use (including sorting the list).
-        if let UseSegment::List(list) = last {
+        if let UseSegmentKind::List(list) = last.kind {
             let mut list = list.into_iter().map(UseTree::normalize).collect::<Vec<_>>();
             list.sort();
-            last = UseSegment::List(list);
+            last = UseSegment {
+                kind: UseSegmentKind::List(list),
+                version: last.version,
+            };
         }
 
         self.path.push(last);
@@ -620,10 +673,10 @@ impl UseTree {
         if self.path.is_empty() || self.contains_comment() {
             return vec![self];
         }
-        match self.path.clone().last().unwrap() {
-            UseSegment::List(list) => {
+        match &self.path.clone().last().unwrap().kind {
+            UseSegmentKind::List(list) => {
                 if list.len() == 1 && list[0].path.len() == 1 {
-                    if let UseSegment::Slf(..) = list[0].path[0] {
+                    if let UseSegmentKind::Slf(..) = list[0].path[0].kind {
                         return vec![self];
                     };
                 }
@@ -671,12 +724,15 @@ impl UseTree {
 
     /// If this tree ends in `::self`, rewrite it to `::{self}`.
     fn nest_trailing_self(mut self) -> UseTree {
-        if let Some(UseSegment::Slf(..)) = self.path.last() {
+        if let Some(UseSegment {
+            kind: UseSegmentKind::Slf(..),
+            ..
+        }) = self.path.last()
+        {
             let self_segment = self.path.pop().unwrap();
-            self.path.push(UseSegment::List(vec![UseTree::from_path(
-                vec![self_segment],
-                DUMMY_SP,
-            )]));
+            let version = self_segment.version;
+            let kind = UseSegmentKind::List(vec![UseTree::from_path(vec![self_segment], DUMMY_SP)]);
+            self.path.push(UseSegment { kind, version });
         }
         self
     }
@@ -692,7 +748,8 @@ fn merge_rest(
         return None;
     }
     if a.len() != len && b.len() != len {
-        if let UseSegment::List(ref list) = a[len] {
+        let version = a[len].version;
+        if let UseSegmentKind::List(ref list) = a[len].kind {
             let mut list = list.clone();
             merge_use_trees_inner(
                 &mut list,
@@ -700,7 +757,8 @@ fn merge_rest(
                 merge_by,
             );
             let mut new_path = b[..len].to_vec();
-            new_path.push(UseSegment::List(list));
+            let kind = UseSegmentKind::List(list);
+            new_path.push(UseSegment { kind, version });
             return Some(new_path);
         }
     } else if len == 1 {
@@ -709,15 +767,28 @@ fn merge_rest(
         } else {
             (&b[0], &a[1..])
         };
+        let kind = UseSegmentKind::Slf(common.get_alias().map(ToString::to_string));
+        let version = a[0].version;
         let mut list = vec![UseTree::from_path(
-            vec![UseSegment::Slf(common.get_alias().map(ToString::to_string))],
+            vec![UseSegment { kind, version }],
             DUMMY_SP,
         )];
         match rest {
-            [UseSegment::List(rest_list)] => list.extend(rest_list.clone()),
+            [
+                UseSegment {
+                    kind: UseSegmentKind::List(rest_list),
+                    ..
+                },
+            ] => list.extend(rest_list.clone()),
             _ => list.push(UseTree::from_path(rest.to_vec(), DUMMY_SP)),
         }
-        return Some(vec![b[0].clone(), UseSegment::List(list)]);
+        return Some(vec![
+            b[0].clone(),
+            UseSegment {
+                kind: UseSegmentKind::List(list),
+                version,
+            },
+        ]);
     } else {
         len -= 1;
     }
@@ -727,7 +798,9 @@ fn merge_rest(
     ];
     list.sort();
     let mut new_path = b[..len].to_vec();
-    new_path.push(UseSegment::List(list));
+    let kind = UseSegmentKind::List(list);
+    let version = a[0].version;
+    new_path.push(UseSegment { kind, version });
     Some(new_path)
 }
 
@@ -805,19 +878,33 @@ impl PartialOrd for UseTree {
 }
 impl Ord for UseSegment {
     fn cmp(&self, other: &UseSegment) -> Ordering {
-        use self::UseSegment::*;
+        use self::UseSegmentKind::*;
 
         fn is_upper_snake_case(s: &str) -> bool {
             s.chars()
                 .all(|c| c.is_uppercase() || c == '_' || c.is_numeric())
         }
 
-        match (self, other) {
-            (&Slf(ref a), &Slf(ref b))
-            | (&Super(ref a), &Super(ref b))
-            | (&Crate(ref a), &Crate(ref b)) => a.cmp(b),
-            (&Glob, &Glob) => Ordering::Equal,
-            (&Ident(ref ia, ref aa), &Ident(ref ib, ref ab)) => {
+        match (&self.kind, &other.kind) {
+            (Slf(ref a), Slf(ref b))
+            | (Super(ref a), Super(ref b))
+            | (Crate(ref a), Crate(ref b)) => match (a, b) {
+                (Some(sa), Some(sb)) => {
+                    if self.version == Version::Two {
+                        sa.trim_start_matches("r#").cmp(sb.trim_start_matches("r#"))
+                    } else {
+                        a.cmp(b)
+                    }
+                }
+                (_, _) => a.cmp(b),
+            },
+            (Glob, Glob) => Ordering::Equal,
+            (Ident(ref pia, ref aa), Ident(ref pib, ref ab)) => {
+                let (ia, ib) = if self.version == Version::Two {
+                    (pia.trim_start_matches("r#"), pib.trim_start_matches("r#"))
+                } else {
+                    (pia.as_str(), pib.as_str())
+                };
                 // snake_case < CamelCase < UPPER_SNAKE_CASE
                 if ia.starts_with(char::is_uppercase) && ib.starts_with(char::is_lowercase) {
                     return Ordering::Greater;
@@ -835,15 +922,21 @@ impl Ord for UseSegment {
                 if ident_ord != Ordering::Equal {
                     return ident_ord;
                 }
-                if aa.is_none() && ab.is_some() {
-                    return Ordering::Less;
-                }
-                if aa.is_some() && ab.is_none() {
-                    return Ordering::Greater;
+                match (aa, ab) {
+                    (None, Some(_)) => Ordering::Less,
+                    (Some(_), None) => Ordering::Greater,
+                    (Some(aas), Some(abs)) => {
+                        if self.version == Version::Two {
+                            aas.trim_start_matches("r#")
+                                .cmp(abs.trim_start_matches("r#"))
+                        } else {
+                            aas.cmp(abs)
+                        }
+                    }
+                    (None, None) => Ordering::Equal,
                 }
-                aa.cmp(ab)
             }
-            (&List(ref a), &List(ref b)) => {
+            (List(ref a), List(ref b)) => {
                 for (a, b) in a.iter().zip(b.iter()) {
                     let ord = a.cmp(b);
                     if ord != Ordering::Equal {
@@ -853,16 +946,16 @@ impl Ord for UseSegment {
 
                 a.len().cmp(&b.len())
             }
-            (&Slf(_), _) => Ordering::Less,
-            (_, &Slf(_)) => Ordering::Greater,
-            (&Super(_), _) => Ordering::Less,
-            (_, &Super(_)) => Ordering::Greater,
-            (&Crate(_), _) => Ordering::Less,
-            (_, &Crate(_)) => Ordering::Greater,
-            (&Ident(..), _) => Ordering::Less,
-            (_, &Ident(..)) => Ordering::Greater,
-            (&Glob, _) => Ordering::Less,
-            (_, &Glob) => Ordering::Greater,
+            (Slf(_), _) => Ordering::Less,
+            (_, Slf(_)) => Ordering::Greater,
+            (Super(_), _) => Ordering::Less,
+            (_, Super(_)) => Ordering::Greater,
+            (Crate(_), _) => Ordering::Less,
+            (_, Crate(_)) => Ordering::Greater,
+            (Ident(..), _) => Ordering::Less,
+            (_, Ident(..)) => Ordering::Greater,
+            (Glob, _) => Ordering::Less,
+            (_, Glob) => Ordering::Greater,
         }
     }
 }
@@ -906,7 +999,7 @@ fn rewrite_nested_use_tree(
     }
     let has_nested_list = use_tree_list.iter().any(|use_segment| {
         use_segment.path.last().map_or(false, |last_segment| {
-            matches!(last_segment, UseSegment::List(..))
+            matches!(last_segment.kind, UseSegmentKind::List(..))
         })
     });
 
@@ -957,17 +1050,19 @@ fn rewrite_nested_use_tree(
 
 impl Rewrite for UseSegment {
     fn rewrite(&self, context: &RewriteContext<'_>, shape: Shape) -> Option<String> {
-        Some(match self {
-            UseSegment::Ident(ref ident, Some(ref rename)) => format!("{} as {}", ident, rename),
-            UseSegment::Ident(ref ident, None) => ident.clone(),
-            UseSegment::Slf(Some(ref rename)) => format!("self as {}", rename),
-            UseSegment::Slf(None) => "self".to_owned(),
-            UseSegment::Super(Some(ref rename)) => format!("super as {}", rename),
-            UseSegment::Super(None) => "super".to_owned(),
-            UseSegment::Crate(Some(ref rename)) => format!("crate as {}", rename),
-            UseSegment::Crate(None) => "crate".to_owned(),
-            UseSegment::Glob => "*".to_owned(),
-            UseSegment::List(ref use_tree_list) => rewrite_nested_use_tree(
+        Some(match self.kind {
+            UseSegmentKind::Ident(ref ident, Some(ref rename)) => {
+                format!("{} as {}", ident, rename)
+            }
+            UseSegmentKind::Ident(ref ident, None) => ident.clone(),
+            UseSegmentKind::Slf(Some(ref rename)) => format!("self as {}", rename),
+            UseSegmentKind::Slf(None) => "self".to_owned(),
+            UseSegmentKind::Super(Some(ref rename)) => format!("super as {}", rename),
+            UseSegmentKind::Super(None) => "super".to_owned(),
+            UseSegmentKind::Crate(Some(ref rename)) => format!("crate as {}", rename),
+            UseSegmentKind::Crate(None) => "crate".to_owned(),
+            UseSegmentKind::Glob => "*".to_owned(),
+            UseSegmentKind::List(ref use_tree_list) => rewrite_nested_use_tree(
                 context,
                 use_tree_list,
                 // 1 = "{" and "}"
@@ -1016,6 +1111,7 @@ mod test {
 
         struct Parser<'a> {
             input: Peekable<Chars<'a>>,
+            version: Version,
         }
 
         impl<'a> Parser<'a> {
@@ -1028,34 +1124,40 @@ mod test {
             }
 
             fn push_segment(
+                &self,
                 result: &mut Vec<UseSegment>,
                 buf: &mut String,
                 alias_buf: &mut Option<String>,
             ) {
+                let version = self.version;
                 if !buf.is_empty() {
                     let mut alias = None;
                     swap(alias_buf, &mut alias);
 
                     match buf.as_ref() {
                         "self" => {
-                            result.push(UseSegment::Slf(alias));
+                            let kind = UseSegmentKind::Slf(alias);
+                            result.push(UseSegment { kind, version });
                             *buf = String::new();
                             *alias_buf = None;
                         }
                         "super" => {
-                            result.push(UseSegment::Super(alias));
+                            let kind = UseSegmentKind::Super(alias);
+                            result.push(UseSegment { kind, version });
                             *buf = String::new();
                             *alias_buf = None;
                         }
                         "crate" => {
-                            result.push(UseSegment::Crate(alias));
+                            let kind = UseSegmentKind::Crate(alias);
+                            result.push(UseSegment { kind, version });
                             *buf = String::new();
                             *alias_buf = None;
                         }
                         _ => {
                             let mut name = String::new();
                             swap(buf, &mut name);
-                            result.push(UseSegment::Ident(name, alias));
+                            let kind = UseSegmentKind::Ident(name, alias);
+                            result.push(UseSegment { kind, version });
                         }
                     }
                 }
@@ -1070,21 +1172,29 @@ mod test {
                         '{' => {
                             assert!(buf.is_empty());
                             self.bump();
-                            result.push(UseSegment::List(self.parse_list()));
+                            let kind = UseSegmentKind::List(self.parse_list());
+                            result.push(UseSegment {
+                                kind,
+                                version: self.version,
+                            });
                             self.eat('}');
                         }
                         '*' => {
                             assert!(buf.is_empty());
                             self.bump();
-                            result.push(UseSegment::Glob);
+                            let kind = UseSegmentKind::Glob;
+                            result.push(UseSegment {
+                                kind,
+                                version: self.version,
+                            });
                         }
                         ':' => {
                             self.bump();
                             self.eat(':');
-                            Self::push_segment(&mut result, &mut buf, &mut alias_buf);
+                            self.push_segment(&mut result, &mut buf, &mut alias_buf);
                         }
                         '}' | ',' => {
-                            Self::push_segment(&mut result, &mut buf, &mut alias_buf);
+                            self.push_segment(&mut result, &mut buf, &mut alias_buf);
                             return UseTree {
                                 path: result,
                                 span: DUMMY_SP,
@@ -1110,7 +1220,7 @@ mod test {
                         }
                     }
                 }
-                Self::push_segment(&mut result, &mut buf, &mut alias_buf);
+                self.push_segment(&mut result, &mut buf, &mut alias_buf);
                 UseTree {
                     path: result,
                     span: DUMMY_SP,
@@ -1136,6 +1246,7 @@ mod test {
 
         let mut parser = Parser {
             input: s.chars().peekable(),
+            version: Version::One,
         };
         parser.parse_in_list()
     }
diff --git a/src/tools/rustfmt/src/reorder.rs b/src/tools/rustfmt/src/reorder.rs
index 8ae297de25b..9e4a668aa49 100644
--- a/src/tools/rustfmt/src/reorder.rs
+++ b/src/tools/rustfmt/src/reorder.rs
@@ -12,7 +12,7 @@ use rustc_ast::ast;
 use rustc_span::{symbol::sym, Span};
 
 use crate::config::{Config, GroupImportsTactic};
-use crate::imports::{normalize_use_trees_with_granularity, UseSegment, UseTree};
+use crate::imports::{normalize_use_trees_with_granularity, UseSegmentKind, UseTree};
 use crate::items::{is_mod_decl, rewrite_extern_crate, rewrite_mod};
 use crate::lists::{itemize_list, write_list, ListFormatting, ListItem};
 use crate::rewrite::RewriteContext;
@@ -182,16 +182,16 @@ fn group_imports(uts: Vec<UseTree>) -> Vec<Vec<UseTree>> {
             external_imports.push(ut);
             continue;
         }
-        match &ut.path[0] {
-            UseSegment::Ident(id, _) => match id.as_ref() {
+        match &ut.path[0].kind {
+            UseSegmentKind::Ident(id, _) => match id.as_ref() {
                 "std" | "alloc" | "core" => std_imports.push(ut),
                 _ => external_imports.push(ut),
             },
-            UseSegment::Slf(_) | UseSegment::Super(_) | UseSegment::Crate(_) => {
+            UseSegmentKind::Slf(_) | UseSegmentKind::Super(_) | UseSegmentKind::Crate(_) => {
                 local_imports.push(ut)
             }
             // These are probably illegal here
-            UseSegment::Glob | UseSegment::List(_) => external_imports.push(ut),
+            UseSegmentKind::Glob | UseSegmentKind::List(_) => external_imports.push(ut),
         }
     }
 
diff --git a/src/tools/rustfmt/src/rewrite.rs b/src/tools/rustfmt/src/rewrite.rs
index f97df70cc6a..4a3bd129d16 100644
--- a/src/tools/rustfmt/src/rewrite.rs
+++ b/src/tools/rustfmt/src/rewrite.rs
@@ -12,7 +12,6 @@ use crate::shape::Shape;
 use crate::skip::SkipContext;
 use crate::visitor::SnippetProvider;
 use crate::FormatReport;
-use rustc_data_structures::stable_map::FxHashMap;
 
 pub(crate) trait Rewrite {
     /// Rewrite self into shape.
@@ -25,22 +24,10 @@ impl<T: Rewrite> Rewrite for ptr::P<T> {
     }
 }
 
-#[derive(Clone, PartialEq, Eq, Hash)]
-pub(crate) struct QueryId {
-    pub(crate) shape: Shape,
-    pub(crate) span: Span,
-}
-
-// We use Option<HashMap> instead of HashMap, because in case of `None`
-// the function clean the memoize map, but it doesn't clean when
-// there is `Some(empty)`, so they are different.
-pub(crate) type Memoize = Rc<Cell<Option<FxHashMap<QueryId, Option<String>>>>>;
-
 #[derive(Clone)]
 pub(crate) struct RewriteContext<'a> {
     pub(crate) parse_sess: &'a ParseSess,
     pub(crate) config: &'a Config,
-    pub(crate) memoize: Memoize,
     pub(crate) inside_macro: Rc<Cell<bool>>,
     // Force block indent style even if we are using visual indent style.
     pub(crate) use_block: Cell<bool>,
diff --git a/src/tools/rustfmt/src/shape.rs b/src/tools/rustfmt/src/shape.rs
index b3f785a9470..4376fd12b52 100644
--- a/src/tools/rustfmt/src/shape.rs
+++ b/src/tools/rustfmt/src/shape.rs
@@ -4,7 +4,7 @@ use std::ops::{Add, Sub};
 
 use crate::Config;
 
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct Indent {
     // Width of the block indent, in characters. Must be a multiple of
     // Config::tab_spaces.
@@ -139,7 +139,7 @@ impl Sub<usize> for Indent {
 // 8096 is close enough to infinite for rustfmt.
 const INFINITE_SHAPE_WIDTH: usize = 8096;
 
-#[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)]
+#[derive(Copy, Clone, Debug)]
 pub(crate) struct Shape {
     pub(crate) width: usize,
     // The current indentation of code.
diff --git a/src/tools/rustfmt/src/visitor.rs b/src/tools/rustfmt/src/visitor.rs
index 3ff56d52f92..9a0e0752c12 100644
--- a/src/tools/rustfmt/src/visitor.rs
+++ b/src/tools/rustfmt/src/visitor.rs
@@ -17,7 +17,7 @@ use crate::items::{
 use crate::macros::{macro_style, rewrite_macro, rewrite_macro_def, MacroPosition};
 use crate::modules::Module;
 use crate::parse::session::ParseSess;
-use crate::rewrite::{Memoize, Rewrite, RewriteContext};
+use crate::rewrite::{Rewrite, RewriteContext};
 use crate::shape::{Indent, Shape};
 use crate::skip::{is_skip_attr, SkipContext};
 use crate::source_map::{LineRangeUtils, SpanUtils};
@@ -71,7 +71,6 @@ impl SnippetProvider {
 
 pub(crate) struct FmtVisitor<'a> {
     parent_context: Option<&'a RewriteContext<'a>>,
-    pub(crate) memoize: Memoize,
     pub(crate) parse_sess: &'a ParseSess,
     pub(crate) buffer: String,
     pub(crate) last_pos: BytePos,
@@ -759,7 +758,6 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
             ctx.config,
             ctx.snippet_provider,
             ctx.report.clone(),
-            ctx.memoize.clone(),
         );
         visitor.skip_context.update(ctx.skip_context.clone());
         visitor.set_parent_context(ctx);
@@ -771,12 +769,10 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
         config: &'a Config,
         snippet_provider: &'a SnippetProvider,
         report: FormatReport,
-        memoize: Memoize,
     ) -> FmtVisitor<'a> {
         FmtVisitor {
             parent_context: None,
             parse_sess: parse_session,
-            memoize,
             buffer: String::with_capacity(snippet_provider.big_snippet.len() * 2),
             last_pos: BytePos(0),
             block_indent: Indent::empty(),
@@ -999,7 +995,6 @@ impl<'b, 'a: 'b> FmtVisitor<'a> {
         RewriteContext {
             parse_sess: self.parse_sess,
             config: self.config,
-            memoize: self.memoize.clone(),
             inside_macro: Rc::new(Cell::new(false)),
             use_block: Cell::new(false),
             is_if_else_block: Cell::new(false),
diff --git a/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100.rs b/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100.rs
new file mode 100644
index 00000000000..51578076167
--- /dev/null
+++ b/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100.rs
@@ -0,0 +1,16 @@
+// rustfmt-format_code_in_doc_comments: true
+// rustfmt-doc_comment_code_block_width: 100
+
+/// ```rust
+/// impl Test {
+///     pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+///         Self::from_bytes_manual_slice(v, 0, v.len()      )
+///     }
+/// }
+/// ```
+
+impl Test {
+    pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+        Self::from_bytes_manual_slice(v, 0, v.len()       )
+    }
+}
diff --git a/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100_greater_max_width.rs b/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100_greater_max_width.rs
new file mode 100644
index 00000000000..96505c69714
--- /dev/null
+++ b/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/100_greater_max_width.rs
@@ -0,0 +1,17 @@
+// rustfmt-max_width: 50
+// rustfmt-format_code_in_doc_comments: true
+// rustfmt-doc_comment_code_block_width: 100
+
+/// ```rust
+/// impl Test {
+///     pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+///         Self::from_bytes_manual_slice(v, 0, v.len()      )
+///     }
+/// }
+/// ```
+
+impl Test {
+    pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+        Self::from_bytes_manual_slice(v, 0, v.len()       )
+    }
+}
diff --git a/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/50.rs b/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/50.rs
new file mode 100644
index 00000000000..2c6307951c8
--- /dev/null
+++ b/src/tools/rustfmt/tests/source/configs/doc_comment_code_block_width/50.rs
@@ -0,0 +1,16 @@
+// rustfmt-format_code_in_doc_comments: true
+// rustfmt-doc_comment_code_block_width: 50
+
+/// ```rust
+/// impl Test {
+///     pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+///         Self::from_bytes_manual_slice(v, 0, v.len()      )
+///     }
+/// }
+/// ```
+
+impl Test {
+    pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+        Self::from_bytes_manual_slice(v, 0, v.len()       )
+    }
+}
diff --git a/src/tools/rustfmt/tests/source/imports_raw_identifiers/version_One.rs b/src/tools/rustfmt/tests/source/imports_raw_identifiers/version_One.rs
new file mode 100644
index 00000000000..bc4b5b13569
--- /dev/null
+++ b/src/tools/rustfmt/tests/source/imports_raw_identifiers/version_One.rs
@@ -0,0 +1,5 @@
+// rustfmt-version:One
+
+use websocket::client::ClientBuilder;
+use websocket::r#async::futures::Stream;
+use websocket::result::WebSocketError;
diff --git a/src/tools/rustfmt/tests/source/imports_raw_identifiers/version_Two.rs b/src/tools/rustfmt/tests/source/imports_raw_identifiers/version_Two.rs
new file mode 100644
index 00000000000..88e7fbd01ca
--- /dev/null
+++ b/src/tools/rustfmt/tests/source/imports_raw_identifiers/version_Two.rs
@@ -0,0 +1,5 @@
+// rustfmt-version:Two
+
+use websocket::client::ClientBuilder;
+use websocket::r#async::futures::Stream;
+use websocket::result::WebSocketError;
diff --git a/src/tools/rustfmt/tests/source/performance/issue-4476.rs b/src/tools/rustfmt/tests/source/performance/issue-4476.rs
deleted file mode 100644
index 8da3f19b62d..00000000000
--- a/src/tools/rustfmt/tests/source/performance/issue-4476.rs
+++ /dev/null
@@ -1,638 +0,0 @@
-use super::SemverParser;
-
-#[allow(dead_code, non_camel_case_types)]
-#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
-pub enum Rule {
-  EOI,
-  range_set,
-  logical_or,
-  range,
-  empty,
-  hyphen,
-  simple,
-  primitive,
-  primitive_op,
-  partial,
-  xr,
-  xr_op,
-  nr,
-  tilde,
-  caret,
-  qualifier,
-  parts,
-  part,
-  space,
-}
-#[allow(clippy::all)]
-impl ::pest::Parser<Rule> for SemverParser {
-  fn parse<'i>(
-    rule: Rule,
-    input: &'i str,
-  ) -> ::std::result::Result<::pest::iterators::Pairs<'i, Rule>, ::pest::error::Error<Rule>> {
-    mod rules {
-      pub mod hidden {
-        use super::super::Rule;
-        #[inline]
-        #[allow(dead_code, non_snake_case, unused_variables)]
-        pub fn skip(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          Ok(state)
-        }
-      }
-      pub mod visible {
-        use super::super::Rule;
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn range_set(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::range_set, |state| {
-            state.sequence(|state| {
-              self::SOI(state)
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      self::space(state).and_then(|state| {
-                        state.repeat(|state| {
-                          state.sequence(|state| {
-                            super::hidden::skip(state).and_then(|state| self::space(state))
-                          })
-                        })
-                      })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::range(state))
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      state
-                        .sequence(|state| {
-                          self::logical_or(state)
-                            .and_then(|state| super::hidden::skip(state))
-                            .and_then(|state| self::range(state))
-                        })
-                        .and_then(|state| {
-                          state.repeat(|state| {
-                            state.sequence(|state| {
-                              super::hidden::skip(state).and_then(|state| {
-                                state.sequence(|state| {
-                                  self::logical_or(state)
-                                    .and_then(|state| super::hidden::skip(state))
-                                    .and_then(|state| self::range(state))
-                                })
-                              })
-                            })
-                          })
-                        })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      self::space(state).and_then(|state| {
-                        state.repeat(|state| {
-                          state.sequence(|state| {
-                            super::hidden::skip(state).and_then(|state| self::space(state))
-                          })
-                        })
-                      })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::EOI(state))
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn logical_or(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::logical_or, |state| {
-            state.sequence(|state| {
-              state
-                .sequence(|state| {
-                  state.optional(|state| {
-                    self::space(state).and_then(|state| {
-                      state.repeat(|state| {
-                        state.sequence(|state| {
-                          super::hidden::skip(state).and_then(|state| self::space(state))
-                        })
-                      })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| state.match_string("||"))
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      self::space(state).and_then(|state| {
-                        state.repeat(|state| {
-                          state.sequence(|state| {
-                            super::hidden::skip(state).and_then(|state| self::space(state))
-                          })
-                        })
-                      })
-                    })
-                  })
-                })
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn range(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::range, |state| {
-            self::hyphen(state)
-              .or_else(|state| {
-                state.sequence(|state| {
-                  self::simple(state)
-                    .and_then(|state| super::hidden::skip(state))
-                    .and_then(|state| {
-                      state.sequence(|state| {
-                        state.optional(|state| {
-                          state
-                            .sequence(|state| {
-                              state
-                                .optional(|state| state.match_string(","))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                  state.sequence(|state| {
-                                    self::space(state)
-                                      .and_then(|state| super::hidden::skip(state))
-                                      .and_then(|state| {
-                                        state.sequence(|state| {
-                                          state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                              state.repeat(|state| {
-                                                state.sequence(|state| {
-                                                  super::hidden::skip(state)
-                                                    .and_then(|state| self::space(state))
-                                                })
-                                              })
-                                            })
-                                          })
-                                        })
-                                      })
-                                  })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::simple(state))
-                            })
-                            .and_then(|state| {
-                              state.repeat(|state| {
-                                state.sequence(|state| {
-                                  super::hidden::skip(state).and_then(|state| {
-                                    state.sequence(|state| {
-                                      state
-                                        .optional(|state| state.match_string(","))
-                                        .and_then(|state| super::hidden::skip(state))
-                                        .and_then(|state| {
-                                          state.sequence(|state| {
-                                            self::space(state)
-                                              .and_then(|state| super::hidden::skip(state))
-                                              .and_then(|state| {
-                                                state.sequence(|state| {
-                                                  state.optional(|state| {
-                                                    self::space(state).and_then(|state| {
-                                                      state.repeat(|state| {
-                                                        state.sequence(|state| {
-                                                          super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                        })
-                                                      })
-                                                    })
-                                                  })
-                                                })
-                                              })
-                                          })
-                                        })
-                                        .and_then(|state| super::hidden::skip(state))
-                                        .and_then(|state| self::simple(state))
-                                    })
-                                  })
-                                })
-                              })
-                            })
-                        })
-                      })
-                    })
-                })
-              })
-              .or_else(|state| self::empty(state))
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn empty(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::empty, |state| state.match_string(""))
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn hyphen(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::hyphen, |state| {
-            state.sequence(|state| {
-              self::partial(state)
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    self::space(state)
-                      .and_then(|state| super::hidden::skip(state))
-                      .and_then(|state| {
-                        state.sequence(|state| {
-                          state.optional(|state| {
-                            self::space(state).and_then(|state| {
-                              state.repeat(|state| {
-                                state.sequence(|state| {
-                                  super::hidden::skip(state).and_then(|state| self::space(state))
-                                })
-                              })
-                            })
-                          })
-                        })
-                      })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| state.match_string("-"))
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    self::space(state)
-                      .and_then(|state| super::hidden::skip(state))
-                      .and_then(|state| {
-                        state.sequence(|state| {
-                          state.optional(|state| {
-                            self::space(state).and_then(|state| {
-                              state.repeat(|state| {
-                                state.sequence(|state| {
-                                  super::hidden::skip(state).and_then(|state| self::space(state))
-                                })
-                              })
-                            })
-                          })
-                        })
-                      })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::partial(state))
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn simple(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::simple, |state| {
-            self::primitive(state)
-              .or_else(|state| self::partial(state))
-              .or_else(|state| self::tilde(state))
-              .or_else(|state| self::caret(state))
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn primitive(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::primitive, |state| {
-            state.sequence(|state| {
-              self::primitive_op(state)
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      self::space(state).and_then(|state| {
-                        state.repeat(|state| {
-                          state.sequence(|state| {
-                            super::hidden::skip(state).and_then(|state| self::space(state))
-                          })
-                        })
-                      })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::partial(state))
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn primitive_op(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::primitive_op, |state| {
-            state
-              .match_string("<=")
-              .or_else(|state| state.match_string(">="))
-              .or_else(|state| state.match_string(">"))
-              .or_else(|state| state.match_string("<"))
-              .or_else(|state| state.match_string("="))
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn partial(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::partial, |state| {
-            state.sequence(|state| {
-              self::xr(state)
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.optional(|state| {
-                    state.sequence(|state| {
-                      state
-                        .match_string(".")
-                        .and_then(|state| super::hidden::skip(state))
-                        .and_then(|state| self::xr(state))
-                        .and_then(|state| super::hidden::skip(state))
-                        .and_then(|state| {
-                          state.optional(|state| {
-                            state.sequence(|state| {
-                              state
-                                .match_string(".")
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::xr(state))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| state.optional(|state| self::qualifier(state)))
-                            })
-                          })
-                        })
-                    })
-                  })
-                })
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn xr(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::xr, |state| {
-            self::xr_op(state).or_else(|state| self::nr(state))
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn xr_op(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::xr_op, |state| {
-            state
-              .match_string("x")
-              .or_else(|state| state.match_string("X"))
-              .or_else(|state| state.match_string("*"))
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn nr(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::nr, |state| {
-            state.match_string("0").or_else(|state| {
-              state.sequence(|state| {
-                state
-                  .match_range('1'..'9')
-                  .and_then(|state| super::hidden::skip(state))
-                  .and_then(|state| {
-                    state.sequence(|state| {
-                      state.optional(|state| {
-                        state.match_range('0'..'9').and_then(|state| {
-                          state.repeat(|state| {
-                            state.sequence(|state| {
-                              super::hidden::skip(state)
-                                .and_then(|state| state.match_range('0'..'9'))
-                            })
-                          })
-                        })
-                      })
-                    })
-                  })
-              })
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn tilde(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::tilde, |state| {
-            state.sequence(|state| {
-              state
-                .match_string("~>")
-                .or_else(|state| state.match_string("~"))
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      self::space(state).and_then(|state| {
-                        state.repeat(|state| {
-                          state.sequence(|state| {
-                            super::hidden::skip(state).and_then(|state| self::space(state))
-                          })
-                        })
-                      })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::partial(state))
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn caret(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::caret, |state| {
-            state.sequence(|state| {
-              state
-                .match_string("^")
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      self::space(state).and_then(|state| {
-                        state.repeat(|state| {
-                          state.sequence(|state| {
-                            super::hidden::skip(state).and_then(|state| self::space(state))
-                          })
-                        })
-                      })
-                    })
-                  })
-                })
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::partial(state))
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn qualifier(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::qualifier, |state| {
-            state.sequence(|state| {
-              state
-                .match_string("-")
-                .or_else(|state| state.match_string("+"))
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| self::parts(state))
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn parts(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::parts, |state| {
-            state.sequence(|state| {
-              self::part(state)
-                .and_then(|state| super::hidden::skip(state))
-                .and_then(|state| {
-                  state.sequence(|state| {
-                    state.optional(|state| {
-                      state
-                        .sequence(|state| {
-                          state
-                            .match_string(".")
-                            .and_then(|state| super::hidden::skip(state))
-                            .and_then(|state| self::part(state))
-                        })
-                        .and_then(|state| {
-                          state.repeat(|state| {
-                            state.sequence(|state| {
-                              super::hidden::skip(state).and_then(|state| {
-                                state.sequence(|state| {
-                                  state
-                                    .match_string(".")
-                                    .and_then(|state| super::hidden::skip(state))
-                                    .and_then(|state| self::part(state))
-                                })
-                              })
-                            })
-                          })
-                        })
-                    })
-                  })
-                })
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn part(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::part, |state| {
-            self::nr(state).or_else(|state| {
-              state.sequence(|state| {
-                state
-                  .match_string("-")
-                  .or_else(|state| state.match_range('0'..'9'))
-                  .or_else(|state| state.match_range('A'..'Z'))
-                  .or_else(|state| state.match_range('a'..'z'))
-                  .and_then(|state| super::hidden::skip(state))
-                  .and_then(|state| {
-                    state.sequence(|state| {
-                      state.optional(|state| {
-                        state
-                          .match_string("-")
-                          .or_else(|state| state.match_range('0'..'9'))
-                          .or_else(|state| state.match_range('A'..'Z'))
-                          .or_else(|state| state.match_range('a'..'z'))
-                          .and_then(|state| {
-                            state.repeat(|state| {
-                              state.sequence(|state| {
-                                super::hidden::skip(state).and_then(|state| {
-                                  state
-                                    .match_string("-")
-                                    .or_else(|state| state.match_range('0'..'9'))
-                                    .or_else(|state| state.match_range('A'..'Z'))
-                                    .or_else(|state| state.match_range('a'..'z'))
-                                })
-                              })
-                            })
-                          })
-                      })
-                    })
-                  })
-              })
-            })
-          })
-        }
-        #[inline]
-        #[allow(non_snake_case, unused_variables)]
-        pub fn space(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state
-            .match_string(" ")
-            .or_else(|state| state.match_string("\t"))
-        }
-        #[inline]
-        #[allow(dead_code, non_snake_case, unused_variables)]
-        pub fn EOI(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.rule(Rule::EOI, |state| state.end_of_input())
-        }
-        #[inline]
-        #[allow(dead_code, non_snake_case, unused_variables)]
-        pub fn SOI(
-          state: Box<::pest::ParserState<Rule>>,
-        ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-          state.start_of_input()
-        }
-      }
-      pub use self::visible::*;
-    }
-    ::pest::state(input, |state| match rule {
-      Rule::range_set => rules::range_set(state),
-      Rule::logical_or => rules::logical_or(state),
-      Rule::range => rules::range(state),
-      Rule::empty => rules::empty(state),
-      Rule::hyphen => rules::hyphen(state),
-      Rule::simple => rules::simple(state),
-      Rule::primitive => rules::primitive(state),
-      Rule::primitive_op => rules::primitive_op(state),
-      Rule::partial => rules::partial(state),
-      Rule::xr => rules::xr(state),
-      Rule::xr_op => rules::xr_op(state),
-      Rule::nr => rules::nr(state),
-      Rule::tilde => rules::tilde(state),
-      Rule::caret => rules::caret(state),
-      Rule::qualifier => rules::qualifier(state),
-      Rule::parts => rules::parts(state),
-      Rule::part => rules::part(state),
-      Rule::space => rules::space(state),
-      Rule::EOI => rules::EOI(state),
-    })
-  }
-}
\ No newline at end of file
diff --git a/src/tools/rustfmt/tests/source/performance/issue-5128.rs b/src/tools/rustfmt/tests/source/performance/issue-5128.rs
deleted file mode 100644
index 3adce49601c..00000000000
--- a/src/tools/rustfmt/tests/source/performance/issue-5128.rs
+++ /dev/null
@@ -1,5127 +0,0 @@
-
-fn takes_a_long_time_to_rustfmt() {
-    let inner_cte = vec![Node {
-        node: Some(node::Node::CommonTableExpr(Box::new(CommonTableExpr {
-            ctename: String::from("ranked_by_age_within_key"),
-            aliascolnames: vec![],
-            ctematerialized: CteMaterialize::Default as i32,
-            ctequery: Some(Box::new(Node {
-                node: Some(node::Node::SelectStmt(Box::new(SelectStmt {
-                    distinct_clause: vec![],
-                    into_clause: None,
-                    target_list: vec![
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from(""),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                        fields: vec![Node {
-                                            node: Some(node::Node::AStar(AStar{}))
-                                        }],
-                                        location: 80
-                                    }))
-                                })),
-                                location: 80
-                            })))
-                        },
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from("rank_in_key"),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::FuncCall(Box::new(FuncCall {
-                                        funcname: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("row_number")
-                                            }))
-                                        }],
-                                        args: vec![],
-                                        agg_order: vec![],
-                                        agg_filter: None,
-                                        agg_within_group: false,
-                                        agg_star: false,
-                                        agg_distinct: false,
-                                        func_variadic: false,
-                                        over: Some(Box::new(WindowDef {
-                                            name: String::from(""),
-                                            refname: String::from(""),
-                                            partition_clause: vec![
-                                                Node {
-                                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                                        fields: vec![Node {
-                                                            node: Some(node::Node::String(String2 {
-                                                                str: String::from("synthetic_key")
-                                                            }))
-                                                        }], location: 123
-                                                    }))
-                                                }], order_clause: vec![Node {
-                                                    node: Some(node::Node::SortBy(Box::new(SortBy {
-                                                        node: Some(Box::new(Node {
-                                                            node: Some(node::Node::ColumnRef(ColumnRef {
-                                                                fields: vec![Node {
-                                                                    node: Some(node::Node::String(String2 {
-                                                                        str: String::from("logical_timestamp")
-                                                                    }))
-                                                                }], location: 156
-                                                            }))
-                                                        })),
-                                                        sortby_dir: SortByDir::SortbyDesc as i32,
-                                                        sortby_nulls: SortByNulls::SortbyNullsDefault as i32,
-                                                        use_op: vec![],
-                                                        location: -1
-                                                    })))
-                                                }], frame_options: 1058, start_offset: None, end_offset: None, location: 109
-                                            })),
-                                            location: 91
-                                        })))
-                                    })),
-                                    location: 91
-                                })))
-                            }],
-                            from_clause: vec![Node {
-                                node: Some(node::Node::RangeVar(RangeVar {
-                                    catalogname: String::from(""), schemaname: String::from("_supertables"), relname: String::from("9999-9999-9999"), inh: true, relpersistence: String::from("p"), alias: None, location: 206
-                                }))
-                            }],
-                            where_clause: Some(Box::new(Node {
-                                node: Some(node::Node::AExpr(Box::new(AExpr {
-                                    kind: AExprKind::AexprOp as i32,
-                                    name: vec![Node {
-                                        node: Some(node::Node::String(String2 {
-                                            str: String::from("<=")
-                                        }))
-                                    }],
-                                    lexpr: Some(Box::new(Node {
-                                        node: Some(node::Node::ColumnRef(ColumnRef {
-                                            fields: vec![Node {
-                                                node: Some(node::Node::String(String2 {
-                                                    str: String::from("logical_timestamp")
-                                                }))
-                                            }],
-                                            location: 250
-                                        }))
-                                    })),
-                                    rexpr: Some(Box::new(Node {
-                                        node: Some(node::Node::AConst(Box::new(AConst {
-                                            val: Some(Box::new(Node {
-                                                node: Some(node::Node::Integer(Integer {
-                                                    ival: 9000
-                                                }))
-                                            })),
-                                            location: 271
-                                        })))
-                                    })),
-                                    location: 268
-                                })))
-                            })),
-                            group_clause: vec![],
-                            having_clause: None,
-                            window_clause: vec![],
-                            values_lists: vec![],
-                            sort_clause: vec![],
-                            limit_offset: None,
-                            limit_count: None,
-                            limit_option: LimitOption::Default as i32,
-                            locking_clause: vec![],
-                            with_clause: None,
-                            op: SetOperation::SetopNone as i32,
-                            all: false,
-                            larg: None,
-                            rarg: None
-                        }))),
-            })),
-            location: 29,
-            cterecursive: false,
-            cterefcount: 0,
-            ctecolnames: vec![],
-            ctecoltypes: vec![],
-            ctecoltypmods: vec![],
-            ctecolcollations: vec![],
-        }))),
-    }];
-    let outer_cte = vec![Node {
-        node: Some(node::Node::CommonTableExpr(Box::new(CommonTableExpr {
-            ctename: String::from("table_name"),
-            aliascolnames: vec![],
-            ctematerialized: CteMaterialize::Default as i32,
-            ctequery: Some(Box::new(Node {
-                node: Some(node::Node::SelectStmt(Box::new(SelectStmt {
-                    distinct_clause: vec![],
-                    into_clause: None,
-                    target_list: vec![
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from("column1"),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                        fields: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("c1"),
-                                            })),
-                                        }],
-                                        location: 301,
-                                    })),
-                                })),
-                                location: 301,
-                            }))),
-                        },
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from("column2"),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                        fields: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("c2"),
-                                            })),
-                                        }],
-                                        location: 324,
-                                    })),
-                                })),
-                                location: 324,
-                            }))),
-                        },
-                    ],
-                    from_clause: vec![Node {
-                        node: Some(node::Node::RangeVar(RangeVar {
-                            catalogname: String::from(""),
-                            schemaname: String::from(""),
-                            relname: String::from("ranked_by_age_within_key"),
-                            inh: true,
-                            relpersistence: String::from("p"),
-                            alias: None,
-                            location: 347,
-                        })),
-                    }],
-                    where_clause: Some(Box::new(Node {
-                        node: Some(node::Node::BoolExpr(Box::new(BoolExpr {
-                            xpr: None,
-                            boolop: BoolExprType::AndExpr as i32,
-                            args: vec![
-                                Node {
-                                    node: Some(node::Node::AExpr(Box::new(AExpr {
-                                        kind: AExprKind::AexprOp as i32,
-                                        name: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("="),
-                                            })),
-                                        }],
-                                        lexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::ColumnRef(ColumnRef {
-                                                fields: vec![Node {
-                                                    node: Some(node::Node::String(
-                                                        String2 {
-                                                            str: String::from("rank_in_key"),
-                                                        },
-                                                    )),
-                                                }],
-                                                location: 382,
-                                            })),
-                                        })),
-                                        rexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::AConst(Box::new(AConst {
-                                                val: Some(Box::new(Node {
-                                                    node: Some(node::Node::Integer(
-                                                        Integer { ival: 1 },
-                                                    )),
-                                                })),
-                                                location: 396,
-                                            }))),
-                                        })),
-                                        location: 394,
-                                    }))),
-                                },
-                                Node {
-                                    node: Some(node::Node::AExpr(Box::new(AExpr {
-                                        kind: AExprKind::AexprOp as i32,
-                                        name: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("="),
-                                            })),
-                                        }],
-                                        lexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::ColumnRef(ColumnRef {
-                                                fields: vec![Node {
-                                                    node: Some(node::Node::String(
-                                                        String2 {
-                                                            str: String::from("is_deleted"),
-                                                        },
-                                                    )),
-                                                }],
-                                                location: 402,
-                                            })),
-                                        })),
-                                        rexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::TypeCast(Box::new(
-                                                TypeCast {
-                                                    arg: Some(Box::new(Node {
-                                                        node: Some(node::Node::AConst(
-                                                            Box::new(AConst {
-                                                                val: Some(Box::new(Node {
-                                                                    node: Some(
-                                                                        node::Node::String(
-                                                                            String2 {
-                                                                                str:
-                                                                                    String::from(
-                                                                                        "f",
-                                                                                    ),
-                                                                            },
-                                                                        ),
-                                                                    ),
-                                                                })),
-                                                                location: 415,
-                                                            }),
-                                                        )),
-                                                    })),
-                                                    type_name: Some(TypeName {
-                                                        names: vec![
-                                                            Node {
-                                                                node: Some(node::Node::String(
-                                                                    String2 {
-                                                                        str: String::from(
-                                                                            "pg_catalog",
-                                                                        ),
-                                                                    },
-                                                                )),
-                                                            },
-                                                            Node {
-                                                                node: Some(node::Node::String(
-                                                                    String2 {
-                                                                        str: String::from(
-                                                                            "bool",
-                                                                        ),
-                                                                    },
-                                                                )),
-                                                            },
-                                                        ],
-                                                        type_oid: 0,
-                                                        setof: false,
-                                                        pct_type: false,
-                                                        typmods: vec![],
-                                                        typemod: -1,
-                                                        array_bounds: vec![],
-                                                        location: -1,
-                                                    }),
-                                                    location: -1,
-                                                },
-                                            ))),
-                                        })),
-                                        location: 413,
-                                    }))),
-                                },
-                            ],
-                            location: 398,
-                        }))),
-                    })),
-                    group_clause: vec![],
-                    having_clause: None,
-                    window_clause: vec![],
-                    values_lists: vec![],
-                    sort_clause: vec![],
-                    limit_offset: None,
-                    limit_count: None,
-                    limit_option: LimitOption::Default as i32,
-                    locking_clause: vec![],
-                    with_clause: Some(WithClause {
-                        ctes: inner_cte,
-                        recursive: false,
-                        location: 24,
-                    }),
-                    op: SetOperation::SetopNone as i32,
-                    all: false,
-                    larg: None,
-                    rarg: None,
-                }))),
-            })),
-            location: 5,
-            cterecursive: false,
-            cterefcount: 0,
-            ctecolnames: vec![],
-            ctecoltypes: vec![],
-            ctecoltypmods: vec![],
-            ctecolcollations: vec![],
-        }))),
-    }];
-    let expected_result = ParseResult {
-        version: 130003,
-        stmts: vec![RawStmt {
-            stmt: Some(Box::new(Node {
-                node: Some(node::Node::SelectStmt(Box::new(SelectStmt {
-                    distinct_clause: vec![],
-                    into_clause: None,
-
-                    target_list: vec![Node {
-                        node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                            name: String::from(""),
-                            indirection: vec![],
-                            val: Some(Box::new(Node {
-                                node: Some(node::Node::ColumnRef(ColumnRef {
-                                    fields: vec![Node {
-                                        node: Some(node::Node::String(String2 {
-                                            str: String::from("column1"),
-                                        })),
-                                    }],
-                                    location: 430,
-                                })),
-                            })),
-                            location: 430,
-                        }))),
-                    }],
-                    from_clause: vec![Node {
-                        node: Some(node::Node::RangeVar(RangeVar {
-                            catalogname: String::from(""),
-                            schemaname: String::from(""),
-                            relname: String::from("table_name"),
-                            inh: true,
-                            relpersistence: String::from("p"),
-                            alias: None,
-                            location: 443,
-                        })),
-                    }],
-                    where_clause: Some(Box::new(Node {
-                        node: Some(node::Node::AExpr(Box::new(AExpr {
-                            kind: AExprKind::AexprOp as i32,
-                            name: vec![Node {
-                                node: Some(node::Node::String(String2 {
-                                    str: String::from(">"),
-                                })),
-                            }],
-                            lexpr: Some(Box::new(Node {
-                                node: Some(node::Node::ColumnRef(ColumnRef {
-                                    fields: vec![Node {
-                                        node: Some(node::Node::String(String2 {
-                                            str: String::from("column2"),
-                                        })),
-                                    }],
-                                    location: 460,
-                                })),
-                            })),
-                            rexpr: Some(Box::new(Node {
-                                node: Some(node::Node::AConst(Box::new(AConst {
-                                    val: Some(Box::new(Node {
-                                        node: Some(node::Node::Integer(Integer {
-                                            ival: 9000,
-                                        })),
-                                    })),
-                                    location: 470,
-                                }))),
-                            })),
-                            location: 468,
-                        }))),
-                    })),
-                    group_clause: vec![],
-                    having_clause: None,
-                    window_clause: vec![],
-                    values_lists: vec![],
-                    sort_clause: vec![],
-                    limit_offset: None,
-                    limit_count: None,
-                    limit_option: LimitOption::Default as i32,
-                    locking_clause: vec![],
-                    with_clause: Some(WithClause {
-                        ctes: outer_cte,
-                        recursive: false,
-                        location: 0,
-                    }),
-                    op: SetOperation::SetopNone as i32,
-                    all: false,
-                    larg: None,
-                    rarg: None,
-                }))),
-            })),
-            stmt_location: 0,
-            stmt_len: 0,
-        }],
-    };
-
-}
-#[derive(Clone, PartialEq)]
-pub struct ParseResult {
-
-    pub version: i32,
-
-    pub stmts: Vec<RawStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ScanResult {
-
-    pub version: i32,
-
-    pub tokens: Vec<ScanToken>,
-}
-#[derive(Clone, PartialEq)]
-pub struct Node {
-    pub node: ::core::option::Option<node::Node>,
-}
-/// Nested message and enum types in `Node`.
-pub mod node {
-    #[derive(Clone, PartialEq)]
-    pub enum Node {
-
-        Alias(super::Alias),
-
-        RangeVar(super::RangeVar),
-
-        TableFunc(Box<super::TableFunc>),
-
-        Expr(super::Expr),
-
-        Var(Box<super::Var>),
-
-        Param(Box<super::Param>),
-
-        Aggref(Box<super::Aggref>),
-
-        GroupingFunc(Box<super::GroupingFunc>),
-
-        WindowFunc(Box<super::WindowFunc>),
-
-        SubscriptingRef(Box<super::SubscriptingRef>),
-
-        FuncExpr(Box<super::FuncExpr>),
-
-        NamedArgExpr(Box<super::NamedArgExpr>),
-
-        OpExpr(Box<super::OpExpr>),
-
-        DistinctExpr(Box<super::DistinctExpr>),
-
-        NullIfExpr(Box<super::NullIfExpr>),
-
-        ScalarArrayOpExpr(Box<super::ScalarArrayOpExpr>),
-
-        BoolExpr(Box<super::BoolExpr>),
-
-        SubLink(Box<super::SubLink>),
-
-        SubPlan(Box<super::SubPlan>),
-
-        AlternativeSubPlan(Box<super::AlternativeSubPlan>),
-
-        FieldSelect(Box<super::FieldSelect>),
-
-        FieldStore(Box<super::FieldStore>),
-
-        RelabelType(Box<super::RelabelType>),
-
-        CoerceViaIo(Box<super::CoerceViaIo>),
-
-        ArrayCoerceExpr(Box<super::ArrayCoerceExpr>),
-
-        ConvertRowtypeExpr(Box<super::ConvertRowtypeExpr>),
-
-        CollateExpr(Box<super::CollateExpr>),
-
-        CaseExpr(Box<super::CaseExpr>),
-
-        CaseWhen(Box<super::CaseWhen>),
-
-        CaseTestExpr(Box<super::CaseTestExpr>),
-
-        ArrayExpr(Box<super::ArrayExpr>),
-
-        RowExpr(Box<super::RowExpr>),
-
-        RowCompareExpr(Box<super::RowCompareExpr>),
-
-        CoalesceExpr(Box<super::CoalesceExpr>),
-
-        MinMaxExpr(Box<super::MinMaxExpr>),
-
-        SqlvalueFunction(Box<super::SqlValueFunction>),
-
-        XmlExpr(Box<super::XmlExpr>),
-
-        NullTest(Box<super::NullTest>),
-
-        BooleanTest(Box<super::BooleanTest>),
-
-        CoerceToDomain(Box<super::CoerceToDomain>),
-
-        CoerceToDomainValue(Box<super::CoerceToDomainValue>),
-
-        SetToDefault(Box<super::SetToDefault>),
-
-        CurrentOfExpr(Box<super::CurrentOfExpr>),
-
-        NextValueExpr(Box<super::NextValueExpr>),
-
-        InferenceElem(Box<super::InferenceElem>),
-
-        TargetEntry(Box<super::TargetEntry>),
-
-        RangeTblRef(super::RangeTblRef),
-
-        JoinExpr(Box<super::JoinExpr>),
-
-        FromExpr(Box<super::FromExpr>),
-
-        OnConflictExpr(Box<super::OnConflictExpr>),
-
-        IntoClause(Box<super::IntoClause>),
-
-        RawStmt(Box<super::RawStmt>),
-
-        Query(Box<super::Query>),
-
-        InsertStmt(Box<super::InsertStmt>),
-
-        DeleteStmt(Box<super::DeleteStmt>),
-
-        UpdateStmt(Box<super::UpdateStmt>),
-
-        SelectStmt(Box<super::SelectStmt>),
-
-        AlterTableStmt(super::AlterTableStmt),
-
-        AlterTableCmd(Box<super::AlterTableCmd>),
-
-        AlterDomainStmt(Box<super::AlterDomainStmt>),
-
-        SetOperationStmt(Box<super::SetOperationStmt>),
-
-        GrantStmt(super::GrantStmt),
-
-        GrantRoleStmt(super::GrantRoleStmt),
-
-        AlterDefaultPrivilegesStmt(super::AlterDefaultPrivilegesStmt),
-
-        ClosePortalStmt(super::ClosePortalStmt),
-
-        ClusterStmt(super::ClusterStmt),
-
-        CopyStmt(Box<super::CopyStmt>),
-
-        CreateStmt(super::CreateStmt),
-
-        DefineStmt(super::DefineStmt),
-
-        DropStmt(super::DropStmt),
-
-        TruncateStmt(super::TruncateStmt),
-
-        CommentStmt(Box<super::CommentStmt>),
-
-        FetchStmt(super::FetchStmt),
-
-        IndexStmt(Box<super::IndexStmt>),
-
-        CreateFunctionStmt(super::CreateFunctionStmt),
-
-        AlterFunctionStmt(super::AlterFunctionStmt),
-
-        DoStmt(super::DoStmt),
-
-        RenameStmt(Box<super::RenameStmt>),
-
-        RuleStmt(Box<super::RuleStmt>),
-
-        NotifyStmt(super::NotifyStmt),
-
-        ListenStmt(super::ListenStmt),
-
-        UnlistenStmt(super::UnlistenStmt),
-
-        TransactionStmt(super::TransactionStmt),
-
-        ViewStmt(Box<super::ViewStmt>),
-
-        LoadStmt(super::LoadStmt),
-
-        CreateDomainStmt(Box<super::CreateDomainStmt>),
-
-        CreatedbStmt(super::CreatedbStmt),
-
-        DropdbStmt(super::DropdbStmt),
-
-        VacuumStmt(super::VacuumStmt),
-
-        ExplainStmt(Box<super::ExplainStmt>),
-
-        CreateTableAsStmt(Box<super::CreateTableAsStmt>),
-
-        CreateSeqStmt(super::CreateSeqStmt),
-
-        AlterSeqStmt(super::AlterSeqStmt),
-
-        VariableSetStmt(super::VariableSetStmt),
-
-        VariableShowStmt(super::VariableShowStmt),
-
-        DiscardStmt(super::DiscardStmt),
-
-        CreateTrigStmt(Box<super::CreateTrigStmt>),
-
-        CreatePlangStmt(super::CreatePLangStmt),
-
-        CreateRoleStmt(super::CreateRoleStmt),
-
-        AlterRoleStmt(super::AlterRoleStmt),
-
-        DropRoleStmt(super::DropRoleStmt),
-
-        LockStmt(super::LockStmt),
-
-        ConstraintsSetStmt(super::ConstraintsSetStmt),
-
-        ReindexStmt(super::ReindexStmt),
-
-        CheckPointStmt(super::CheckPointStmt),
-
-        CreateSchemaStmt(super::CreateSchemaStmt),
-
-        AlterDatabaseStmt(super::AlterDatabaseStmt),
-
-        AlterDatabaseSetStmt(super::AlterDatabaseSetStmt),
-
-        AlterRoleSetStmt(super::AlterRoleSetStmt),
-
-        CreateConversionStmt(super::CreateConversionStmt),
-
-        CreateCastStmt(super::CreateCastStmt),
-
-        CreateOpClassStmt(super::CreateOpClassStmt),
-
-        CreateOpFamilyStmt(super::CreateOpFamilyStmt),
-
-        AlterOpFamilyStmt(super::AlterOpFamilyStmt),
-
-        PrepareStmt(Box<super::PrepareStmt>),
-
-        ExecuteStmt(super::ExecuteStmt),
-
-        DeallocateStmt(super::DeallocateStmt),
-
-        DeclareCursorStmt(Box<super::DeclareCursorStmt>),
-
-        CreateTableSpaceStmt(super::CreateTableSpaceStmt),
-
-        DropTableSpaceStmt(super::DropTableSpaceStmt),
-
-        AlterObjectDependsStmt(Box<super::AlterObjectDependsStmt>),
-
-        AlterObjectSchemaStmt(Box<super::AlterObjectSchemaStmt>),
-
-        AlterOwnerStmt(Box<super::AlterOwnerStmt>),
-
-        AlterOperatorStmt(super::AlterOperatorStmt),
-
-        AlterTypeStmt(super::AlterTypeStmt),
-
-        DropOwnedStmt(super::DropOwnedStmt),
-
-        ReassignOwnedStmt(super::ReassignOwnedStmt),
-
-        CompositeTypeStmt(super::CompositeTypeStmt),
-
-        CreateEnumStmt(super::CreateEnumStmt),
-
-        CreateRangeStmt(super::CreateRangeStmt),
-
-        AlterEnumStmt(super::AlterEnumStmt),
-
-        AlterTsdictionaryStmt(super::AlterTsDictionaryStmt),
-
-        AlterTsconfigurationStmt(super::AlterTsConfigurationStmt),
-
-        CreateFdwStmt(super::CreateFdwStmt),
-
-        AlterFdwStmt(super::AlterFdwStmt),
-
-        CreateForeignServerStmt(super::CreateForeignServerStmt),
-
-        AlterForeignServerStmt(super::AlterForeignServerStmt),
-
-        CreateUserMappingStmt(super::CreateUserMappingStmt),
-
-        AlterUserMappingStmt(super::AlterUserMappingStmt),
-
-        DropUserMappingStmt(super::DropUserMappingStmt),
-
-        AlterTableSpaceOptionsStmt(super::AlterTableSpaceOptionsStmt),
-
-        AlterTableMoveAllStmt(super::AlterTableMoveAllStmt),
-
-        SecLabelStmt(Box<super::SecLabelStmt>),
-
-        CreateForeignTableStmt(super::CreateForeignTableStmt),
-
-        ImportForeignSchemaStmt(super::ImportForeignSchemaStmt),
-
-        CreateExtensionStmt(super::CreateExtensionStmt),
-
-        AlterExtensionStmt(super::AlterExtensionStmt),
-
-        AlterExtensionContentsStmt(Box<super::AlterExtensionContentsStmt>),
-
-        CreateEventTrigStmt(super::CreateEventTrigStmt),
-
-        AlterEventTrigStmt(super::AlterEventTrigStmt),
-
-        RefreshMatViewStmt(super::RefreshMatViewStmt),
-
-        ReplicaIdentityStmt(super::ReplicaIdentityStmt),
-
-        AlterSystemStmt(super::AlterSystemStmt),
-
-        CreatePolicyStmt(Box<super::CreatePolicyStmt>),
-
-        AlterPolicyStmt(Box<super::AlterPolicyStmt>),
-
-        CreateTransformStmt(super::CreateTransformStmt),
-
-        CreateAmStmt(super::CreateAmStmt),
-
-        CreatePublicationStmt(super::CreatePublicationStmt),
-
-        AlterPublicationStmt(super::AlterPublicationStmt),
-
-        CreateSubscriptionStmt(super::CreateSubscriptionStmt),
-
-        AlterSubscriptionStmt(super::AlterSubscriptionStmt),
-
-        DropSubscriptionStmt(super::DropSubscriptionStmt),
-
-        CreateStatsStmt(super::CreateStatsStmt),
-
-        AlterCollationStmt(super::AlterCollationStmt),
-
-        CallStmt(Box<super::CallStmt>),
-
-        AlterStatsStmt(super::AlterStatsStmt),
-
-        AExpr(Box<super::AExpr>),
-
-        ColumnRef(super::ColumnRef),
-
-        ParamRef(super::ParamRef),
-
-        AConst(Box<super::AConst>),
-
-        FuncCall(Box<super::FuncCall>),
-
-        AStar(super::AStar),
-
-        AIndices(Box<super::AIndices>),
-
-        AIndirection(Box<super::AIndirection>),
-
-        AArrayExpr(super::AArrayExpr),
-
-        ResTarget(Box<super::ResTarget>),
-
-        MultiAssignRef(Box<super::MultiAssignRef>),
-
-        TypeCast(Box<super::TypeCast>),
-
-        CollateClause(Box<super::CollateClause>),
-
-        SortBy(Box<super::SortBy>),
-
-        WindowDef(Box<super::WindowDef>),
-
-        RangeSubselect(Box<super::RangeSubselect>),
-
-        RangeFunction(super::RangeFunction),
-
-        RangeTableSample(Box<super::RangeTableSample>),
-
-        RangeTableFunc(Box<super::RangeTableFunc>),
-
-        RangeTableFuncCol(Box<super::RangeTableFuncCol>),
-
-        TypeName(super::TypeName),
-
-        ColumnDef(Box<super::ColumnDef>),
-
-        IndexElem(Box<super::IndexElem>),
-
-        Constraint(Box<super::Constraint>),
-
-        DefElem(Box<super::DefElem>),
-
-        RangeTblEntry(Box<super::RangeTblEntry>),
-
-        RangeTblFunction(Box<super::RangeTblFunction>),
-
-        TableSampleClause(Box<super::TableSampleClause>),
-
-        WithCheckOption(Box<super::WithCheckOption>),
-
-        SortGroupClause(super::SortGroupClause),
-
-        GroupingSet(super::GroupingSet),
-
-        WindowClause(Box<super::WindowClause>),
-
-        ObjectWithArgs(super::ObjectWithArgs),
-
-        AccessPriv(super::AccessPriv),
-
-        CreateOpClassItem(super::CreateOpClassItem),
-
-        TableLikeClause(super::TableLikeClause),
-
-        FunctionParameter(Box<super::FunctionParameter>),
-
-        LockingClause(super::LockingClause),
-
-        RowMarkClause(super::RowMarkClause),
-
-        XmlSerialize(Box<super::XmlSerialize>),
-
-        WithClause(super::WithClause),
-
-        InferClause(Box<super::InferClause>),
-
-        OnConflictClause(Box<super::OnConflictClause>),
-
-        CommonTableExpr(Box<super::CommonTableExpr>),
-
-        RoleSpec(super::RoleSpec),
-
-        TriggerTransition(super::TriggerTransition),
-
-        PartitionElem(Box<super::PartitionElem>),
-
-        PartitionSpec(super::PartitionSpec),
-
-        PartitionBoundSpec(super::PartitionBoundSpec),
-
-        PartitionRangeDatum(Box<super::PartitionRangeDatum>),
-
-        PartitionCmd(super::PartitionCmd),
-
-        VacuumRelation(super::VacuumRelation),
-
-        InlineCodeBlock(super::InlineCodeBlock),
-
-        CallContext(super::CallContext),
-
-        Integer(super::Integer),
-
-        Float(super::Float),
-
-        String(super::String2),
-
-        BitString(super::BitString),
-
-        Null(super::Null),
-
-        List(super::List),
-
-        IntList(super::IntList),
-
-        OidList(super::OidList),
-    }
-}
-#[derive(Clone, PartialEq)]
-pub struct Integer {
-    /// machine integer
-
-    pub ival: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Float {
-    /// string
-
-    pub str: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct String2 {
-    /// string
-
-    pub str: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct BitString {
-    /// string
-
-    pub str: String,
-}
-/// intentionally empty
-#[derive(Clone, PartialEq)]
-pub struct Null {}
-#[derive(Clone, PartialEq)]
-pub struct List {
-
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct OidList {
-
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct IntList {
-
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct Alias {
-
-    pub aliasname: String,
-
-    pub colnames: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeVar {
-
-    pub catalogname: String,
-
-    pub schemaname: String,
-
-    pub relname: String,
-
-    pub inh: bool,
-
-    pub relpersistence: String,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TableFunc {
-
-    pub ns_uris: Vec<Node>,
-
-    pub ns_names: Vec<Node>,
-
-    pub docexpr: ::core::option::Option<Box<Node>>,
-
-    pub rowexpr: ::core::option::Option<Box<Node>>,
-
-    pub colnames: Vec<Node>,
-
-    pub coltypes: Vec<Node>,
-
-    pub coltypmods: Vec<Node>,
-
-    pub colcollations: Vec<Node>,
-
-    pub colexprs: Vec<Node>,
-
-    pub coldefexprs: Vec<Node>,
-
-    pub notnulls: Vec<u64>,
-
-    pub ordinalitycol: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Expr {}
-#[derive(Clone, PartialEq)]
-pub struct Var {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub varno: u32,
-
-    pub varattno: i32,
-
-    pub vartype: u32,
-
-    pub vartypmod: i32,
-
-    pub varcollid: u32,
-
-    pub varlevelsup: u32,
-
-    pub varnosyn: u32,
-
-    pub varattnosyn: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Param {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub paramkind: i32,
-
-    pub paramid: i32,
-
-    pub paramtype: u32,
-
-    pub paramtypmod: i32,
-
-    pub paramcollid: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Aggref {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub aggfnoid: u32,
-
-    pub aggtype: u32,
-
-    pub aggcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub aggtranstype: u32,
-
-    pub aggargtypes: Vec<Node>,
-
-    pub aggdirectargs: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub aggorder: Vec<Node>,
-
-    pub aggdistinct: Vec<Node>,
-
-    pub aggfilter: ::core::option::Option<Box<Node>>,
-
-    pub aggstar: bool,
-
-    pub aggvariadic: bool,
-
-    pub aggkind: String,
-
-    pub agglevelsup: u32,
-
-    pub aggsplit: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct GroupingFunc {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub args: Vec<Node>,
-
-    pub refs: Vec<Node>,
-
-    pub cols: Vec<Node>,
-
-    pub agglevelsup: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WindowFunc {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub winfnoid: u32,
-
-    pub wintype: u32,
-
-    pub wincollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub aggfilter: ::core::option::Option<Box<Node>>,
-
-    pub winref: u32,
-
-    pub winstar: bool,
-
-    pub winagg: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SubscriptingRef {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub refcontainertype: u32,
-
-    pub refelemtype: u32,
-
-    pub reftypmod: i32,
-
-    pub refcollid: u32,
-
-    pub refupperindexpr: Vec<Node>,
-
-    pub reflowerindexpr: Vec<Node>,
-
-    pub refexpr: ::core::option::Option<Box<Node>>,
-
-    pub refassgnexpr: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct FuncExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub funcid: u32,
-
-    pub funcresulttype: u32,
-
-    pub funcretset: bool,
-
-    pub funcvariadic: bool,
-
-    pub funcformat: i32,
-
-    pub funccollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NamedArgExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub name: String,
-
-    pub argnumber: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct OpExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub opresulttype: u32,
-
-    pub opretset: bool,
-
-    pub opcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct DistinctExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub opresulttype: u32,
-
-    pub opretset: bool,
-
-    pub opcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NullIfExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub opresulttype: u32,
-
-    pub opretset: bool,
-
-    pub opcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ScalarArrayOpExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub use_or: bool,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct BoolExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub boolop: i32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SubLink {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub sub_link_type: i32,
-
-    pub sub_link_id: i32,
-
-    pub testexpr: ::core::option::Option<Box<Node>>,
-
-    pub oper_name: Vec<Node>,
-
-    pub subselect: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SubPlan {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub sub_link_type: i32,
-
-    pub testexpr: ::core::option::Option<Box<Node>>,
-
-    pub param_ids: Vec<Node>,
-
-    pub plan_id: i32,
-
-    pub plan_name: String,
-
-    pub first_col_type: u32,
-
-    pub first_col_typmod: i32,
-
-    pub first_col_collation: u32,
-
-    pub use_hash_table: bool,
-
-    pub unknown_eq_false: bool,
-
-    pub parallel_safe: bool,
-
-    pub set_param: Vec<Node>,
-
-    pub par_param: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub startup_cost: f64,
-
-    pub per_call_cost: f64,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlternativeSubPlan {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub subplans: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct FieldSelect {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub fieldnum: i32,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FieldStore {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub newvals: Vec<Node>,
-
-    pub fieldnums: Vec<Node>,
-
-    pub resulttype: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RelabelType {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-
-    pub relabelformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoerceViaIo {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resultcollid: u32,
-
-    pub coerceformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ArrayCoerceExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub elemexpr: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-
-    pub coerceformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ConvertRowtypeExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub convertformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CollateExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub coll_oid: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CaseExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub casetype: u32,
-
-    pub casecollid: u32,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub args: Vec<Node>,
-
-    pub defresult: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CaseWhen {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub result: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CaseTestExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub type_id: u32,
-
-    pub type_mod: i32,
-
-    pub collation: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ArrayExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub array_typeid: u32,
-
-    pub array_collid: u32,
-
-    pub element_typeid: u32,
-
-    pub elements: Vec<Node>,
-
-    pub multidims: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RowExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub args: Vec<Node>,
-
-    pub row_typeid: u32,
-
-    pub row_format: i32,
-
-    pub colnames: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RowCompareExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub rctype: i32,
-
-    pub opnos: Vec<Node>,
-
-    pub opfamilies: Vec<Node>,
-
-    pub inputcollids: Vec<Node>,
-
-    pub largs: Vec<Node>,
-
-    pub rargs: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoalesceExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub coalescetype: u32,
-
-    pub coalescecollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct MinMaxExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub minmaxtype: u32,
-
-    pub minmaxcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub op: i32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SqlValueFunction {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub op: i32,
-
-    pub r#type: u32,
-
-    pub typmod: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct XmlExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub op: i32,
-
-    pub name: String,
-
-    pub named_args: Vec<Node>,
-
-    pub arg_names: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub xmloption: i32,
-
-    pub r#type: u32,
-
-    pub typmod: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NullTest {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub nulltesttype: i32,
-
-    pub argisrow: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct BooleanTest {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub booltesttype: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoerceToDomain {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-
-    pub coercionformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoerceToDomainValue {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub type_id: u32,
-
-    pub type_mod: i32,
-
-    pub collation: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SetToDefault {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub type_id: u32,
-
-    pub type_mod: i32,
-
-    pub collation: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CurrentOfExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub cvarno: u32,
-
-    pub cursor_name: String,
-
-    pub cursor_param: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NextValueExpr {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub seqid: u32,
-
-    pub type_id: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct InferenceElem {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub infercollid: u32,
-
-    pub inferopclass: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TargetEntry {
-
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub resno: i32,
-
-    pub resname: String,
-
-    pub ressortgroupref: u32,
-
-    pub resorigtbl: u32,
-
-    pub resorigcol: i32,
-
-    pub resjunk: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTblRef {
-
-    pub rtindex: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct JoinExpr {
-
-    pub jointype: i32,
-
-    pub is_natural: bool,
-
-    pub larg: ::core::option::Option<Box<Node>>,
-
-    pub rarg: ::core::option::Option<Box<Node>>,
-
-    pub using_clause: Vec<Node>,
-
-    pub quals: ::core::option::Option<Box<Node>>,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub rtindex: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FromExpr {
-
-    pub fromlist: Vec<Node>,
-
-    pub quals: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct OnConflictExpr {
-
-    pub action: i32,
-
-    pub arbiter_elems: Vec<Node>,
-
-    pub arbiter_where: ::core::option::Option<Box<Node>>,
-
-    pub constraint: u32,
-
-    pub on_conflict_set: Vec<Node>,
-
-    pub on_conflict_where: ::core::option::Option<Box<Node>>,
-
-    pub excl_rel_index: i32,
-
-    pub excl_rel_tlist: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct IntoClause {
-
-    pub rel: ::core::option::Option<RangeVar>,
-
-    pub col_names: Vec<Node>,
-
-    pub access_method: String,
-
-    pub options: Vec<Node>,
-
-    pub on_commit: i32,
-
-    pub table_space_name: String,
-
-    pub view_query: ::core::option::Option<Box<Node>>,
-
-    pub skip_data: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct RawStmt {
-
-    pub stmt: ::core::option::Option<Box<Node>>,
-
-    pub stmt_location: i32,
-
-    pub stmt_len: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Query {
-
-    pub command_type: i32,
-
-    pub query_source: i32,
-
-    pub can_set_tag: bool,
-
-    pub utility_stmt: ::core::option::Option<Box<Node>>,
-
-    pub result_relation: i32,
-
-    pub has_aggs: bool,
-
-    pub has_window_funcs: bool,
-
-    pub has_target_srfs: bool,
-
-    pub has_sub_links: bool,
-
-    pub has_distinct_on: bool,
-
-    pub has_recursive: bool,
-
-    pub has_modifying_cte: bool,
-
-    pub has_for_update: bool,
-
-    pub has_row_security: bool,
-
-    pub cte_list: Vec<Node>,
-
-    pub rtable: Vec<Node>,
-
-    pub jointree: ::core::option::Option<Box<FromExpr>>,
-
-    pub target_list: Vec<Node>,
-
-    pub r#override: i32,
-
-    pub on_conflict: ::core::option::Option<Box<OnConflictExpr>>,
-
-    pub returning_list: Vec<Node>,
-
-    pub group_clause: Vec<Node>,
-
-    pub grouping_sets: Vec<Node>,
-
-    pub having_qual: ::core::option::Option<Box<Node>>,
-
-    pub window_clause: Vec<Node>,
-
-    pub distinct_clause: Vec<Node>,
-
-    pub sort_clause: Vec<Node>,
-
-    pub limit_offset: ::core::option::Option<Box<Node>>,
-
-    pub limit_count: ::core::option::Option<Box<Node>>,
-
-    pub limit_option: i32,
-
-    pub row_marks: Vec<Node>,
-
-    pub set_operations: ::core::option::Option<Box<Node>>,
-
-    pub constraint_deps: Vec<Node>,
-
-    pub with_check_options: Vec<Node>,
-
-    pub stmt_location: i32,
-
-    pub stmt_len: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct InsertStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub cols: Vec<Node>,
-
-    pub select_stmt: ::core::option::Option<Box<Node>>,
-
-    pub on_conflict_clause: ::core::option::Option<Box<OnConflictClause>>,
-
-    pub returning_list: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-
-    pub r#override: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct DeleteStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub using_clause: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub returning_list: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-}
-#[derive(Clone, PartialEq)]
-pub struct UpdateStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub target_list: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub from_clause: Vec<Node>,
-
-    pub returning_list: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-}
-#[derive(Clone, PartialEq)]
-pub struct SelectStmt {
-
-    pub distinct_clause: Vec<Node>,
-
-    pub into_clause: ::core::option::Option<Box<IntoClause>>,
-
-    pub target_list: Vec<Node>,
-
-    pub from_clause: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub group_clause: Vec<Node>,
-
-    pub having_clause: ::core::option::Option<Box<Node>>,
-
-    pub window_clause: Vec<Node>,
-
-    pub values_lists: Vec<Node>,
-
-    pub sort_clause: Vec<Node>,
-
-    pub limit_offset: ::core::option::Option<Box<Node>>,
-
-    pub limit_count: ::core::option::Option<Box<Node>>,
-
-    pub limit_option: i32,
-
-    pub locking_clause: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-
-    pub op: i32,
-
-    pub all: bool,
-
-    pub larg: ::core::option::Option<Box<SelectStmt>>,
-
-    pub rarg: ::core::option::Option<Box<SelectStmt>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub cmds: Vec<Node>,
-
-    pub relkind: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableCmd {
-
-    pub subtype: i32,
-
-    pub name: String,
-
-    pub num: i32,
-
-    pub newowner: ::core::option::Option<RoleSpec>,
-
-    pub def: ::core::option::Option<Box<Node>>,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDomainStmt {
-
-    pub subtype: String,
-
-    pub type_name: Vec<Node>,
-
-    pub name: String,
-
-    pub def: ::core::option::Option<Box<Node>>,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct SetOperationStmt {
-
-    pub op: i32,
-
-    pub all: bool,
-
-    pub larg: ::core::option::Option<Box<Node>>,
-
-    pub rarg: ::core::option::Option<Box<Node>>,
-
-    pub col_types: Vec<Node>,
-
-    pub col_typmods: Vec<Node>,
-
-    pub col_collations: Vec<Node>,
-
-    pub group_clauses: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct GrantStmt {
-
-    pub is_grant: bool,
-
-    pub targtype: i32,
-
-    pub objtype: i32,
-
-    pub objects: Vec<Node>,
-
-    pub privileges: Vec<Node>,
-
-    pub grantees: Vec<Node>,
-
-    pub grant_option: bool,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct GrantRoleStmt {
-
-    pub granted_roles: Vec<Node>,
-
-    pub grantee_roles: Vec<Node>,
-
-    pub is_grant: bool,
-
-    pub admin_opt: bool,
-
-    pub grantor: ::core::option::Option<RoleSpec>,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDefaultPrivilegesStmt {
-
-    pub options: Vec<Node>,
-
-    pub action: ::core::option::Option<GrantStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ClosePortalStmt {
-
-    pub portalname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct ClusterStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub indexname: String,
-
-    pub options: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CopyStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub attlist: Vec<Node>,
-
-    pub is_from: bool,
-
-    pub is_program: bool,
-
-    pub filename: String,
-
-    pub options: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub table_elts: Vec<Node>,
-
-    pub inh_relations: Vec<Node>,
-
-    pub partbound: ::core::option::Option<PartitionBoundSpec>,
-
-    pub partspec: ::core::option::Option<PartitionSpec>,
-
-    pub of_typename: ::core::option::Option<TypeName>,
-
-    pub constraints: Vec<Node>,
-
-    pub options: Vec<Node>,
-
-    pub oncommit: i32,
-
-    pub tablespacename: String,
-
-    pub access_method: String,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct DefineStmt {
-
-    pub kind: i32,
-
-    pub oldstyle: bool,
-
-    pub defnames: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub definition: Vec<Node>,
-
-    pub if_not_exists: bool,
-
-    pub replace: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropStmt {
-
-    pub objects: Vec<Node>,
-
-    pub remove_type: i32,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-
-    pub concurrent: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct TruncateStmt {
-
-    pub relations: Vec<Node>,
-
-    pub restart_seqs: bool,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CommentStmt {
-
-    pub objtype: i32,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub comment: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct FetchStmt {
-
-    pub direction: i32,
-
-    pub how_many: i64,
-
-    pub portalname: String,
-
-    pub ismove: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct IndexStmt {
-
-    pub idxname: String,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub access_method: String,
-
-    pub table_space: String,
-
-    pub index_params: Vec<Node>,
-
-    pub index_including_params: Vec<Node>,
-
-    pub options: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub exclude_op_names: Vec<Node>,
-
-    pub idxcomment: String,
-
-    pub index_oid: u32,
-
-    pub old_node: u32,
-
-    pub old_create_subid: u32,
-
-    pub old_first_relfilenode_subid: u32,
-
-    pub unique: bool,
-
-    pub primary: bool,
-
-    pub isconstraint: bool,
-
-    pub deferrable: bool,
-
-    pub initdeferred: bool,
-
-    pub transformed: bool,
-
-    pub concurrent: bool,
-
-    pub if_not_exists: bool,
-
-    pub reset_default_tblspc: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateFunctionStmt {
-
-    pub is_procedure: bool,
-
-    pub replace: bool,
-
-    pub funcname: Vec<Node>,
-
-    pub parameters: Vec<Node>,
-
-    pub return_type: ::core::option::Option<TypeName>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterFunctionStmt {
-
-    pub objtype: i32,
-
-    pub func: ::core::option::Option<ObjectWithArgs>,
-
-    pub actions: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DoStmt {
-
-    pub args: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RenameStmt {
-
-    pub rename_type: i32,
-
-    pub relation_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub subname: String,
-
-    pub newname: String,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct RuleStmt {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub rulename: String,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub event: i32,
-
-    pub instead: bool,
-
-    pub actions: Vec<Node>,
-
-    pub replace: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct NotifyStmt {
-
-    pub conditionname: String,
-
-    pub payload: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct ListenStmt {
-
-    pub conditionname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct UnlistenStmt {
-
-    pub conditionname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct TransactionStmt {
-
-    pub kind: i32,
-
-    pub options: Vec<Node>,
-
-    pub savepoint_name: String,
-
-    pub gid: String,
-
-    pub chain: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ViewStmt {
-
-    pub view: ::core::option::Option<RangeVar>,
-
-    pub aliases: Vec<Node>,
-
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub replace: bool,
-
-    pub options: Vec<Node>,
-
-    pub with_check_option: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct LoadStmt {
-
-    pub filename: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateDomainStmt {
-
-    pub domainname: Vec<Node>,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub coll_clause: ::core::option::Option<Box<CollateClause>>,
-
-    pub constraints: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatedbStmt {
-
-    pub dbname: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropdbStmt {
-
-    pub dbname: String,
-
-    pub missing_ok: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct VacuumStmt {
-
-    pub options: Vec<Node>,
-
-    pub rels: Vec<Node>,
-
-    pub is_vacuumcmd: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ExplainStmt {
-
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTableAsStmt {
-
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub into: ::core::option::Option<Box<IntoClause>>,
-
-    pub relkind: i32,
-
-    pub is_select_into: bool,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateSeqStmt {
-
-    pub sequence: ::core::option::Option<RangeVar>,
-
-    pub options: Vec<Node>,
-
-    pub owner_id: u32,
-
-    pub for_identity: bool,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterSeqStmt {
-
-    pub sequence: ::core::option::Option<RangeVar>,
-
-    pub options: Vec<Node>,
-
-    pub for_identity: bool,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct VariableSetStmt {
-
-    pub kind: i32,
-
-    pub name: String,
-
-    pub args: Vec<Node>,
-
-    pub is_local: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct VariableShowStmt {
-
-    pub name: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct DiscardStmt {
-
-    pub target: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTrigStmt {
-
-    pub trigname: String,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub funcname: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub row: bool,
-
-    pub timing: i32,
-
-    pub events: i32,
-
-    pub columns: Vec<Node>,
-
-    pub when_clause: ::core::option::Option<Box<Node>>,
-
-    pub isconstraint: bool,
-
-    pub transition_rels: Vec<Node>,
-
-    pub deferrable: bool,
-
-    pub initdeferred: bool,
-
-    pub constrrel: ::core::option::Option<RangeVar>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatePLangStmt {
-
-    pub replace: bool,
-
-    pub plname: String,
-
-    pub plhandler: Vec<Node>,
-
-    pub plinline: Vec<Node>,
-
-    pub plvalidator: Vec<Node>,
-
-    pub pltrusted: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateRoleStmt {
-
-    pub stmt_type: i32,
-
-    pub role: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterRoleStmt {
-
-    pub role: ::core::option::Option<RoleSpec>,
-
-    pub options: Vec<Node>,
-
-    pub action: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropRoleStmt {
-
-    pub roles: Vec<Node>,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct LockStmt {
-
-    pub relations: Vec<Node>,
-
-    pub mode: i32,
-
-    pub nowait: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ConstraintsSetStmt {
-
-    pub constraints: Vec<Node>,
-
-    pub deferred: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ReindexStmt {
-
-    pub kind: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub name: String,
-
-    pub options: i32,
-
-    pub concurrent: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CheckPointStmt {}
-#[derive(Clone, PartialEq)]
-pub struct CreateSchemaStmt {
-
-    pub schemaname: String,
-
-    pub authrole: ::core::option::Option<RoleSpec>,
-
-    pub schema_elts: Vec<Node>,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDatabaseStmt {
-
-    pub dbname: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDatabaseSetStmt {
-
-    pub dbname: String,
-
-    pub setstmt: ::core::option::Option<VariableSetStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterRoleSetStmt {
-
-    pub role: ::core::option::Option<RoleSpec>,
-
-    pub database: String,
-
-    pub setstmt: ::core::option::Option<VariableSetStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateConversionStmt {
-
-    pub conversion_name: Vec<Node>,
-
-    pub for_encoding_name: String,
-
-    pub to_encoding_name: String,
-
-    pub func_name: Vec<Node>,
-
-    pub def: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateCastStmt {
-
-    pub sourcetype: ::core::option::Option<TypeName>,
-
-    pub targettype: ::core::option::Option<TypeName>,
-
-    pub func: ::core::option::Option<ObjectWithArgs>,
-
-    pub context: i32,
-
-    pub inout: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateOpClassStmt {
-
-    pub opclassname: Vec<Node>,
-
-    pub opfamilyname: Vec<Node>,
-
-    pub amname: String,
-
-    pub datatype: ::core::option::Option<TypeName>,
-
-    pub items: Vec<Node>,
-
-    pub is_default: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateOpFamilyStmt {
-
-    pub opfamilyname: Vec<Node>,
-
-    pub amname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterOpFamilyStmt {
-
-    pub opfamilyname: Vec<Node>,
-
-    pub amname: String,
-
-    pub is_drop: bool,
-
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct PrepareStmt {
-
-    pub name: String,
-
-    pub argtypes: Vec<Node>,
-
-    pub query: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ExecuteStmt {
-
-    pub name: String,
-
-    pub params: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DeallocateStmt {
-
-    pub name: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct DeclareCursorStmt {
-
-    pub portalname: String,
-
-    pub options: i32,
-
-    pub query: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTableSpaceStmt {
-
-    pub tablespacename: String,
-
-    pub owner: ::core::option::Option<RoleSpec>,
-
-    pub location: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropTableSpaceStmt {
-
-    pub tablespacename: String,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterObjectDependsStmt {
-
-    pub object_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub extname: ::core::option::Option<Box<Node>>,
-
-    pub remove: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterObjectSchemaStmt {
-
-    pub object_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub newschema: String,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterOwnerStmt {
-
-    pub object_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub newowner: ::core::option::Option<RoleSpec>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterOperatorStmt {
-
-    pub opername: ::core::option::Option<ObjectWithArgs>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTypeStmt {
-
-    pub type_name: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropOwnedStmt {
-
-    pub roles: Vec<Node>,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ReassignOwnedStmt {
-
-    pub roles: Vec<Node>,
-
-    pub newrole: ::core::option::Option<RoleSpec>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CompositeTypeStmt {
-
-    pub typevar: ::core::option::Option<RangeVar>,
-
-    pub coldeflist: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateEnumStmt {
-
-    pub type_name: Vec<Node>,
-
-    pub vals: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateRangeStmt {
-
-    pub type_name: Vec<Node>,
-
-    pub params: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterEnumStmt {
-
-    pub type_name: Vec<Node>,
-
-    pub old_val: String,
-
-    pub new_val: String,
-
-    pub new_val_neighbor: String,
-
-    pub new_val_is_after: bool,
-
-    pub skip_if_new_val_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTsDictionaryStmt {
-
-    pub dictname: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTsConfigurationStmt {
-
-    pub kind: i32,
-
-    pub cfgname: Vec<Node>,
-
-    pub tokentype: Vec<Node>,
-
-    pub dicts: Vec<Node>,
-
-    pub r#override: bool,
-
-    pub replace: bool,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateFdwStmt {
-
-    pub fdwname: String,
-
-    pub func_options: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterFdwStmt {
-
-    pub fdwname: String,
-
-    pub func_options: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateForeignServerStmt {
-
-    pub servername: String,
-
-    pub servertype: String,
-
-    pub version: String,
-
-    pub fdwname: String,
-
-    pub if_not_exists: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterForeignServerStmt {
-
-    pub servername: String,
-
-    pub version: String,
-
-    pub options: Vec<Node>,
-
-    pub has_version: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateUserMappingStmt {
-
-    pub user: ::core::option::Option<RoleSpec>,
-
-    pub servername: String,
-
-    pub if_not_exists: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterUserMappingStmt {
-
-    pub user: ::core::option::Option<RoleSpec>,
-
-    pub servername: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropUserMappingStmt {
-
-    pub user: ::core::option::Option<RoleSpec>,
-
-    pub servername: String,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableSpaceOptionsStmt {
-
-    pub tablespacename: String,
-
-    pub options: Vec<Node>,
-
-    pub is_reset: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableMoveAllStmt {
-
-    pub orig_tablespacename: String,
-
-    pub objtype: i32,
-
-    pub roles: Vec<Node>,
-
-    pub new_tablespacename: String,
-
-    pub nowait: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct SecLabelStmt {
-
-    pub objtype: i32,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub provider: String,
-
-    pub label: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateForeignTableStmt {
-
-    pub base_stmt: ::core::option::Option<CreateStmt>,
-
-    pub servername: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ImportForeignSchemaStmt {
-
-    pub server_name: String,
-
-    pub remote_schema: String,
-
-    pub local_schema: String,
-
-    pub list_type: i32,
-
-    pub table_list: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateExtensionStmt {
-
-    pub extname: String,
-
-    pub if_not_exists: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterExtensionStmt {
-
-    pub extname: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterExtensionContentsStmt {
-
-    pub extname: String,
-
-    pub action: i32,
-
-    pub objtype: i32,
-
-    pub object: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateEventTrigStmt {
-
-    pub trigname: String,
-
-    pub eventname: String,
-
-    pub whenclause: Vec<Node>,
-
-    pub funcname: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterEventTrigStmt {
-
-    pub trigname: String,
-
-    pub tgenabled: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct RefreshMatViewStmt {
-
-    pub concurrent: bool,
-
-    pub skip_data: bool,
-
-    pub relation: ::core::option::Option<RangeVar>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ReplicaIdentityStmt {
-
-    pub identity_type: String,
-
-    pub name: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterSystemStmt {
-
-    pub setstmt: ::core::option::Option<VariableSetStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatePolicyStmt {
-
-    pub policy_name: String,
-
-    pub table: ::core::option::Option<RangeVar>,
-
-    pub cmd_name: String,
-
-    pub permissive: bool,
-
-    pub roles: Vec<Node>,
-
-    pub qual: ::core::option::Option<Box<Node>>,
-
-    pub with_check: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterPolicyStmt {
-
-    pub policy_name: String,
-
-    pub table: ::core::option::Option<RangeVar>,
-
-    pub roles: Vec<Node>,
-
-    pub qual: ::core::option::Option<Box<Node>>,
-
-    pub with_check: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTransformStmt {
-
-    pub replace: bool,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub lang: String,
-
-    pub fromsql: ::core::option::Option<ObjectWithArgs>,
-
-    pub tosql: ::core::option::Option<ObjectWithArgs>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateAmStmt {
-
-    pub amname: String,
-
-    pub handler_name: Vec<Node>,
-
-    pub amtype: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatePublicationStmt {
-
-    pub pubname: String,
-
-    pub options: Vec<Node>,
-
-    pub tables: Vec<Node>,
-
-    pub for_all_tables: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterPublicationStmt {
-
-    pub pubname: String,
-
-    pub options: Vec<Node>,
-
-    pub tables: Vec<Node>,
-
-    pub for_all_tables: bool,
-
-    pub table_action: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateSubscriptionStmt {
-
-    pub subname: String,
-
-    pub conninfo: String,
-
-    pub publication: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterSubscriptionStmt {
-
-    pub kind: i32,
-
-    pub subname: String,
-
-    pub conninfo: String,
-
-    pub publication: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropSubscriptionStmt {
-
-    pub subname: String,
-
-    pub missing_ok: bool,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateStatsStmt {
-
-    pub defnames: Vec<Node>,
-
-    pub stat_types: Vec<Node>,
-
-    pub exprs: Vec<Node>,
-
-    pub relations: Vec<Node>,
-
-    pub stxcomment: String,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterCollationStmt {
-
-    pub collname: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CallStmt {
-
-    pub funccall: ::core::option::Option<Box<FuncCall>>,
-
-    pub funcexpr: ::core::option::Option<Box<FuncExpr>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterStatsStmt {
-
-    pub defnames: Vec<Node>,
-
-    pub stxstattarget: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AExpr {
-
-    pub kind: i32,
-
-    pub name: Vec<Node>,
-
-    pub lexpr: ::core::option::Option<Box<Node>>,
-
-    pub rexpr: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ColumnRef {
-
-    pub fields: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ParamRef {
-
-    pub number: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct AConst {
-
-    pub val: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FuncCall {
-
-    pub funcname: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub agg_order: Vec<Node>,
-
-    pub agg_filter: ::core::option::Option<Box<Node>>,
-
-    pub agg_within_group: bool,
-
-    pub agg_star: bool,
-
-    pub agg_distinct: bool,
-
-    pub func_variadic: bool,
-
-    pub over: ::core::option::Option<Box<WindowDef>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct AStar {}
-#[derive(Clone, PartialEq)]
-pub struct AIndices {
-
-    pub is_slice: bool,
-
-    pub lidx: ::core::option::Option<Box<Node>>,
-
-    pub uidx: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AIndirection {
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub indirection: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AArrayExpr {
-
-    pub elements: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ResTarget {
-
-    pub name: String,
-
-    pub indirection: Vec<Node>,
-
-    pub val: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct MultiAssignRef {
-
-    pub source: ::core::option::Option<Box<Node>>,
-
-    pub colno: i32,
-
-    pub ncolumns: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TypeCast {
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CollateClause {
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub collname: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SortBy {
-
-    pub node: ::core::option::Option<Box<Node>>,
-
-    pub sortby_dir: i32,
-
-    pub sortby_nulls: i32,
-
-    pub use_op: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WindowDef {
-
-    pub name: String,
-
-    pub refname: String,
-
-    pub partition_clause: Vec<Node>,
-
-    pub order_clause: Vec<Node>,
-
-    pub frame_options: i32,
-
-    pub start_offset: ::core::option::Option<Box<Node>>,
-
-    pub end_offset: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeSubselect {
-
-    pub lateral: bool,
-
-    pub subquery: ::core::option::Option<Box<Node>>,
-
-    pub alias: ::core::option::Option<Alias>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeFunction {
-
-    pub lateral: bool,
-
-    pub ordinality: bool,
-
-    pub is_rowsfrom: bool,
-
-    pub functions: Vec<Node>,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub coldeflist: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTableSample {
-
-    pub relation: ::core::option::Option<Box<Node>>,
-
-    pub method: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub repeatable: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTableFunc {
-
-    pub lateral: bool,
-
-    pub docexpr: ::core::option::Option<Box<Node>>,
-
-    pub rowexpr: ::core::option::Option<Box<Node>>,
-
-    pub namespaces: Vec<Node>,
-
-    pub columns: Vec<Node>,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTableFuncCol {
-
-    pub colname: String,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub for_ordinality: bool,
-
-    pub is_not_null: bool,
-
-    pub colexpr: ::core::option::Option<Box<Node>>,
-
-    pub coldefexpr: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TypeName {
-
-    pub names: Vec<Node>,
-
-    pub type_oid: u32,
-
-    pub setof: bool,
-
-    pub pct_type: bool,
-
-    pub typmods: Vec<Node>,
-
-    pub typemod: i32,
-
-    pub array_bounds: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ColumnDef {
-
-    pub colname: String,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub inhcount: i32,
-
-    pub is_local: bool,
-
-    pub is_not_null: bool,
-
-    pub is_from_type: bool,
-
-    pub storage: String,
-
-    pub raw_default: ::core::option::Option<Box<Node>>,
-
-    pub cooked_default: ::core::option::Option<Box<Node>>,
-
-    pub identity: String,
-
-    pub identity_sequence: ::core::option::Option<RangeVar>,
-
-    pub generated: String,
-
-    pub coll_clause: ::core::option::Option<Box<CollateClause>>,
-
-    pub coll_oid: u32,
-
-    pub constraints: Vec<Node>,
-
-    pub fdwoptions: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct IndexElem {
-
-    pub name: String,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub indexcolname: String,
-
-    pub collation: Vec<Node>,
-
-    pub opclass: Vec<Node>,
-
-    pub opclassopts: Vec<Node>,
-
-    pub ordering: i32,
-
-    pub nulls_ordering: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Constraint {
-
-    pub contype: i32,
-
-    pub conname: String,
-
-    pub deferrable: bool,
-
-    pub initdeferred: bool,
-
-    pub location: i32,
-
-    pub is_no_inherit: bool,
-
-    pub raw_expr: ::core::option::Option<Box<Node>>,
-
-    pub cooked_expr: String,
-
-    pub generated_when: String,
-
-    pub keys: Vec<Node>,
-
-    pub including: Vec<Node>,
-
-    pub exclusions: Vec<Node>,
-
-    pub options: Vec<Node>,
-
-    pub indexname: String,
-
-    pub indexspace: String,
-
-    pub reset_default_tblspc: bool,
-
-    pub access_method: String,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub pktable: ::core::option::Option<RangeVar>,
-
-    pub fk_attrs: Vec<Node>,
-
-    pub pk_attrs: Vec<Node>,
-
-    pub fk_matchtype: String,
-
-    pub fk_upd_action: String,
-
-    pub fk_del_action: String,
-
-    pub old_conpfeqop: Vec<Node>,
-
-    pub old_pktable_oid: u32,
-
-    pub skip_validation: bool,
-
-    pub initially_valid: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct DefElem {
-
-    pub defnamespace: String,
-
-    pub defname: String,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub defaction: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTblEntry {
-
-    pub rtekind: i32,
-
-    pub relid: u32,
-
-    pub relkind: String,
-
-    pub rellockmode: i32,
-
-    pub tablesample: ::core::option::Option<Box<TableSampleClause>>,
-
-    pub subquery: ::core::option::Option<Box<Query>>,
-
-    pub security_barrier: bool,
-
-    pub jointype: i32,
-
-    pub joinmergedcols: i32,
-
-    pub joinaliasvars: Vec<Node>,
-
-    pub joinleftcols: Vec<Node>,
-
-    pub joinrightcols: Vec<Node>,
-
-    pub functions: Vec<Node>,
-
-    pub funcordinality: bool,
-
-    pub tablefunc: ::core::option::Option<Box<TableFunc>>,
-
-    pub values_lists: Vec<Node>,
-
-    pub ctename: String,
-
-    pub ctelevelsup: u32,
-
-    pub self_reference: bool,
-
-    pub coltypes: Vec<Node>,
-
-    pub coltypmods: Vec<Node>,
-
-    pub colcollations: Vec<Node>,
-
-    pub enrname: String,
-
-    pub enrtuples: f64,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub eref: ::core::option::Option<Alias>,
-
-    pub lateral: bool,
-
-    pub inh: bool,
-
-    pub in_from_cl: bool,
-
-    pub required_perms: u32,
-
-    pub check_as_user: u32,
-
-    pub selected_cols: Vec<u64>,
-
-    pub inserted_cols: Vec<u64>,
-
-    pub updated_cols: Vec<u64>,
-
-    pub extra_updated_cols: Vec<u64>,
-
-    pub security_quals: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTblFunction {
-
-    pub funcexpr: ::core::option::Option<Box<Node>>,
-
-    pub funccolcount: i32,
-
-    pub funccolnames: Vec<Node>,
-
-    pub funccoltypes: Vec<Node>,
-
-    pub funccoltypmods: Vec<Node>,
-
-    pub funccolcollations: Vec<Node>,
-
-    pub funcparams: Vec<u64>,
-}
-#[derive(Clone, PartialEq)]
-pub struct TableSampleClause {
-
-    pub tsmhandler: u32,
-
-    pub args: Vec<Node>,
-
-    pub repeatable: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct WithCheckOption {
-
-    pub kind: i32,
-
-    pub relname: String,
-
-    pub polname: String,
-
-    pub qual: ::core::option::Option<Box<Node>>,
-
-    pub cascaded: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct SortGroupClause {
-
-    pub tle_sort_group_ref: u32,
-
-    pub eqop: u32,
-
-    pub sortop: u32,
-
-    pub nulls_first: bool,
-
-    pub hashable: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct GroupingSet {
-
-    pub kind: i32,
-
-    pub content: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WindowClause {
-
-    pub name: String,
-
-    pub refname: String,
-
-    pub partition_clause: Vec<Node>,
-
-    pub order_clause: Vec<Node>,
-
-    pub frame_options: i32,
-
-    pub start_offset: ::core::option::Option<Box<Node>>,
-
-    pub end_offset: ::core::option::Option<Box<Node>>,
-
-    pub start_in_range_func: u32,
-
-    pub end_in_range_func: u32,
-
-    pub in_range_coll: u32,
-
-    pub in_range_asc: bool,
-
-    pub in_range_nulls_first: bool,
-
-    pub winref: u32,
-
-    pub copied_order: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ObjectWithArgs {
-
-    pub objname: Vec<Node>,
-
-    pub objargs: Vec<Node>,
-
-    pub args_unspecified: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AccessPriv {
-
-    pub priv_name: String,
-
-    pub cols: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateOpClassItem {
-
-    pub itemtype: i32,
-
-    pub name: ::core::option::Option<ObjectWithArgs>,
-
-    pub number: i32,
-
-    pub order_family: Vec<Node>,
-
-    pub class_args: Vec<Node>,
-
-    pub storedtype: ::core::option::Option<TypeName>,
-}
-#[derive(Clone, PartialEq)]
-pub struct TableLikeClause {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub options: u32,
-
-    pub relation_oid: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FunctionParameter {
-
-    pub name: String,
-
-    pub arg_type: ::core::option::Option<TypeName>,
-
-    pub mode: i32,
-
-    pub defexpr: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct LockingClause {
-
-    pub locked_rels: Vec<Node>,
-
-    pub strength: i32,
-
-    pub wait_policy: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RowMarkClause {
-
-    pub rti: u32,
-
-    pub strength: i32,
-
-    pub wait_policy: i32,
-
-    pub pushed_down: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct XmlSerialize {
-
-    pub xmloption: i32,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WithClause {
-
-    pub ctes: Vec<Node>,
-
-    pub recursive: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct InferClause {
-
-    pub index_elems: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub conname: String,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct OnConflictClause {
-
-    pub action: i32,
-
-    pub infer: ::core::option::Option<Box<InferClause>>,
-
-    pub target_list: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CommonTableExpr {
-
-    pub ctename: String,
-
-    pub aliascolnames: Vec<Node>,
-
-    pub ctematerialized: i32,
-
-    pub ctequery: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-
-    pub cterecursive: bool,
-
-    pub cterefcount: i32,
-
-    pub ctecolnames: Vec<Node>,
-
-    pub ctecoltypes: Vec<Node>,
-
-    pub ctecoltypmods: Vec<Node>,
-
-    pub ctecolcollations: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RoleSpec {
-
-    pub roletype: i32,
-
-    pub rolename: String,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TriggerTransition {
-
-    pub name: String,
-
-    pub is_new: bool,
-
-    pub is_table: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionElem {
-
-    pub name: String,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub collation: Vec<Node>,
-
-    pub opclass: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionSpec {
-
-    pub strategy: String,
-
-    pub part_params: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionBoundSpec {
-
-    pub strategy: String,
-
-    pub is_default: bool,
-
-    pub modulus: i32,
-
-    pub remainder: i32,
-
-    pub listdatums: Vec<Node>,
-
-    pub lowerdatums: Vec<Node>,
-
-    pub upperdatums: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionRangeDatum {
-
-    pub kind: i32,
-
-    pub value: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionCmd {
-
-    pub name: ::core::option::Option<RangeVar>,
-
-    pub bound: ::core::option::Option<PartitionBoundSpec>,
-}
-#[derive(Clone, PartialEq)]
-pub struct VacuumRelation {
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub oid: u32,
-
-    pub va_cols: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct InlineCodeBlock {
-
-    pub source_text: String,
-
-    pub lang_oid: u32,
-
-    pub lang_is_trusted: bool,
-
-    pub atomic: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CallContext {
-
-    pub atomic: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ScanToken {
-
-    pub start: i32,
-
-    pub end: i32,
-
-    pub token: i32,
-
-    pub keyword_kind: i32,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum OverridingKind {
-    Undefined = 0,
-    OverridingNotSet = 1,
-    OverridingUserValue = 2,
-    OverridingSystemValue = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum QuerySource {
-    Undefined = 0,
-    QsrcOriginal = 1,
-    QsrcParser = 2,
-    QsrcInsteadRule = 3,
-    QsrcQualInsteadRule = 4,
-    QsrcNonInsteadRule = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SortByDir {
-    Undefined = 0,
-    SortbyDefault = 1,
-    SortbyAsc = 2,
-    SortbyDesc = 3,
-    SortbyUsing = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SortByNulls {
-    Undefined = 0,
-    SortbyNullsDefault = 1,
-    SortbyNullsFirst = 2,
-    SortbyNullsLast = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AExprKind {
-    Undefined = 0,
-    AexprOp = 1,
-    AexprOpAny = 2,
-    AexprOpAll = 3,
-    AexprDistinct = 4,
-    AexprNotDistinct = 5,
-    AexprNullif = 6,
-    AexprOf = 7,
-    AexprIn = 8,
-    AexprLike = 9,
-    AexprIlike = 10,
-    AexprSimilar = 11,
-    AexprBetween = 12,
-    AexprNotBetween = 13,
-    AexprBetweenSym = 14,
-    AexprNotBetweenSym = 15,
-    AexprParen = 16,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RoleSpecType {
-    Undefined = 0,
-    RolespecCstring = 1,
-    RolespecCurrentUser = 2,
-    RolespecSessionUser = 3,
-    RolespecPublic = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum TableLikeOption {
-    Undefined = 0,
-    CreateTableLikeComments = 1,
-    CreateTableLikeConstraints = 2,
-    CreateTableLikeDefaults = 3,
-    CreateTableLikeGenerated = 4,
-    CreateTableLikeIdentity = 5,
-    CreateTableLikeIndexes = 6,
-    CreateTableLikeStatistics = 7,
-    CreateTableLikeStorage = 8,
-    CreateTableLikeAll = 9,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum DefElemAction {
-    Undefined = 0,
-    DefelemUnspec = 1,
-    DefelemSet = 2,
-    DefelemAdd = 3,
-    DefelemDrop = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum PartitionRangeDatumKind {
-    Undefined = 0,
-    PartitionRangeDatumMinvalue = 1,
-    PartitionRangeDatumValue = 2,
-    PartitionRangeDatumMaxvalue = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RteKind {
-    RtekindUndefined = 0,
-    RteRelation = 1,
-    RteSubquery = 2,
-    RteJoin = 3,
-    RteFunction = 4,
-    RteTablefunc = 5,
-    RteValues = 6,
-    RteCte = 7,
-    RteNamedtuplestore = 8,
-    RteResult = 9,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum WcoKind {
-    WcokindUndefined = 0,
-    WcoViewCheck = 1,
-    WcoRlsInsertCheck = 2,
-    WcoRlsUpdateCheck = 3,
-    WcoRlsConflictCheck = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum GroupingSetKind {
-    Undefined = 0,
-    GroupingSetEmpty = 1,
-    GroupingSetSimple = 2,
-    GroupingSetRollup = 3,
-    GroupingSetCube = 4,
-    GroupingSetSets = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CteMaterialize {
-    CtematerializeUndefined = 0,
-    Default = 1,
-    Always = 2,
-    Never = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SetOperation {
-    Undefined = 0,
-    SetopNone = 1,
-    SetopUnion = 2,
-    SetopIntersect = 3,
-    SetopExcept = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ObjectType {
-    Undefined = 0,
-    ObjectAccessMethod = 1,
-    ObjectAggregate = 2,
-    ObjectAmop = 3,
-    ObjectAmproc = 4,
-    ObjectAttribute = 5,
-    ObjectCast = 6,
-    ObjectColumn = 7,
-    ObjectCollation = 8,
-    ObjectConversion = 9,
-    ObjectDatabase = 10,
-    ObjectDefault = 11,
-    ObjectDefacl = 12,
-    ObjectDomain = 13,
-    ObjectDomconstraint = 14,
-    ObjectEventTrigger = 15,
-    ObjectExtension = 16,
-    ObjectFdw = 17,
-    ObjectForeignServer = 18,
-    ObjectForeignTable = 19,
-    ObjectFunction = 20,
-    ObjectIndex = 21,
-    ObjectLanguage = 22,
-    ObjectLargeobject = 23,
-    ObjectMatview = 24,
-    ObjectOpclass = 25,
-    ObjectOperator = 26,
-    ObjectOpfamily = 27,
-    ObjectPolicy = 28,
-    ObjectProcedure = 29,
-    ObjectPublication = 30,
-    ObjectPublicationRel = 31,
-    ObjectRole = 32,
-    ObjectRoutine = 33,
-    ObjectRule = 34,
-    ObjectSchema = 35,
-    ObjectSequence = 36,
-    ObjectSubscription = 37,
-    ObjectStatisticExt = 38,
-    ObjectTabconstraint = 39,
-    ObjectTable = 40,
-    ObjectTablespace = 41,
-    ObjectTransform = 42,
-    ObjectTrigger = 43,
-    ObjectTsconfiguration = 44,
-    ObjectTsdictionary = 45,
-    ObjectTsparser = 46,
-    ObjectTstemplate = 47,
-    ObjectType = 48,
-    ObjectUserMapping = 49,
-    ObjectView = 50,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum DropBehavior {
-    Undefined = 0,
-    DropRestrict = 1,
-    DropCascade = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AlterTableType {
-    Undefined = 0,
-    AtAddColumn = 1,
-    AtAddColumnRecurse = 2,
-    AtAddColumnToView = 3,
-    AtColumnDefault = 4,
-    AtCookedColumnDefault = 5,
-    AtDropNotNull = 6,
-    AtSetNotNull = 7,
-    AtDropExpression = 8,
-    AtCheckNotNull = 9,
-    AtSetStatistics = 10,
-    AtSetOptions = 11,
-    AtResetOptions = 12,
-    AtSetStorage = 13,
-    AtDropColumn = 14,
-    AtDropColumnRecurse = 15,
-    AtAddIndex = 16,
-    AtReAddIndex = 17,
-    AtAddConstraint = 18,
-    AtAddConstraintRecurse = 19,
-    AtReAddConstraint = 20,
-    AtReAddDomainConstraint = 21,
-    AtAlterConstraint = 22,
-    AtValidateConstraint = 23,
-    AtValidateConstraintRecurse = 24,
-    AtAddIndexConstraint = 25,
-    AtDropConstraint = 26,
-    AtDropConstraintRecurse = 27,
-    AtReAddComment = 28,
-    AtAlterColumnType = 29,
-    AtAlterColumnGenericOptions = 30,
-    AtChangeOwner = 31,
-    AtClusterOn = 32,
-    AtDropCluster = 33,
-    AtSetLogged = 34,
-    AtSetUnLogged = 35,
-    AtDropOids = 36,
-    AtSetTableSpace = 37,
-    AtSetRelOptions = 38,
-    AtResetRelOptions = 39,
-    AtReplaceRelOptions = 40,
-    AtEnableTrig = 41,
-    AtEnableAlwaysTrig = 42,
-    AtEnableReplicaTrig = 43,
-    AtDisableTrig = 44,
-    AtEnableTrigAll = 45,
-    AtDisableTrigAll = 46,
-    AtEnableTrigUser = 47,
-    AtDisableTrigUser = 48,
-    AtEnableRule = 49,
-    AtEnableAlwaysRule = 50,
-    AtEnableReplicaRule = 51,
-    AtDisableRule = 52,
-    AtAddInherit = 53,
-    AtDropInherit = 54,
-    AtAddOf = 55,
-    AtDropOf = 56,
-    AtReplicaIdentity = 57,
-    AtEnableRowSecurity = 58,
-    AtDisableRowSecurity = 59,
-    AtForceRowSecurity = 60,
-    AtNoForceRowSecurity = 61,
-    AtGenericOptions = 62,
-    AtAttachPartition = 63,
-    AtDetachPartition = 64,
-    AtAddIdentity = 65,
-    AtSetIdentity = 66,
-    AtDropIdentity = 67,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum GrantTargetType {
-    Undefined = 0,
-    AclTargetObject = 1,
-    AclTargetAllInSchema = 2,
-    AclTargetDefaults = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum VariableSetKind {
-    Undefined = 0,
-    VarSetValue = 1,
-    VarSetDefault = 2,
-    VarSetCurrent = 3,
-    VarSetMulti = 4,
-    VarReset = 5,
-    VarResetAll = 6,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ConstrType {
-    Undefined = 0,
-    ConstrNull = 1,
-    ConstrNotnull = 2,
-    ConstrDefault = 3,
-    ConstrIdentity = 4,
-    ConstrGenerated = 5,
-    ConstrCheck = 6,
-    ConstrPrimary = 7,
-    ConstrUnique = 8,
-    ConstrExclusion = 9,
-    ConstrForeign = 10,
-    ConstrAttrDeferrable = 11,
-    ConstrAttrNotDeferrable = 12,
-    ConstrAttrDeferred = 13,
-    ConstrAttrImmediate = 14,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ImportForeignSchemaType {
-    Undefined = 0,
-    FdwImportSchemaAll = 1,
-    FdwImportSchemaLimitTo = 2,
-    FdwImportSchemaExcept = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RoleStmtType {
-    Undefined = 0,
-    RolestmtRole = 1,
-    RolestmtUser = 2,
-    RolestmtGroup = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum FetchDirection {
-    Undefined = 0,
-    FetchForward = 1,
-    FetchBackward = 2,
-    FetchAbsolute = 3,
-    FetchRelative = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum FunctionParameterMode {
-    Undefined = 0,
-    FuncParamIn = 1,
-    FuncParamOut = 2,
-    FuncParamInout = 3,
-    FuncParamVariadic = 4,
-    FuncParamTable = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum TransactionStmtKind {
-    Undefined = 0,
-    TransStmtBegin = 1,
-    TransStmtStart = 2,
-    TransStmtCommit = 3,
-    TransStmtRollback = 4,
-    TransStmtSavepoint = 5,
-    TransStmtRelease = 6,
-    TransStmtRollbackTo = 7,
-    TransStmtPrepare = 8,
-    TransStmtCommitPrepared = 9,
-    TransStmtRollbackPrepared = 10,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ViewCheckOption {
-    Undefined = 0,
-    NoCheckOption = 1,
-    LocalCheckOption = 2,
-    CascadedCheckOption = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ClusterOption {
-    Undefined = 0,
-    CluoptRecheck = 1,
-    CluoptVerbose = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum DiscardMode {
-    Undefined = 0,
-    DiscardAll = 1,
-    DiscardPlans = 2,
-    DiscardSequences = 3,
-    DiscardTemp = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ReindexObjectType {
-    Undefined = 0,
-    ReindexObjectIndex = 1,
-    ReindexObjectTable = 2,
-    ReindexObjectSchema = 3,
-    ReindexObjectSystem = 4,
-    ReindexObjectDatabase = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AlterTsConfigType {
-    AlterTsconfigTypeUndefined = 0,
-    AlterTsconfigAddMapping = 1,
-    AlterTsconfigAlterMappingForToken = 2,
-    AlterTsconfigReplaceDict = 3,
-    AlterTsconfigReplaceDictForToken = 4,
-    AlterTsconfigDropMapping = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AlterSubscriptionType {
-    Undefined = 0,
-    AlterSubscriptionOptions = 1,
-    AlterSubscriptionConnection = 2,
-    AlterSubscriptionPublication = 3,
-    AlterSubscriptionRefresh = 4,
-    AlterSubscriptionEnabled = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum OnCommitAction {
-    Undefined = 0,
-    OncommitNoop = 1,
-    OncommitPreserveRows = 2,
-    OncommitDeleteRows = 3,
-    OncommitDrop = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ParamKind {
-    Undefined = 0,
-    ParamExtern = 1,
-    ParamExec = 2,
-    ParamSublink = 3,
-    ParamMultiexpr = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CoercionContext {
-    Undefined = 0,
-    CoercionImplicit = 1,
-    CoercionAssignment = 2,
-    CoercionExplicit = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CoercionForm {
-    Undefined = 0,
-    CoerceExplicitCall = 1,
-    CoerceExplicitCast = 2,
-    CoerceImplicitCast = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum BoolExprType {
-    Undefined = 0,
-    AndExpr = 1,
-    OrExpr = 2,
-    NotExpr = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SubLinkType {
-    Undefined = 0,
-    ExistsSublink = 1,
-    AllSublink = 2,
-    AnySublink = 3,
-    RowcompareSublink = 4,
-    ExprSublink = 5,
-    MultiexprSublink = 6,
-    ArraySublink = 7,
-    CteSublink = 8,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RowCompareType {
-    Undefined = 0,
-    RowcompareLt = 1,
-    RowcompareLe = 2,
-    RowcompareEq = 3,
-    RowcompareGe = 4,
-    RowcompareGt = 5,
-    RowcompareNe = 6,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum MinMaxOp {
-    Undefined = 0,
-    IsGreatest = 1,
-    IsLeast = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SqlValueFunctionOp {
-    SqlvalueFunctionOpUndefined = 0,
-    SvfopCurrentDate = 1,
-    SvfopCurrentTime = 2,
-    SvfopCurrentTimeN = 3,
-    SvfopCurrentTimestamp = 4,
-    SvfopCurrentTimestampN = 5,
-    SvfopLocaltime = 6,
-    SvfopLocaltimeN = 7,
-    SvfopLocaltimestamp = 8,
-    SvfopLocaltimestampN = 9,
-    SvfopCurrentRole = 10,
-    SvfopCurrentUser = 11,
-    SvfopUser = 12,
-    SvfopSessionUser = 13,
-    SvfopCurrentCatalog = 14,
-    SvfopCurrentSchema = 15,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum XmlExprOp {
-    Undefined = 0,
-    IsXmlconcat = 1,
-    IsXmlelement = 2,
-    IsXmlforest = 3,
-    IsXmlparse = 4,
-    IsXmlpi = 5,
-    IsXmlroot = 6,
-    IsXmlserialize = 7,
-    IsDocument = 8,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum XmlOptionType {
-    Undefined = 0,
-    XmloptionDocument = 1,
-    XmloptionContent = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum NullTestType {
-    Undefined = 0,
-    IsNull = 1,
-    IsNotNull = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum BoolTestType {
-    Undefined = 0,
-    IsTrue = 1,
-    IsNotTrue = 2,
-    IsFalse = 3,
-    IsNotFalse = 4,
-    IsUnknown = 5,
-    IsNotUnknown = 6,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CmdType {
-    Undefined = 0,
-    CmdUnknown = 1,
-    CmdSelect = 2,
-    CmdUpdate = 3,
-    CmdInsert = 4,
-    CmdDelete = 5,
-    CmdUtility = 6,
-    CmdNothing = 7,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum JoinType {
-    Undefined = 0,
-    JoinInner = 1,
-    JoinLeft = 2,
-    JoinFull = 3,
-    JoinRight = 4,
-    JoinSemi = 5,
-    JoinAnti = 6,
-    JoinUniqueOuter = 7,
-    JoinUniqueInner = 8,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AggStrategy {
-    Undefined = 0,
-    AggPlain = 1,
-    AggSorted = 2,
-    AggHashed = 3,
-    AggMixed = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AggSplit {
-    Undefined = 0,
-    AggsplitSimple = 1,
-    AggsplitInitialSerial = 2,
-    AggsplitFinalDeserial = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SetOpCmd {
-    Undefined = 0,
-    SetopcmdIntersect = 1,
-    SetopcmdIntersectAll = 2,
-    SetopcmdExcept = 3,
-    SetopcmdExceptAll = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SetOpStrategy {
-    Undefined = 0,
-    SetopSorted = 1,
-    SetopHashed = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum OnConflictAction {
-    Undefined = 0,
-    OnconflictNone = 1,
-    OnconflictNothing = 2,
-    OnconflictUpdate = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LimitOption {
-    Undefined = 0,
-    Default = 1,
-    Count = 2,
-    WithTies = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LockClauseStrength {
-    Undefined = 0,
-    LcsNone = 1,
-    LcsForkeyshare = 2,
-    LcsForshare = 3,
-    LcsFornokeyupdate = 4,
-    LcsForupdate = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LockWaitPolicy {
-    Undefined = 0,
-    LockWaitBlock = 1,
-    LockWaitSkip = 2,
-    LockWaitError = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LockTupleMode {
-    Undefined = 0,
-    LockTupleKeyShare = 1,
-    LockTupleShare = 2,
-    LockTupleNoKeyExclusive = 3,
-    LockTupleExclusive = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum KeywordKind {
-    NoKeyword = 0,
-    UnreservedKeyword = 1,
-    ColNameKeyword = 2,
-    TypeFuncNameKeyword = 3,
-    ReservedKeyword = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum Token {
-    Nul = 0,
-    /// Single-character tokens that are returned 1:1 (identical with "self" list in scan.l)
-    /// Either supporting syntax, or single-character operators (some can be both)
-    /// Also see <https://www.postgresql.org/docs/12/sql-syntax-lexical.html#SQL-SYNTAX-SPECIAL-CHARS>
-    ///
-    /// "%"
-    Ascii37 = 37,
-    /// "("
-    Ascii40 = 40,
-    /// ")"
-    Ascii41 = 41,
-    /// "*"
-    Ascii42 = 42,
-    /// "+"
-    Ascii43 = 43,
-    /// ","
-    Ascii44 = 44,
-    /// "-"
-    Ascii45 = 45,
-    /// "."
-    Ascii46 = 46,
-    /// "/"
-    Ascii47 = 47,
-    /// ":"
-    Ascii58 = 58,
-    /// ";"
-    Ascii59 = 59,
-    /// "<"
-    Ascii60 = 60,
-    /// "="
-    Ascii61 = 61,
-    /// ">"
-    Ascii62 = 62,
-    /// "?"
-    Ascii63 = 63,
-    /// "["
-    Ascii91 = 91,
-    /// "\"
-    Ascii92 = 92,
-    /// "]"
-    Ascii93 = 93,
-    /// "^"
-    Ascii94 = 94,
-    /// Named tokens in scan.l
-    Ident = 258,
-    Uident = 259,
-    Fconst = 260,
-    Sconst = 261,
-    Usconst = 262,
-    Bconst = 263,
-    Xconst = 264,
-    Op = 265,
-    Iconst = 266,
-    Param = 267,
-    Typecast = 268,
-    DotDot = 269,
-    ColonEquals = 270,
-    EqualsGreater = 271,
-    LessEquals = 272,
-    GreaterEquals = 273,
-    NotEquals = 274,
-    SqlComment = 275,
-    CComment = 276,
-    AbortP = 277,
-    AbsoluteP = 278,
-    Access = 279,
-    Action = 280,
-    AddP = 281,
-    Admin = 282,
-    After = 283,
-    Aggregate = 284,
-    All = 285,
-    Also = 286,
-    Alter = 287,
-    Always = 288,
-    Analyse = 289,
-    Analyze = 290,
-    And = 291,
-    Any = 292,
-    Array = 293,
-    As = 294,
-    Asc = 295,
-    Assertion = 296,
-    Assignment = 297,
-    Asymmetric = 298,
-    At = 299,
-    Attach = 300,
-    Attribute = 301,
-    Authorization = 302,
-    Backward = 303,
-    Before = 304,
-    BeginP = 305,
-    Between = 306,
-    Bigint = 307,
-    Binary = 308,
-    Bit = 309,
-    BooleanP = 310,
-    Both = 311,
-    By = 312,
-    Cache = 313,
-    Call = 314,
-    Called = 315,
-    Cascade = 316,
-    Cascaded = 317,
-    Case = 318,
-    Cast = 319,
-    CatalogP = 320,
-    Chain = 321,
-    CharP = 322,
-    Character = 323,
-    Characteristics = 324,
-    Check = 325,
-    Checkpoint = 326,
-    Class = 327,
-    Close = 328,
-    Cluster = 329,
-    Coalesce = 330,
-    Collate = 331,
-    Collation = 332,
-    Column = 333,
-    Columns = 334,
-    Comment = 335,
-    Comments = 336,
-    Commit = 337,
-    Committed = 338,
-    Concurrently = 339,
-    Configuration = 340,
-    Conflict = 341,
-    Connection = 342,
-    Constraint = 343,
-    Constraints = 344,
-    ContentP = 345,
-    ContinueP = 346,
-    ConversionP = 347,
-    Copy = 348,
-    Cost = 349,
-    Create = 350,
-    Cross = 351,
-    Csv = 352,
-    Cube = 353,
-    CurrentP = 354,
-    CurrentCatalog = 355,
-    CurrentDate = 356,
-    CurrentRole = 357,
-    CurrentSchema = 358,
-    CurrentTime = 359,
-    CurrentTimestamp = 360,
-    CurrentUser = 361,
-    Cursor = 362,
-    Cycle = 363,
-    DataP = 364,
-    Database = 365,
-    DayP = 366,
-    Deallocate = 367,
-    Dec = 368,
-    DecimalP = 369,
-    Declare = 370,
-    Default = 371,
-    Defaults = 372,
-    Deferrable = 373,
-    Deferred = 374,
-    Definer = 375,
-    DeleteP = 376,
-    Delimiter = 377,
-    Delimiters = 378,
-    Depends = 379,
-    Desc = 380,
-    Detach = 381,
-    Dictionary = 382,
-    DisableP = 383,
-    Discard = 384,
-    Distinct = 385,
-    Do = 386,
-    DocumentP = 387,
-    DomainP = 388,
-    DoubleP = 389,
-    Drop = 390,
-    Each = 391,
-    Else = 392,
-    EnableP = 393,
-    Encoding = 394,
-    Encrypted = 395,
-    EndP = 396,
-    EnumP = 397,
-    Escape = 398,
-    Event = 399,
-    Except = 400,
-    Exclude = 401,
-    Excluding = 402,
-    Exclusive = 403,
-    Execute = 404,
-    Exists = 405,
-    Explain = 406,
-    Expression = 407,
-    Extension = 408,
-    External = 409,
-    Extract = 410,
-    FalseP = 411,
-    Family = 412,
-    Fetch = 413,
-    Filter = 414,
-    FirstP = 415,
-    FloatP = 416,
-    Following = 417,
-    For = 418,
-    Force = 419,
-    Foreign = 420,
-    Forward = 421,
-    Freeze = 422,
-    From = 423,
-    Full = 424,
-    Function = 425,
-    Functions = 426,
-    Generated = 427,
-    Global = 428,
-    Grant = 429,
-    Granted = 430,
-    Greatest = 431,
-    GroupP = 432,
-    Grouping = 433,
-    Groups = 434,
-    Handler = 435,
-    Having = 436,
-    HeaderP = 437,
-    Hold = 438,
-    HourP = 439,
-    IdentityP = 440,
-    IfP = 441,
-    Ilike = 442,
-    Immediate = 443,
-    Immutable = 444,
-    ImplicitP = 445,
-    ImportP = 446,
-    InP = 447,
-    Include = 448,
-    Including = 449,
-    Increment = 450,
-    Index = 451,
-    Indexes = 452,
-    Inherit = 453,
-    Inherits = 454,
-    Initially = 455,
-    InlineP = 456,
-    InnerP = 457,
-    Inout = 458,
-    InputP = 459,
-    Insensitive = 460,
-    Insert = 461,
-    Instead = 462,
-    IntP = 463,
-    Integer = 464,
-    Intersect = 465,
-    Interval = 466,
-    Into = 467,
-    Invoker = 468,
-    Is = 469,
-    Isnull = 470,
-    Isolation = 471,
-    Join = 472,
-    Key = 473,
-    Label = 474,
-    Language = 475,
-    LargeP = 476,
-    LastP = 477,
-    LateralP = 478,
-    Leading = 479,
-    Leakproof = 480,
-    Least = 481,
-    Left = 482,
-    Level = 483,
-    Like = 484,
-    Limit = 485,
-    Listen = 486,
-    Load = 487,
-    Local = 488,
-    Localtime = 489,
-    Localtimestamp = 490,
-    Location = 491,
-    LockP = 492,
-    Locked = 493,
-    Logged = 494,
-    Mapping = 495,
-    Match = 496,
-    Materialized = 497,
-    Maxvalue = 498,
-    Method = 499,
-    MinuteP = 500,
-    Minvalue = 501,
-    Mode = 502,
-    MonthP = 503,
-    Move = 504,
-    NameP = 505,
-    Names = 506,
-    National = 507,
-    Natural = 508,
-    Nchar = 509,
-    New = 510,
-    Next = 511,
-    Nfc = 512,
-    Nfd = 513,
-    Nfkc = 514,
-    Nfkd = 515,
-    No = 516,
-    None = 517,
-    Normalize = 518,
-    Normalized = 519,
-    Not = 520,
-    Nothing = 521,
-    Notify = 522,
-    Notnull = 523,
-    Nowait = 524,
-    NullP = 525,
-    Nullif = 526,
-    NullsP = 527,
-    Numeric = 528,
-    ObjectP = 529,
-    Of = 530,
-    Off = 531,
-    Offset = 532,
-    Oids = 533,
-    Old = 534,
-    On = 535,
-    Only = 536,
-    Operator = 537,
-    Option = 538,
-    Options = 539,
-    Or = 540,
-    Order = 541,
-    Ordinality = 542,
-    Others = 543,
-    OutP = 544,
-    OuterP = 545,
-    Over = 546,
-    Overlaps = 547,
-    Overlay = 548,
-    Overriding = 549,
-    Owned = 550,
-    Owner = 551,
-    Parallel = 552,
-    Parser = 553,
-    Partial = 554,
-    Partition = 555,
-    Passing = 556,
-    Password = 557,
-    Placing = 558,
-    Plans = 559,
-    Policy = 560,
-    Position = 561,
-    Preceding = 562,
-    Precision = 563,
-    Preserve = 564,
-    Prepare = 565,
-    Prepared = 566,
-    Primary = 567,
-    Prior = 568,
-    Privileges = 569,
-    Procedural = 570,
-    Procedure = 571,
-    Procedures = 572,
-    Program = 573,
-    Publication = 574,
-    Quote = 575,
-    Range = 576,
-    Read = 577,
-    Real = 578,
-    Reassign = 579,
-    Recheck = 580,
-    Recursive = 581,
-    Ref = 582,
-    References = 583,
-    Referencing = 584,
-    Refresh = 585,
-    Reindex = 586,
-    RelativeP = 587,
-    Release = 588,
-    Rename = 589,
-    Repeatable = 590,
-    Replace = 591,
-    Replica = 592,
-    Reset = 593,
-    Restart = 594,
-    Restrict = 595,
-    Returning = 596,
-    Returns = 597,
-    Revoke = 598,
-    Right = 599,
-    Role = 600,
-    Rollback = 601,
-    Rollup = 602,
-    Routine = 603,
-    Routines = 604,
-    Row = 605,
-    Rows = 606,
-    Rule = 607,
-    Savepoint = 608,
-    Schema = 609,
-    Schemas = 610,
-    Scroll = 611,
-    Search = 612,
-    SecondP = 613,
-    Security = 614,
-    Select = 615,
-    Sequence = 616,
-    Sequences = 617,
-    Serializable = 618,
-    Server = 619,
-    Session = 620,
-    SessionUser = 621,
-    Set = 622,
-    Sets = 623,
-    Setof = 624,
-    Share = 625,
-    Show = 626,
-    Similar = 627,
-    Simple = 628,
-    Skip = 629,
-    Smallint = 630,
-    Snapshot = 631,
-    Some = 632,
-    SqlP = 633,
-    Stable = 634,
-    StandaloneP = 635,
-    Start = 636,
-    Statement = 637,
-    Statistics = 638,
-    Stdin = 639,
-    Stdout = 640,
-    Storage = 641,
-    Stored = 642,
-    StrictP = 643,
-    StripP = 644,
-    Subscription = 645,
-    Substring = 646,
-    Support = 647,
-    Symmetric = 648,
-    Sysid = 649,
-    SystemP = 650,
-    Table = 651,
-    Tables = 652,
-    Tablesample = 653,
-    Tablespace = 654,
-    Temp = 655,
-    Template = 656,
-    Temporary = 657,
-    TextP = 658,
-    Then = 659,
-    Ties = 660,
-    Time = 661,
-    Timestamp = 662,
-    To = 663,
-    Trailing = 664,
-    Transaction = 665,
-    Transform = 666,
-    Treat = 667,
-    Trigger = 668,
-    Trim = 669,
-    TrueP = 670,
-    Truncate = 671,
-    Trusted = 672,
-    TypeP = 673,
-    TypesP = 674,
-    Uescape = 675,
-    Unbounded = 676,
-    Uncommitted = 677,
-    Unencrypted = 678,
-    Union = 679,
-    Unique = 680,
-    Unknown = 681,
-    Unlisten = 682,
-    Unlogged = 683,
-    Until = 684,
-    Update = 685,
-    User = 686,
-    Using = 687,
-    Vacuum = 688,
-    Valid = 689,
-    Validate = 690,
-    Validator = 691,
-    ValueP = 692,
-    Values = 693,
-    Varchar = 694,
-    Variadic = 695,
-    Varying = 696,
-    Verbose = 697,
-    VersionP = 698,
-    View = 699,
-    Views = 700,
-    Volatile = 701,
-    When = 702,
-    Where = 703,
-    WhitespaceP = 704,
-    Window = 705,
-    With = 706,
-    Within = 707,
-    Without = 708,
-    Work = 709,
-    Wrapper = 710,
-    Write = 711,
-    XmlP = 712,
-    Xmlattributes = 713,
-    Xmlconcat = 714,
-    Xmlelement = 715,
-    Xmlexists = 716,
-    Xmlforest = 717,
-    Xmlnamespaces = 718,
-    Xmlparse = 719,
-    Xmlpi = 720,
-    Xmlroot = 721,
-    Xmlserialize = 722,
-    Xmltable = 723,
-    YearP = 724,
-    YesP = 725,
-    Zone = 726,
-    NotLa = 727,
-    NullsLa = 728,
-    WithLa = 729,
-    Postfixop = 730,
-    Uminus = 731,
-}
diff --git a/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100.rs b/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100.rs
new file mode 100644
index 00000000000..c010a28aab6
--- /dev/null
+++ b/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100.rs
@@ -0,0 +1,16 @@
+// rustfmt-format_code_in_doc_comments: true
+// rustfmt-doc_comment_code_block_width: 100
+
+/// ```rust
+/// impl Test {
+///     pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+///         Self::from_bytes_manual_slice(v, 0, v.len())
+///     }
+/// }
+/// ```
+
+impl Test {
+    pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+        Self::from_bytes_manual_slice(v, 0, v.len())
+    }
+}
diff --git a/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100_greater_max_width.rs b/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100_greater_max_width.rs
new file mode 100644
index 00000000000..6bcb99b915f
--- /dev/null
+++ b/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/100_greater_max_width.rs
@@ -0,0 +1,29 @@
+// rustfmt-max_width: 50
+// rustfmt-format_code_in_doc_comments: true
+// rustfmt-doc_comment_code_block_width: 100
+
+/// ```rust
+/// impl Test {
+///     pub const fn from_bytes(
+///         v: &[u8],
+///     ) -> Result<Self, ParserError> {
+///         Self::from_bytes_manual_slice(
+///             v,
+///             0,
+///             v.len(),
+///         )
+///     }
+/// }
+/// ```
+
+impl Test {
+    pub const fn from_bytes(
+        v: &[u8],
+    ) -> Result<Self, ParserError> {
+        Self::from_bytes_manual_slice(
+            v,
+            0,
+            v.len(),
+        )
+    }
+}
diff --git a/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/50.rs b/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/50.rs
new file mode 100644
index 00000000000..e8ab6f28bdc
--- /dev/null
+++ b/src/tools/rustfmt/tests/target/configs/doc_comment_code_block_width/50.rs
@@ -0,0 +1,22 @@
+// rustfmt-format_code_in_doc_comments: true
+// rustfmt-doc_comment_code_block_width: 50
+
+/// ```rust
+/// impl Test {
+///     pub const fn from_bytes(
+///         v: &[u8],
+///     ) -> Result<Self, ParserError> {
+///         Self::from_bytes_manual_slice(
+///             v,
+///             0,
+///             v.len(),
+///         )
+///     }
+/// }
+/// ```
+
+impl Test {
+    pub const fn from_bytes(v: &[u8]) -> Result<Self, ParserError> {
+        Self::from_bytes_manual_slice(v, 0, v.len())
+    }
+}
diff --git a/src/tools/rustfmt/tests/target/imports_raw_identifiers/version_One.rs b/src/tools/rustfmt/tests/target/imports_raw_identifiers/version_One.rs
new file mode 100644
index 00000000000..bc4b5b13569
--- /dev/null
+++ b/src/tools/rustfmt/tests/target/imports_raw_identifiers/version_One.rs
@@ -0,0 +1,5 @@
+// rustfmt-version:One
+
+use websocket::client::ClientBuilder;
+use websocket::r#async::futures::Stream;
+use websocket::result::WebSocketError;
diff --git a/src/tools/rustfmt/tests/target/imports_raw_identifiers/version_Two.rs b/src/tools/rustfmt/tests/target/imports_raw_identifiers/version_Two.rs
new file mode 100644
index 00000000000..22bfe93122f
--- /dev/null
+++ b/src/tools/rustfmt/tests/target/imports_raw_identifiers/version_Two.rs
@@ -0,0 +1,5 @@
+// rustfmt-version:Two
+
+use websocket::r#async::futures::Stream;
+use websocket::client::ClientBuilder;
+use websocket::result::WebSocketError;
diff --git a/src/tools/rustfmt/tests/target/issue_5399.rs b/src/tools/rustfmt/tests/target/issue_5399.rs
new file mode 100644
index 00000000000..17364c38919
--- /dev/null
+++ b/src/tools/rustfmt/tests/target/issue_5399.rs
@@ -0,0 +1,48 @@
+// rustfmt-max_width: 140
+
+impl NotificationRepository {
+    fn set_status_changed(
+        &self,
+        repo_tx_conn: &RepoTxConn,
+        rid: &RoutableId,
+        changed_at: NaiveDateTime,
+    ) -> NukeResult<Option<NotificationStatus>> {
+        repo_tx_conn.run(move |conn| {
+            let res = diesel::update(client_notification::table)
+                .filter(
+                    client_notification::routable_id.eq(DieselRoutableId(rid.clone())).and(
+                        client_notification::changed_at
+                            .lt(changed_at)
+                            .or(client_notification::changed_at.is_null()),
+                    ),
+                )
+                .set(client_notification::changed_at.eq(changed_at))
+                .returning((
+                    client_notification::id,
+                    client_notification::changed_at,
+                    client_notification::polled_at,
+                    client_notification::notified_at,
+                ))
+                .get_result::<(Uuid, Option<NaiveDateTime>, Option<NaiveDateTime>, Option<NaiveDateTime>)>(conn)
+                .optional()?;
+
+            match res {
+                Some(row) => {
+                    let client_id = client_contract::table
+                        .inner_join(client_notification::table)
+                        .filter(client_notification::id.eq(row.0))
+                        .select(client_contract::client_id)
+                        .get_result::<Uuid>(conn)?;
+
+                    Ok(Some(NotificationStatus {
+                        client_id: client_id.into(),
+                        changed_at: row.1,
+                        polled_at: row.2,
+                        notified_at: row.3,
+                    }))
+                }
+                None => Ok(None),
+            }
+        })
+    }
+}
diff --git a/src/tools/rustfmt/tests/target/performance/issue-4476.rs b/src/tools/rustfmt/tests/target/performance/issue-4476.rs
deleted file mode 100644
index 30567f2644b..00000000000
--- a/src/tools/rustfmt/tests/target/performance/issue-4476.rs
+++ /dev/null
@@ -1,705 +0,0 @@
-use super::SemverParser;
-
-#[allow(dead_code, non_camel_case_types)]
-#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
-pub enum Rule {
-    EOI,
-    range_set,
-    logical_or,
-    range,
-    empty,
-    hyphen,
-    simple,
-    primitive,
-    primitive_op,
-    partial,
-    xr,
-    xr_op,
-    nr,
-    tilde,
-    caret,
-    qualifier,
-    parts,
-    part,
-    space,
-}
-#[allow(clippy::all)]
-impl ::pest::Parser<Rule> for SemverParser {
-    fn parse<'i>(
-        rule: Rule,
-        input: &'i str,
-    ) -> ::std::result::Result<::pest::iterators::Pairs<'i, Rule>, ::pest::error::Error<Rule>> {
-        mod rules {
-            pub mod hidden {
-                use super::super::Rule;
-                #[inline]
-                #[allow(dead_code, non_snake_case, unused_variables)]
-                pub fn skip(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    Ok(state)
-                }
-            }
-            pub mod visible {
-                use super::super::Rule;
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn range_set(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::range_set, |state| {
-                        state.sequence(|state| {
-                            self::SOI(state)
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                                state.repeat(|state| {
-                                                    state.sequence(|state| {
-                                                        super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::range(state))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            state
-                                                .sequence(|state| {
-                                                    self::logical_or(state)
-                                                        .and_then(|state| {
-                                                            super::hidden::skip(state)
-                                                        })
-                                                        .and_then(|state| self::range(state))
-                                                })
-                                                .and_then(|state| {
-                                                    state.repeat(|state| {
-                                                        state.sequence(|state| {
-                                                            super::hidden::skip(state).and_then(
-                                                                |state| {
-                                                                    state.sequence(|state| {
-                                                                        self::logical_or(state)
-                                                                            .and_then(|state| {
-                                                                                super::hidden::skip(
-                                                                                    state,
-                                                                                )
-                                                                            })
-                                                                            .and_then(|state| {
-                                                                                self::range(state)
-                                                                            })
-                                                                    })
-                                                                },
-                                                            )
-                                                        })
-                                                    })
-                                                })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                                state.repeat(|state| {
-                                                    state.sequence(|state| {
-                                                        super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::EOI(state))
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn logical_or(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::logical_or, |state| {
-                        state.sequence(|state| {
-                            state
-                                .sequence(|state| {
-                                    state.optional(|state| {
-                                        self::space(state).and_then(|state| {
-                                            state.repeat(|state| {
-                                                state.sequence(|state| {
-                                                    super::hidden::skip(state)
-                                                        .and_then(|state| self::space(state))
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| state.match_string("||"))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                                state.repeat(|state| {
-                                                    state.sequence(|state| {
-                                                        super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn range(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::range, |state| {
-                        self::hyphen(state)
-                            .or_else(|state| {
-                                state.sequence(|state| {
-                                    self::simple(state)
-                                        .and_then(|state| super::hidden::skip(state))
-                                        .and_then(|state| {
-                                            state.sequence(|state| {
-                                                state.optional(|state| {
-                                                    state
-                                                        .sequence(|state| {
-                                                            state
-                                                                .optional(|state| {
-                                                                    state.match_string(",")
-                                                                })
-                                                                .and_then(|state| {
-                                                                    super::hidden::skip(state)
-                                                                })
-                                                                .and_then(|state| {
-                                                                    state.sequence(|state| {
-                                                                        self::space(state)
-                                      .and_then(|state| super::hidden::skip(state))
-                                      .and_then(|state| {
-                                        state.sequence(|state| {
-                                          state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                              state.repeat(|state| {
-                                                state.sequence(|state| {
-                                                  super::hidden::skip(state)
-                                                    .and_then(|state| self::space(state))
-                                                })
-                                              })
-                                            })
-                                          })
-                                        })
-                                      })
-                                                                    })
-                                                                })
-                                                                .and_then(|state| {
-                                                                    super::hidden::skip(state)
-                                                                })
-                                                                .and_then(|state| {
-                                                                    self::simple(state)
-                                                                })
-                                                        })
-                                                        .and_then(|state| {
-                                                            state.repeat(|state| {
-                                                                state.sequence(|state| {
-                                                                    super::hidden::skip(state)
-                                                                        .and_then(|state| {
-                                                                            state.sequence(
-                                                                                |state| {
-                                                                                    state
-                                        .optional(|state| state.match_string(","))
-                                        .and_then(|state| super::hidden::skip(state))
-                                        .and_then(|state| {
-                                          state.sequence(|state| {
-                                            self::space(state)
-                                              .and_then(|state| super::hidden::skip(state))
-                                              .and_then(|state| {
-                                                state.sequence(|state| {
-                                                  state.optional(|state| {
-                                                    self::space(state).and_then(|state| {
-                                                      state.repeat(|state| {
-                                                        state.sequence(|state| {
-                                                          super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                        })
-                                                      })
-                                                    })
-                                                  })
-                                                })
-                                              })
-                                          })
-                                        })
-                                        .and_then(|state| super::hidden::skip(state))
-                                        .and_then(|state| self::simple(state))
-                                                                                },
-                                                                            )
-                                                                        })
-                                                                })
-                                                            })
-                                                        })
-                                                })
-                                            })
-                                        })
-                                })
-                            })
-                            .or_else(|state| self::empty(state))
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn empty(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::empty, |state| state.match_string(""))
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn hyphen(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::hyphen, |state| {
-                        state.sequence(|state| {
-                            self::partial(state)
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        self::space(state)
-                                            .and_then(|state| super::hidden::skip(state))
-                                            .and_then(|state| {
-                                                state.sequence(|state| {
-                                                    state.optional(|state| {
-                                                        self::space(state).and_then(|state| {
-                                                            state.repeat(|state| {
-                                                                state.sequence(|state| {
-                                                                    super::hidden::skip(state)
-                                                                        .and_then(|state| {
-                                                                            self::space(state)
-                                                                        })
-                                                                })
-                                                            })
-                                                        })
-                                                    })
-                                                })
-                                            })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| state.match_string("-"))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        self::space(state)
-                                            .and_then(|state| super::hidden::skip(state))
-                                            .and_then(|state| {
-                                                state.sequence(|state| {
-                                                    state.optional(|state| {
-                                                        self::space(state).and_then(|state| {
-                                                            state.repeat(|state| {
-                                                                state.sequence(|state| {
-                                                                    super::hidden::skip(state)
-                                                                        .and_then(|state| {
-                                                                            self::space(state)
-                                                                        })
-                                                                })
-                                                            })
-                                                        })
-                                                    })
-                                                })
-                                            })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::partial(state))
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn simple(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::simple, |state| {
-                        self::primitive(state)
-                            .or_else(|state| self::partial(state))
-                            .or_else(|state| self::tilde(state))
-                            .or_else(|state| self::caret(state))
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn primitive(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::primitive, |state| {
-                        state.sequence(|state| {
-                            self::primitive_op(state)
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                                state.repeat(|state| {
-                                                    state.sequence(|state| {
-                                                        super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::partial(state))
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn primitive_op(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::primitive_op, |state| {
-                        state
-                            .match_string("<=")
-                            .or_else(|state| state.match_string(">="))
-                            .or_else(|state| state.match_string(">"))
-                            .or_else(|state| state.match_string("<"))
-                            .or_else(|state| state.match_string("="))
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn partial(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::partial, |state| {
-                        state.sequence(|state| {
-                            self::xr(state)
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.optional(|state| {
-                                        state.sequence(|state| {
-                                            state
-                                                .match_string(".")
-                                                .and_then(|state| super::hidden::skip(state))
-                                                .and_then(|state| self::xr(state))
-                                                .and_then(|state| super::hidden::skip(state))
-                                                .and_then(|state| {
-                                                    state.optional(|state| {
-                                                        state.sequence(|state| {
-                                                            state
-                                                                .match_string(".")
-                                                                .and_then(|state| {
-                                                                    super::hidden::skip(state)
-                                                                })
-                                                                .and_then(|state| self::xr(state))
-                                                                .and_then(|state| {
-                                                                    super::hidden::skip(state)
-                                                                })
-                                                                .and_then(|state| {
-                                                                    state.optional(|state| {
-                                                                        self::qualifier(state)
-                                                                    })
-                                                                })
-                                                        })
-                                                    })
-                                                })
-                                        })
-                                    })
-                                })
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn xr(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::xr, |state| {
-                        self::xr_op(state).or_else(|state| self::nr(state))
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn xr_op(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::xr_op, |state| {
-                        state
-                            .match_string("x")
-                            .or_else(|state| state.match_string("X"))
-                            .or_else(|state| state.match_string("*"))
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn nr(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::nr, |state| {
-                        state.match_string("0").or_else(|state| {
-                            state.sequence(|state| {
-                                state
-                                    .match_range('1'..'9')
-                                    .and_then(|state| super::hidden::skip(state))
-                                    .and_then(|state| {
-                                        state.sequence(|state| {
-                                            state.optional(|state| {
-                                                state.match_range('0'..'9').and_then(|state| {
-                                                    state.repeat(|state| {
-                                                        state.sequence(|state| {
-                                                            super::hidden::skip(state).and_then(
-                                                                |state| state.match_range('0'..'9'),
-                                                            )
-                                                        })
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                            })
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn tilde(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::tilde, |state| {
-                        state.sequence(|state| {
-                            state
-                                .match_string("~>")
-                                .or_else(|state| state.match_string("~"))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                                state.repeat(|state| {
-                                                    state.sequence(|state| {
-                                                        super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::partial(state))
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn caret(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::caret, |state| {
-                        state.sequence(|state| {
-                            state
-                                .match_string("^")
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            self::space(state).and_then(|state| {
-                                                state.repeat(|state| {
-                                                    state.sequence(|state| {
-                                                        super::hidden::skip(state)
-                                                            .and_then(|state| self::space(state))
-                                                    })
-                                                })
-                                            })
-                                        })
-                                    })
-                                })
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::partial(state))
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn qualifier(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::qualifier, |state| {
-                        state.sequence(|state| {
-                            state
-                                .match_string("-")
-                                .or_else(|state| state.match_string("+"))
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| self::parts(state))
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn parts(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::parts, |state| {
-                        state.sequence(|state| {
-                            self::part(state)
-                                .and_then(|state| super::hidden::skip(state))
-                                .and_then(|state| {
-                                    state.sequence(|state| {
-                                        state.optional(|state| {
-                                            state
-                                                .sequence(|state| {
-                                                    state
-                                                        .match_string(".")
-                                                        .and_then(|state| {
-                                                            super::hidden::skip(state)
-                                                        })
-                                                        .and_then(|state| self::part(state))
-                                                })
-                                                .and_then(|state| {
-                                                    state.repeat(|state| {
-                                                        state.sequence(|state| {
-                                                            super::hidden::skip(state).and_then(
-                                                                |state| {
-                                                                    state.sequence(|state| {
-                                                                        state
-                                                                            .match_string(".")
-                                                                            .and_then(|state| {
-                                                                                super::hidden::skip(
-                                                                                    state,
-                                                                                )
-                                                                            })
-                                                                            .and_then(|state| {
-                                                                                self::part(state)
-                                                                            })
-                                                                    })
-                                                                },
-                                                            )
-                                                        })
-                                                    })
-                                                })
-                                        })
-                                    })
-                                })
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn part(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::part, |state| {
-                        self::nr(state).or_else(|state| {
-                            state.sequence(|state| {
-                                state
-                                    .match_string("-")
-                                    .or_else(|state| state.match_range('0'..'9'))
-                                    .or_else(|state| state.match_range('A'..'Z'))
-                                    .or_else(|state| state.match_range('a'..'z'))
-                                    .and_then(|state| super::hidden::skip(state))
-                                    .and_then(|state| {
-                                        state.sequence(|state| {
-                                            state.optional(|state| {
-                                                state
-                                                    .match_string("-")
-                                                    .or_else(|state| state.match_range('0'..'9'))
-                                                    .or_else(|state| state.match_range('A'..'Z'))
-                                                    .or_else(|state| state.match_range('a'..'z'))
-                                                    .and_then(|state| {
-                                                        state.repeat(|state| {
-                                                            state.sequence(|state| {
-                                                                super::hidden::skip(state).and_then(
-                                                                    |state| {
-                                                                        state
-                                                                            .match_string("-")
-                                                                            .or_else(|state| {
-                                                                                state.match_range(
-                                                                                    '0'..'9',
-                                                                                )
-                                                                            })
-                                                                            .or_else(|state| {
-                                                                                state.match_range(
-                                                                                    'A'..'Z',
-                                                                                )
-                                                                            })
-                                                                            .or_else(|state| {
-                                                                                state.match_range(
-                                                                                    'a'..'z',
-                                                                                )
-                                                                            })
-                                                                    },
-                                                                )
-                                                            })
-                                                        })
-                                                    })
-                                            })
-                                        })
-                                    })
-                            })
-                        })
-                    })
-                }
-                #[inline]
-                #[allow(non_snake_case, unused_variables)]
-                pub fn space(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state
-                        .match_string(" ")
-                        .or_else(|state| state.match_string("\t"))
-                }
-                #[inline]
-                #[allow(dead_code, non_snake_case, unused_variables)]
-                pub fn EOI(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.rule(Rule::EOI, |state| state.end_of_input())
-                }
-                #[inline]
-                #[allow(dead_code, non_snake_case, unused_variables)]
-                pub fn SOI(
-                    state: Box<::pest::ParserState<Rule>>,
-                ) -> ::pest::ParseResult<Box<::pest::ParserState<Rule>>> {
-                    state.start_of_input()
-                }
-            }
-            pub use self::visible::*;
-        }
-        ::pest::state(input, |state| match rule {
-            Rule::range_set => rules::range_set(state),
-            Rule::logical_or => rules::logical_or(state),
-            Rule::range => rules::range(state),
-            Rule::empty => rules::empty(state),
-            Rule::hyphen => rules::hyphen(state),
-            Rule::simple => rules::simple(state),
-            Rule::primitive => rules::primitive(state),
-            Rule::primitive_op => rules::primitive_op(state),
-            Rule::partial => rules::partial(state),
-            Rule::xr => rules::xr(state),
-            Rule::xr_op => rules::xr_op(state),
-            Rule::nr => rules::nr(state),
-            Rule::tilde => rules::tilde(state),
-            Rule::caret => rules::caret(state),
-            Rule::qualifier => rules::qualifier(state),
-            Rule::parts => rules::parts(state),
-            Rule::part => rules::part(state),
-            Rule::space => rules::space(state),
-            Rule::EOI => rules::EOI(state),
-        })
-    }
-}
diff --git a/src/tools/rustfmt/tests/target/performance/issue-4867.rs b/src/tools/rustfmt/tests/target/performance/issue-4867.rs
deleted file mode 100644
index 336dae1b64a..00000000000
--- a/src/tools/rustfmt/tests/target/performance/issue-4867.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-mod modA {
-    mod modB {
-        mod modC {
-            mod modD {
-                mod modE {
-                    fn func() {
-                        state . rule (Rule :: myrule , | state | { state . sequence (| state | { state . sequence (| state | { state . match_string ("abc") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . match_string ("def") }) }) . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . sequence (| state | { state . optional (| state | { state . sequence (| state | { state . match_string ("abc") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . match_string ("def") }) }) . and_then (| state | { state . repeat (| state | { state . sequence (| state | { super :: hidden :: skip (state) . and_then (| state | { state . sequence (| state | { state . match_string ("abc") . and_then (| state | { super :: hidden :: skip (state) }) . and_then (| state | { state . match_string ("def") }) }) }) }) }) }) }) }) }) }) });
-                    }
-                }
-            }
-        }
-    }
-}
diff --git a/src/tools/rustfmt/tests/target/performance/issue-5128.rs b/src/tools/rustfmt/tests/target/performance/issue-5128.rs
deleted file mode 100644
index ba9ebfc6243..00000000000
--- a/src/tools/rustfmt/tests/target/performance/issue-5128.rs
+++ /dev/null
@@ -1,4898 +0,0 @@
-fn takes_a_long_time_to_rustfmt() {
-    let inner_cte = vec![Node {
-        node: Some(node::Node::CommonTableExpr(Box::new(CommonTableExpr {
-            ctename: String::from("ranked_by_age_within_key"),
-            aliascolnames: vec![],
-            ctematerialized: CteMaterialize::Default as i32,
-            ctequery: Some(Box::new(Node {
-                node: Some(node::Node::SelectStmt(Box::new(SelectStmt {
-                    distinct_clause: vec![],
-                    into_clause: None,
-                    target_list: vec![
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from(""),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                        fields: vec![Node {
-                                            node: Some(node::Node::AStar(AStar {})),
-                                        }],
-                                        location: 80,
-                                    })),
-                                })),
-                                location: 80,
-                            }))),
-                        },
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from("rank_in_key"),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::FuncCall(Box::new(FuncCall {
-                                        funcname: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("row_number"),
-                                            })),
-                                        }],
-                                        args: vec![],
-                                        agg_order: vec![],
-                                        agg_filter: None,
-                                        agg_within_group: false,
-                                        agg_star: false,
-                                        agg_distinct: false,
-                                        func_variadic: false,
-                                        over: Some(Box::new(WindowDef {
-                                            name: String::from(""),
-                                            refname: String::from(""),
-                                            partition_clause: vec![Node {
-                                                node: Some(node::Node::ColumnRef(ColumnRef {
-                                                    fields: vec![Node {
-                                                        node: Some(node::Node::String(String2 {
-                                                            str: String::from("synthetic_key"),
-                                                        })),
-                                                    }],
-                                                    location: 123,
-                                                })),
-                                            }],
-                                            order_clause: vec![Node {
-                                                node: Some(node::Node::SortBy(Box::new(SortBy {
-                                                    node: Some(Box::new(Node {
-                                                        node: Some(node::Node::ColumnRef(
-                                                            ColumnRef {
-                                                                fields: vec![Node {
-                                                                    node: Some(node::Node::String(
-                                                                        String2 {
-                                                                            str: String::from(
-                                                                                "logical_timestamp",
-                                                                            ),
-                                                                        },
-                                                                    )),
-                                                                }],
-                                                                location: 156,
-                                                            },
-                                                        )),
-                                                    })),
-                                                    sortby_dir: SortByDir::SortbyDesc as i32,
-                                                    sortby_nulls: SortByNulls::SortbyNullsDefault
-                                                        as i32,
-                                                    use_op: vec![],
-                                                    location: -1,
-                                                }))),
-                                            }],
-                                            frame_options: 1058,
-                                            start_offset: None,
-                                            end_offset: None,
-                                            location: 109,
-                                        })),
-                                        location: 91,
-                                    }))),
-                                })),
-                                location: 91,
-                            }))),
-                        },
-                    ],
-                    from_clause: vec![Node {
-                        node: Some(node::Node::RangeVar(RangeVar {
-                            catalogname: String::from(""),
-                            schemaname: String::from("_supertables"),
-                            relname: String::from("9999-9999-9999"),
-                            inh: true,
-                            relpersistence: String::from("p"),
-                            alias: None,
-                            location: 206,
-                        })),
-                    }],
-                    where_clause: Some(Box::new(Node {
-                        node: Some(node::Node::AExpr(Box::new(AExpr {
-                            kind: AExprKind::AexprOp as i32,
-                            name: vec![Node {
-                                node: Some(node::Node::String(String2 {
-                                    str: String::from("<="),
-                                })),
-                            }],
-                            lexpr: Some(Box::new(Node {
-                                node: Some(node::Node::ColumnRef(ColumnRef {
-                                    fields: vec![Node {
-                                        node: Some(node::Node::String(String2 {
-                                            str: String::from("logical_timestamp"),
-                                        })),
-                                    }],
-                                    location: 250,
-                                })),
-                            })),
-                            rexpr: Some(Box::new(Node {
-                                node: Some(node::Node::AConst(Box::new(AConst {
-                                    val: Some(Box::new(Node {
-                                        node: Some(node::Node::Integer(Integer { ival: 9000 })),
-                                    })),
-                                    location: 271,
-                                }))),
-                            })),
-                            location: 268,
-                        }))),
-                    })),
-                    group_clause: vec![],
-                    having_clause: None,
-                    window_clause: vec![],
-                    values_lists: vec![],
-                    sort_clause: vec![],
-                    limit_offset: None,
-                    limit_count: None,
-                    limit_option: LimitOption::Default as i32,
-                    locking_clause: vec![],
-                    with_clause: None,
-                    op: SetOperation::SetopNone as i32,
-                    all: false,
-                    larg: None,
-                    rarg: None,
-                }))),
-            })),
-            location: 29,
-            cterecursive: false,
-            cterefcount: 0,
-            ctecolnames: vec![],
-            ctecoltypes: vec![],
-            ctecoltypmods: vec![],
-            ctecolcollations: vec![],
-        }))),
-    }];
-    let outer_cte = vec![Node {
-        node: Some(node::Node::CommonTableExpr(Box::new(CommonTableExpr {
-            ctename: String::from("table_name"),
-            aliascolnames: vec![],
-            ctematerialized: CteMaterialize::Default as i32,
-            ctequery: Some(Box::new(Node {
-                node: Some(node::Node::SelectStmt(Box::new(SelectStmt {
-                    distinct_clause: vec![],
-                    into_clause: None,
-                    target_list: vec![
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from("column1"),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                        fields: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("c1"),
-                                            })),
-                                        }],
-                                        location: 301,
-                                    })),
-                                })),
-                                location: 301,
-                            }))),
-                        },
-                        Node {
-                            node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                                name: String::from("column2"),
-                                indirection: vec![],
-                                val: Some(Box::new(Node {
-                                    node: Some(node::Node::ColumnRef(ColumnRef {
-                                        fields: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("c2"),
-                                            })),
-                                        }],
-                                        location: 324,
-                                    })),
-                                })),
-                                location: 324,
-                            }))),
-                        },
-                    ],
-                    from_clause: vec![Node {
-                        node: Some(node::Node::RangeVar(RangeVar {
-                            catalogname: String::from(""),
-                            schemaname: String::from(""),
-                            relname: String::from("ranked_by_age_within_key"),
-                            inh: true,
-                            relpersistence: String::from("p"),
-                            alias: None,
-                            location: 347,
-                        })),
-                    }],
-                    where_clause: Some(Box::new(Node {
-                        node: Some(node::Node::BoolExpr(Box::new(BoolExpr {
-                            xpr: None,
-                            boolop: BoolExprType::AndExpr as i32,
-                            args: vec![
-                                Node {
-                                    node: Some(node::Node::AExpr(Box::new(AExpr {
-                                        kind: AExprKind::AexprOp as i32,
-                                        name: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("="),
-                                            })),
-                                        }],
-                                        lexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::ColumnRef(ColumnRef {
-                                                fields: vec![Node {
-                                                    node: Some(node::Node::String(String2 {
-                                                        str: String::from("rank_in_key"),
-                                                    })),
-                                                }],
-                                                location: 382,
-                                            })),
-                                        })),
-                                        rexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::AConst(Box::new(AConst {
-                                                val: Some(Box::new(Node {
-                                                    node: Some(node::Node::Integer(Integer {
-                                                        ival: 1,
-                                                    })),
-                                                })),
-                                                location: 396,
-                                            }))),
-                                        })),
-                                        location: 394,
-                                    }))),
-                                },
-                                Node {
-                                    node: Some(node::Node::AExpr(Box::new(AExpr {
-                                        kind: AExprKind::AexprOp as i32,
-                                        name: vec![Node {
-                                            node: Some(node::Node::String(String2 {
-                                                str: String::from("="),
-                                            })),
-                                        }],
-                                        lexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::ColumnRef(ColumnRef {
-                                                fields: vec![Node {
-                                                    node: Some(node::Node::String(String2 {
-                                                        str: String::from("is_deleted"),
-                                                    })),
-                                                }],
-                                                location: 402,
-                                            })),
-                                        })),
-                                        rexpr: Some(Box::new(Node {
-                                            node: Some(node::Node::TypeCast(Box::new(TypeCast {
-                                                arg: Some(Box::new(Node {
-                                                    node: Some(node::Node::AConst(Box::new(
-                                                        AConst {
-                                                            val: Some(Box::new(Node {
-                                                                node: Some(node::Node::String(
-                                                                    String2 {
-                                                                        str: String::from("f"),
-                                                                    },
-                                                                )),
-                                                            })),
-                                                            location: 415,
-                                                        },
-                                                    ))),
-                                                })),
-                                                type_name: Some(TypeName {
-                                                    names: vec![
-                                                        Node {
-                                                            node: Some(node::Node::String(
-                                                                String2 {
-                                                                    str: String::from("pg_catalog"),
-                                                                },
-                                                            )),
-                                                        },
-                                                        Node {
-                                                            node: Some(node::Node::String(
-                                                                String2 {
-                                                                    str: String::from("bool"),
-                                                                },
-                                                            )),
-                                                        },
-                                                    ],
-                                                    type_oid: 0,
-                                                    setof: false,
-                                                    pct_type: false,
-                                                    typmods: vec![],
-                                                    typemod: -1,
-                                                    array_bounds: vec![],
-                                                    location: -1,
-                                                }),
-                                                location: -1,
-                                            }))),
-                                        })),
-                                        location: 413,
-                                    }))),
-                                },
-                            ],
-                            location: 398,
-                        }))),
-                    })),
-                    group_clause: vec![],
-                    having_clause: None,
-                    window_clause: vec![],
-                    values_lists: vec![],
-                    sort_clause: vec![],
-                    limit_offset: None,
-                    limit_count: None,
-                    limit_option: LimitOption::Default as i32,
-                    locking_clause: vec![],
-                    with_clause: Some(WithClause {
-                        ctes: inner_cte,
-                        recursive: false,
-                        location: 24,
-                    }),
-                    op: SetOperation::SetopNone as i32,
-                    all: false,
-                    larg: None,
-                    rarg: None,
-                }))),
-            })),
-            location: 5,
-            cterecursive: false,
-            cterefcount: 0,
-            ctecolnames: vec![],
-            ctecoltypes: vec![],
-            ctecoltypmods: vec![],
-            ctecolcollations: vec![],
-        }))),
-    }];
-    let expected_result = ParseResult {
-        version: 130003,
-        stmts: vec![RawStmt {
-            stmt: Some(Box::new(Node {
-                node: Some(node::Node::SelectStmt(Box::new(SelectStmt {
-                    distinct_clause: vec![],
-                    into_clause: None,
-
-                    target_list: vec![Node {
-                        node: Some(node::Node::ResTarget(Box::new(ResTarget {
-                            name: String::from(""),
-                            indirection: vec![],
-                            val: Some(Box::new(Node {
-                                node: Some(node::Node::ColumnRef(ColumnRef {
-                                    fields: vec![Node {
-                                        node: Some(node::Node::String(String2 {
-                                            str: String::from("column1"),
-                                        })),
-                                    }],
-                                    location: 430,
-                                })),
-                            })),
-                            location: 430,
-                        }))),
-                    }],
-                    from_clause: vec![Node {
-                        node: Some(node::Node::RangeVar(RangeVar {
-                            catalogname: String::from(""),
-                            schemaname: String::from(""),
-                            relname: String::from("table_name"),
-                            inh: true,
-                            relpersistence: String::from("p"),
-                            alias: None,
-                            location: 443,
-                        })),
-                    }],
-                    where_clause: Some(Box::new(Node {
-                        node: Some(node::Node::AExpr(Box::new(AExpr {
-                            kind: AExprKind::AexprOp as i32,
-                            name: vec![Node {
-                                node: Some(node::Node::String(String2 {
-                                    str: String::from(">"),
-                                })),
-                            }],
-                            lexpr: Some(Box::new(Node {
-                                node: Some(node::Node::ColumnRef(ColumnRef {
-                                    fields: vec![Node {
-                                        node: Some(node::Node::String(String2 {
-                                            str: String::from("column2"),
-                                        })),
-                                    }],
-                                    location: 460,
-                                })),
-                            })),
-                            rexpr: Some(Box::new(Node {
-                                node: Some(node::Node::AConst(Box::new(AConst {
-                                    val: Some(Box::new(Node {
-                                        node: Some(node::Node::Integer(Integer { ival: 9000 })),
-                                    })),
-                                    location: 470,
-                                }))),
-                            })),
-                            location: 468,
-                        }))),
-                    })),
-                    group_clause: vec![],
-                    having_clause: None,
-                    window_clause: vec![],
-                    values_lists: vec![],
-                    sort_clause: vec![],
-                    limit_offset: None,
-                    limit_count: None,
-                    limit_option: LimitOption::Default as i32,
-                    locking_clause: vec![],
-                    with_clause: Some(WithClause {
-                        ctes: outer_cte,
-                        recursive: false,
-                        location: 0,
-                    }),
-                    op: SetOperation::SetopNone as i32,
-                    all: false,
-                    larg: None,
-                    rarg: None,
-                }))),
-            })),
-            stmt_location: 0,
-            stmt_len: 0,
-        }],
-    };
-}
-#[derive(Clone, PartialEq)]
-pub struct ParseResult {
-    pub version: i32,
-
-    pub stmts: Vec<RawStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ScanResult {
-    pub version: i32,
-
-    pub tokens: Vec<ScanToken>,
-}
-#[derive(Clone, PartialEq)]
-pub struct Node {
-    pub node: ::core::option::Option<node::Node>,
-}
-/// Nested message and enum types in `Node`.
-pub mod node {
-    #[derive(Clone, PartialEq)]
-    pub enum Node {
-        Alias(super::Alias),
-
-        RangeVar(super::RangeVar),
-
-        TableFunc(Box<super::TableFunc>),
-
-        Expr(super::Expr),
-
-        Var(Box<super::Var>),
-
-        Param(Box<super::Param>),
-
-        Aggref(Box<super::Aggref>),
-
-        GroupingFunc(Box<super::GroupingFunc>),
-
-        WindowFunc(Box<super::WindowFunc>),
-
-        SubscriptingRef(Box<super::SubscriptingRef>),
-
-        FuncExpr(Box<super::FuncExpr>),
-
-        NamedArgExpr(Box<super::NamedArgExpr>),
-
-        OpExpr(Box<super::OpExpr>),
-
-        DistinctExpr(Box<super::DistinctExpr>),
-
-        NullIfExpr(Box<super::NullIfExpr>),
-
-        ScalarArrayOpExpr(Box<super::ScalarArrayOpExpr>),
-
-        BoolExpr(Box<super::BoolExpr>),
-
-        SubLink(Box<super::SubLink>),
-
-        SubPlan(Box<super::SubPlan>),
-
-        AlternativeSubPlan(Box<super::AlternativeSubPlan>),
-
-        FieldSelect(Box<super::FieldSelect>),
-
-        FieldStore(Box<super::FieldStore>),
-
-        RelabelType(Box<super::RelabelType>),
-
-        CoerceViaIo(Box<super::CoerceViaIo>),
-
-        ArrayCoerceExpr(Box<super::ArrayCoerceExpr>),
-
-        ConvertRowtypeExpr(Box<super::ConvertRowtypeExpr>),
-
-        CollateExpr(Box<super::CollateExpr>),
-
-        CaseExpr(Box<super::CaseExpr>),
-
-        CaseWhen(Box<super::CaseWhen>),
-
-        CaseTestExpr(Box<super::CaseTestExpr>),
-
-        ArrayExpr(Box<super::ArrayExpr>),
-
-        RowExpr(Box<super::RowExpr>),
-
-        RowCompareExpr(Box<super::RowCompareExpr>),
-
-        CoalesceExpr(Box<super::CoalesceExpr>),
-
-        MinMaxExpr(Box<super::MinMaxExpr>),
-
-        SqlvalueFunction(Box<super::SqlValueFunction>),
-
-        XmlExpr(Box<super::XmlExpr>),
-
-        NullTest(Box<super::NullTest>),
-
-        BooleanTest(Box<super::BooleanTest>),
-
-        CoerceToDomain(Box<super::CoerceToDomain>),
-
-        CoerceToDomainValue(Box<super::CoerceToDomainValue>),
-
-        SetToDefault(Box<super::SetToDefault>),
-
-        CurrentOfExpr(Box<super::CurrentOfExpr>),
-
-        NextValueExpr(Box<super::NextValueExpr>),
-
-        InferenceElem(Box<super::InferenceElem>),
-
-        TargetEntry(Box<super::TargetEntry>),
-
-        RangeTblRef(super::RangeTblRef),
-
-        JoinExpr(Box<super::JoinExpr>),
-
-        FromExpr(Box<super::FromExpr>),
-
-        OnConflictExpr(Box<super::OnConflictExpr>),
-
-        IntoClause(Box<super::IntoClause>),
-
-        RawStmt(Box<super::RawStmt>),
-
-        Query(Box<super::Query>),
-
-        InsertStmt(Box<super::InsertStmt>),
-
-        DeleteStmt(Box<super::DeleteStmt>),
-
-        UpdateStmt(Box<super::UpdateStmt>),
-
-        SelectStmt(Box<super::SelectStmt>),
-
-        AlterTableStmt(super::AlterTableStmt),
-
-        AlterTableCmd(Box<super::AlterTableCmd>),
-
-        AlterDomainStmt(Box<super::AlterDomainStmt>),
-
-        SetOperationStmt(Box<super::SetOperationStmt>),
-
-        GrantStmt(super::GrantStmt),
-
-        GrantRoleStmt(super::GrantRoleStmt),
-
-        AlterDefaultPrivilegesStmt(super::AlterDefaultPrivilegesStmt),
-
-        ClosePortalStmt(super::ClosePortalStmt),
-
-        ClusterStmt(super::ClusterStmt),
-
-        CopyStmt(Box<super::CopyStmt>),
-
-        CreateStmt(super::CreateStmt),
-
-        DefineStmt(super::DefineStmt),
-
-        DropStmt(super::DropStmt),
-
-        TruncateStmt(super::TruncateStmt),
-
-        CommentStmt(Box<super::CommentStmt>),
-
-        FetchStmt(super::FetchStmt),
-
-        IndexStmt(Box<super::IndexStmt>),
-
-        CreateFunctionStmt(super::CreateFunctionStmt),
-
-        AlterFunctionStmt(super::AlterFunctionStmt),
-
-        DoStmt(super::DoStmt),
-
-        RenameStmt(Box<super::RenameStmt>),
-
-        RuleStmt(Box<super::RuleStmt>),
-
-        NotifyStmt(super::NotifyStmt),
-
-        ListenStmt(super::ListenStmt),
-
-        UnlistenStmt(super::UnlistenStmt),
-
-        TransactionStmt(super::TransactionStmt),
-
-        ViewStmt(Box<super::ViewStmt>),
-
-        LoadStmt(super::LoadStmt),
-
-        CreateDomainStmt(Box<super::CreateDomainStmt>),
-
-        CreatedbStmt(super::CreatedbStmt),
-
-        DropdbStmt(super::DropdbStmt),
-
-        VacuumStmt(super::VacuumStmt),
-
-        ExplainStmt(Box<super::ExplainStmt>),
-
-        CreateTableAsStmt(Box<super::CreateTableAsStmt>),
-
-        CreateSeqStmt(super::CreateSeqStmt),
-
-        AlterSeqStmt(super::AlterSeqStmt),
-
-        VariableSetStmt(super::VariableSetStmt),
-
-        VariableShowStmt(super::VariableShowStmt),
-
-        DiscardStmt(super::DiscardStmt),
-
-        CreateTrigStmt(Box<super::CreateTrigStmt>),
-
-        CreatePlangStmt(super::CreatePLangStmt),
-
-        CreateRoleStmt(super::CreateRoleStmt),
-
-        AlterRoleStmt(super::AlterRoleStmt),
-
-        DropRoleStmt(super::DropRoleStmt),
-
-        LockStmt(super::LockStmt),
-
-        ConstraintsSetStmt(super::ConstraintsSetStmt),
-
-        ReindexStmt(super::ReindexStmt),
-
-        CheckPointStmt(super::CheckPointStmt),
-
-        CreateSchemaStmt(super::CreateSchemaStmt),
-
-        AlterDatabaseStmt(super::AlterDatabaseStmt),
-
-        AlterDatabaseSetStmt(super::AlterDatabaseSetStmt),
-
-        AlterRoleSetStmt(super::AlterRoleSetStmt),
-
-        CreateConversionStmt(super::CreateConversionStmt),
-
-        CreateCastStmt(super::CreateCastStmt),
-
-        CreateOpClassStmt(super::CreateOpClassStmt),
-
-        CreateOpFamilyStmt(super::CreateOpFamilyStmt),
-
-        AlterOpFamilyStmt(super::AlterOpFamilyStmt),
-
-        PrepareStmt(Box<super::PrepareStmt>),
-
-        ExecuteStmt(super::ExecuteStmt),
-
-        DeallocateStmt(super::DeallocateStmt),
-
-        DeclareCursorStmt(Box<super::DeclareCursorStmt>),
-
-        CreateTableSpaceStmt(super::CreateTableSpaceStmt),
-
-        DropTableSpaceStmt(super::DropTableSpaceStmt),
-
-        AlterObjectDependsStmt(Box<super::AlterObjectDependsStmt>),
-
-        AlterObjectSchemaStmt(Box<super::AlterObjectSchemaStmt>),
-
-        AlterOwnerStmt(Box<super::AlterOwnerStmt>),
-
-        AlterOperatorStmt(super::AlterOperatorStmt),
-
-        AlterTypeStmt(super::AlterTypeStmt),
-
-        DropOwnedStmt(super::DropOwnedStmt),
-
-        ReassignOwnedStmt(super::ReassignOwnedStmt),
-
-        CompositeTypeStmt(super::CompositeTypeStmt),
-
-        CreateEnumStmt(super::CreateEnumStmt),
-
-        CreateRangeStmt(super::CreateRangeStmt),
-
-        AlterEnumStmt(super::AlterEnumStmt),
-
-        AlterTsdictionaryStmt(super::AlterTsDictionaryStmt),
-
-        AlterTsconfigurationStmt(super::AlterTsConfigurationStmt),
-
-        CreateFdwStmt(super::CreateFdwStmt),
-
-        AlterFdwStmt(super::AlterFdwStmt),
-
-        CreateForeignServerStmt(super::CreateForeignServerStmt),
-
-        AlterForeignServerStmt(super::AlterForeignServerStmt),
-
-        CreateUserMappingStmt(super::CreateUserMappingStmt),
-
-        AlterUserMappingStmt(super::AlterUserMappingStmt),
-
-        DropUserMappingStmt(super::DropUserMappingStmt),
-
-        AlterTableSpaceOptionsStmt(super::AlterTableSpaceOptionsStmt),
-
-        AlterTableMoveAllStmt(super::AlterTableMoveAllStmt),
-
-        SecLabelStmt(Box<super::SecLabelStmt>),
-
-        CreateForeignTableStmt(super::CreateForeignTableStmt),
-
-        ImportForeignSchemaStmt(super::ImportForeignSchemaStmt),
-
-        CreateExtensionStmt(super::CreateExtensionStmt),
-
-        AlterExtensionStmt(super::AlterExtensionStmt),
-
-        AlterExtensionContentsStmt(Box<super::AlterExtensionContentsStmt>),
-
-        CreateEventTrigStmt(super::CreateEventTrigStmt),
-
-        AlterEventTrigStmt(super::AlterEventTrigStmt),
-
-        RefreshMatViewStmt(super::RefreshMatViewStmt),
-
-        ReplicaIdentityStmt(super::ReplicaIdentityStmt),
-
-        AlterSystemStmt(super::AlterSystemStmt),
-
-        CreatePolicyStmt(Box<super::CreatePolicyStmt>),
-
-        AlterPolicyStmt(Box<super::AlterPolicyStmt>),
-
-        CreateTransformStmt(super::CreateTransformStmt),
-
-        CreateAmStmt(super::CreateAmStmt),
-
-        CreatePublicationStmt(super::CreatePublicationStmt),
-
-        AlterPublicationStmt(super::AlterPublicationStmt),
-
-        CreateSubscriptionStmt(super::CreateSubscriptionStmt),
-
-        AlterSubscriptionStmt(super::AlterSubscriptionStmt),
-
-        DropSubscriptionStmt(super::DropSubscriptionStmt),
-
-        CreateStatsStmt(super::CreateStatsStmt),
-
-        AlterCollationStmt(super::AlterCollationStmt),
-
-        CallStmt(Box<super::CallStmt>),
-
-        AlterStatsStmt(super::AlterStatsStmt),
-
-        AExpr(Box<super::AExpr>),
-
-        ColumnRef(super::ColumnRef),
-
-        ParamRef(super::ParamRef),
-
-        AConst(Box<super::AConst>),
-
-        FuncCall(Box<super::FuncCall>),
-
-        AStar(super::AStar),
-
-        AIndices(Box<super::AIndices>),
-
-        AIndirection(Box<super::AIndirection>),
-
-        AArrayExpr(super::AArrayExpr),
-
-        ResTarget(Box<super::ResTarget>),
-
-        MultiAssignRef(Box<super::MultiAssignRef>),
-
-        TypeCast(Box<super::TypeCast>),
-
-        CollateClause(Box<super::CollateClause>),
-
-        SortBy(Box<super::SortBy>),
-
-        WindowDef(Box<super::WindowDef>),
-
-        RangeSubselect(Box<super::RangeSubselect>),
-
-        RangeFunction(super::RangeFunction),
-
-        RangeTableSample(Box<super::RangeTableSample>),
-
-        RangeTableFunc(Box<super::RangeTableFunc>),
-
-        RangeTableFuncCol(Box<super::RangeTableFuncCol>),
-
-        TypeName(super::TypeName),
-
-        ColumnDef(Box<super::ColumnDef>),
-
-        IndexElem(Box<super::IndexElem>),
-
-        Constraint(Box<super::Constraint>),
-
-        DefElem(Box<super::DefElem>),
-
-        RangeTblEntry(Box<super::RangeTblEntry>),
-
-        RangeTblFunction(Box<super::RangeTblFunction>),
-
-        TableSampleClause(Box<super::TableSampleClause>),
-
-        WithCheckOption(Box<super::WithCheckOption>),
-
-        SortGroupClause(super::SortGroupClause),
-
-        GroupingSet(super::GroupingSet),
-
-        WindowClause(Box<super::WindowClause>),
-
-        ObjectWithArgs(super::ObjectWithArgs),
-
-        AccessPriv(super::AccessPriv),
-
-        CreateOpClassItem(super::CreateOpClassItem),
-
-        TableLikeClause(super::TableLikeClause),
-
-        FunctionParameter(Box<super::FunctionParameter>),
-
-        LockingClause(super::LockingClause),
-
-        RowMarkClause(super::RowMarkClause),
-
-        XmlSerialize(Box<super::XmlSerialize>),
-
-        WithClause(super::WithClause),
-
-        InferClause(Box<super::InferClause>),
-
-        OnConflictClause(Box<super::OnConflictClause>),
-
-        CommonTableExpr(Box<super::CommonTableExpr>),
-
-        RoleSpec(super::RoleSpec),
-
-        TriggerTransition(super::TriggerTransition),
-
-        PartitionElem(Box<super::PartitionElem>),
-
-        PartitionSpec(super::PartitionSpec),
-
-        PartitionBoundSpec(super::PartitionBoundSpec),
-
-        PartitionRangeDatum(Box<super::PartitionRangeDatum>),
-
-        PartitionCmd(super::PartitionCmd),
-
-        VacuumRelation(super::VacuumRelation),
-
-        InlineCodeBlock(super::InlineCodeBlock),
-
-        CallContext(super::CallContext),
-
-        Integer(super::Integer),
-
-        Float(super::Float),
-
-        String(super::String2),
-
-        BitString(super::BitString),
-
-        Null(super::Null),
-
-        List(super::List),
-
-        IntList(super::IntList),
-
-        OidList(super::OidList),
-    }
-}
-#[derive(Clone, PartialEq)]
-pub struct Integer {
-    /// machine integer
-    pub ival: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Float {
-    /// string
-    pub str: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct String2 {
-    /// string
-    pub str: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct BitString {
-    /// string
-    pub str: String,
-}
-/// intentionally empty
-#[derive(Clone, PartialEq)]
-pub struct Null {}
-#[derive(Clone, PartialEq)]
-pub struct List {
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct OidList {
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct IntList {
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct Alias {
-    pub aliasname: String,
-
-    pub colnames: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeVar {
-    pub catalogname: String,
-
-    pub schemaname: String,
-
-    pub relname: String,
-
-    pub inh: bool,
-
-    pub relpersistence: String,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TableFunc {
-    pub ns_uris: Vec<Node>,
-
-    pub ns_names: Vec<Node>,
-
-    pub docexpr: ::core::option::Option<Box<Node>>,
-
-    pub rowexpr: ::core::option::Option<Box<Node>>,
-
-    pub colnames: Vec<Node>,
-
-    pub coltypes: Vec<Node>,
-
-    pub coltypmods: Vec<Node>,
-
-    pub colcollations: Vec<Node>,
-
-    pub colexprs: Vec<Node>,
-
-    pub coldefexprs: Vec<Node>,
-
-    pub notnulls: Vec<u64>,
-
-    pub ordinalitycol: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Expr {}
-#[derive(Clone, PartialEq)]
-pub struct Var {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub varno: u32,
-
-    pub varattno: i32,
-
-    pub vartype: u32,
-
-    pub vartypmod: i32,
-
-    pub varcollid: u32,
-
-    pub varlevelsup: u32,
-
-    pub varnosyn: u32,
-
-    pub varattnosyn: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Param {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub paramkind: i32,
-
-    pub paramid: i32,
-
-    pub paramtype: u32,
-
-    pub paramtypmod: i32,
-
-    pub paramcollid: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Aggref {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub aggfnoid: u32,
-
-    pub aggtype: u32,
-
-    pub aggcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub aggtranstype: u32,
-
-    pub aggargtypes: Vec<Node>,
-
-    pub aggdirectargs: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub aggorder: Vec<Node>,
-
-    pub aggdistinct: Vec<Node>,
-
-    pub aggfilter: ::core::option::Option<Box<Node>>,
-
-    pub aggstar: bool,
-
-    pub aggvariadic: bool,
-
-    pub aggkind: String,
-
-    pub agglevelsup: u32,
-
-    pub aggsplit: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct GroupingFunc {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub args: Vec<Node>,
-
-    pub refs: Vec<Node>,
-
-    pub cols: Vec<Node>,
-
-    pub agglevelsup: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WindowFunc {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub winfnoid: u32,
-
-    pub wintype: u32,
-
-    pub wincollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub aggfilter: ::core::option::Option<Box<Node>>,
-
-    pub winref: u32,
-
-    pub winstar: bool,
-
-    pub winagg: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SubscriptingRef {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub refcontainertype: u32,
-
-    pub refelemtype: u32,
-
-    pub reftypmod: i32,
-
-    pub refcollid: u32,
-
-    pub refupperindexpr: Vec<Node>,
-
-    pub reflowerindexpr: Vec<Node>,
-
-    pub refexpr: ::core::option::Option<Box<Node>>,
-
-    pub refassgnexpr: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct FuncExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub funcid: u32,
-
-    pub funcresulttype: u32,
-
-    pub funcretset: bool,
-
-    pub funcvariadic: bool,
-
-    pub funcformat: i32,
-
-    pub funccollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NamedArgExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub name: String,
-
-    pub argnumber: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct OpExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub opresulttype: u32,
-
-    pub opretset: bool,
-
-    pub opcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct DistinctExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub opresulttype: u32,
-
-    pub opretset: bool,
-
-    pub opcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NullIfExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub opresulttype: u32,
-
-    pub opretset: bool,
-
-    pub opcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ScalarArrayOpExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub opno: u32,
-
-    pub opfuncid: u32,
-
-    pub use_or: bool,
-
-    pub inputcollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct BoolExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub boolop: i32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SubLink {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub sub_link_type: i32,
-
-    pub sub_link_id: i32,
-
-    pub testexpr: ::core::option::Option<Box<Node>>,
-
-    pub oper_name: Vec<Node>,
-
-    pub subselect: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SubPlan {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub sub_link_type: i32,
-
-    pub testexpr: ::core::option::Option<Box<Node>>,
-
-    pub param_ids: Vec<Node>,
-
-    pub plan_id: i32,
-
-    pub plan_name: String,
-
-    pub first_col_type: u32,
-
-    pub first_col_typmod: i32,
-
-    pub first_col_collation: u32,
-
-    pub use_hash_table: bool,
-
-    pub unknown_eq_false: bool,
-
-    pub parallel_safe: bool,
-
-    pub set_param: Vec<Node>,
-
-    pub par_param: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub startup_cost: f64,
-
-    pub per_call_cost: f64,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlternativeSubPlan {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub subplans: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct FieldSelect {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub fieldnum: i32,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FieldStore {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub newvals: Vec<Node>,
-
-    pub fieldnums: Vec<Node>,
-
-    pub resulttype: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RelabelType {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-
-    pub relabelformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoerceViaIo {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resultcollid: u32,
-
-    pub coerceformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ArrayCoerceExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub elemexpr: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-
-    pub coerceformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ConvertRowtypeExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub convertformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CollateExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub coll_oid: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CaseExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub casetype: u32,
-
-    pub casecollid: u32,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub args: Vec<Node>,
-
-    pub defresult: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CaseWhen {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub result: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CaseTestExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub type_id: u32,
-
-    pub type_mod: i32,
-
-    pub collation: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ArrayExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub array_typeid: u32,
-
-    pub array_collid: u32,
-
-    pub element_typeid: u32,
-
-    pub elements: Vec<Node>,
-
-    pub multidims: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RowExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub args: Vec<Node>,
-
-    pub row_typeid: u32,
-
-    pub row_format: i32,
-
-    pub colnames: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RowCompareExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub rctype: i32,
-
-    pub opnos: Vec<Node>,
-
-    pub opfamilies: Vec<Node>,
-
-    pub inputcollids: Vec<Node>,
-
-    pub largs: Vec<Node>,
-
-    pub rargs: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoalesceExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub coalescetype: u32,
-
-    pub coalescecollid: u32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct MinMaxExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub minmaxtype: u32,
-
-    pub minmaxcollid: u32,
-
-    pub inputcollid: u32,
-
-    pub op: i32,
-
-    pub args: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SqlValueFunction {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub op: i32,
-
-    pub r#type: u32,
-
-    pub typmod: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct XmlExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub op: i32,
-
-    pub name: String,
-
-    pub named_args: Vec<Node>,
-
-    pub arg_names: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub xmloption: i32,
-
-    pub r#type: u32,
-
-    pub typmod: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NullTest {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub nulltesttype: i32,
-
-    pub argisrow: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct BooleanTest {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub booltesttype: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoerceToDomain {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub resulttype: u32,
-
-    pub resulttypmod: i32,
-
-    pub resultcollid: u32,
-
-    pub coercionformat: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CoerceToDomainValue {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub type_id: u32,
-
-    pub type_mod: i32,
-
-    pub collation: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SetToDefault {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub type_id: u32,
-
-    pub type_mod: i32,
-
-    pub collation: u32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CurrentOfExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub cvarno: u32,
-
-    pub cursor_name: String,
-
-    pub cursor_param: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct NextValueExpr {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub seqid: u32,
-
-    pub type_id: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct InferenceElem {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub infercollid: u32,
-
-    pub inferopclass: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TargetEntry {
-    pub xpr: ::core::option::Option<Box<Node>>,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub resno: i32,
-
-    pub resname: String,
-
-    pub ressortgroupref: u32,
-
-    pub resorigtbl: u32,
-
-    pub resorigcol: i32,
-
-    pub resjunk: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTblRef {
-    pub rtindex: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct JoinExpr {
-    pub jointype: i32,
-
-    pub is_natural: bool,
-
-    pub larg: ::core::option::Option<Box<Node>>,
-
-    pub rarg: ::core::option::Option<Box<Node>>,
-
-    pub using_clause: Vec<Node>,
-
-    pub quals: ::core::option::Option<Box<Node>>,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub rtindex: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FromExpr {
-    pub fromlist: Vec<Node>,
-
-    pub quals: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct OnConflictExpr {
-    pub action: i32,
-
-    pub arbiter_elems: Vec<Node>,
-
-    pub arbiter_where: ::core::option::Option<Box<Node>>,
-
-    pub constraint: u32,
-
-    pub on_conflict_set: Vec<Node>,
-
-    pub on_conflict_where: ::core::option::Option<Box<Node>>,
-
-    pub excl_rel_index: i32,
-
-    pub excl_rel_tlist: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct IntoClause {
-    pub rel: ::core::option::Option<RangeVar>,
-
-    pub col_names: Vec<Node>,
-
-    pub access_method: String,
-
-    pub options: Vec<Node>,
-
-    pub on_commit: i32,
-
-    pub table_space_name: String,
-
-    pub view_query: ::core::option::Option<Box<Node>>,
-
-    pub skip_data: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct RawStmt {
-    pub stmt: ::core::option::Option<Box<Node>>,
-
-    pub stmt_location: i32,
-
-    pub stmt_len: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Query {
-    pub command_type: i32,
-
-    pub query_source: i32,
-
-    pub can_set_tag: bool,
-
-    pub utility_stmt: ::core::option::Option<Box<Node>>,
-
-    pub result_relation: i32,
-
-    pub has_aggs: bool,
-
-    pub has_window_funcs: bool,
-
-    pub has_target_srfs: bool,
-
-    pub has_sub_links: bool,
-
-    pub has_distinct_on: bool,
-
-    pub has_recursive: bool,
-
-    pub has_modifying_cte: bool,
-
-    pub has_for_update: bool,
-
-    pub has_row_security: bool,
-
-    pub cte_list: Vec<Node>,
-
-    pub rtable: Vec<Node>,
-
-    pub jointree: ::core::option::Option<Box<FromExpr>>,
-
-    pub target_list: Vec<Node>,
-
-    pub r#override: i32,
-
-    pub on_conflict: ::core::option::Option<Box<OnConflictExpr>>,
-
-    pub returning_list: Vec<Node>,
-
-    pub group_clause: Vec<Node>,
-
-    pub grouping_sets: Vec<Node>,
-
-    pub having_qual: ::core::option::Option<Box<Node>>,
-
-    pub window_clause: Vec<Node>,
-
-    pub distinct_clause: Vec<Node>,
-
-    pub sort_clause: Vec<Node>,
-
-    pub limit_offset: ::core::option::Option<Box<Node>>,
-
-    pub limit_count: ::core::option::Option<Box<Node>>,
-
-    pub limit_option: i32,
-
-    pub row_marks: Vec<Node>,
-
-    pub set_operations: ::core::option::Option<Box<Node>>,
-
-    pub constraint_deps: Vec<Node>,
-
-    pub with_check_options: Vec<Node>,
-
-    pub stmt_location: i32,
-
-    pub stmt_len: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct InsertStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub cols: Vec<Node>,
-
-    pub select_stmt: ::core::option::Option<Box<Node>>,
-
-    pub on_conflict_clause: ::core::option::Option<Box<OnConflictClause>>,
-
-    pub returning_list: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-
-    pub r#override: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct DeleteStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub using_clause: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub returning_list: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-}
-#[derive(Clone, PartialEq)]
-pub struct UpdateStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub target_list: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub from_clause: Vec<Node>,
-
-    pub returning_list: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-}
-#[derive(Clone, PartialEq)]
-pub struct SelectStmt {
-    pub distinct_clause: Vec<Node>,
-
-    pub into_clause: ::core::option::Option<Box<IntoClause>>,
-
-    pub target_list: Vec<Node>,
-
-    pub from_clause: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub group_clause: Vec<Node>,
-
-    pub having_clause: ::core::option::Option<Box<Node>>,
-
-    pub window_clause: Vec<Node>,
-
-    pub values_lists: Vec<Node>,
-
-    pub sort_clause: Vec<Node>,
-
-    pub limit_offset: ::core::option::Option<Box<Node>>,
-
-    pub limit_count: ::core::option::Option<Box<Node>>,
-
-    pub limit_option: i32,
-
-    pub locking_clause: Vec<Node>,
-
-    pub with_clause: ::core::option::Option<WithClause>,
-
-    pub op: i32,
-
-    pub all: bool,
-
-    pub larg: ::core::option::Option<Box<SelectStmt>>,
-
-    pub rarg: ::core::option::Option<Box<SelectStmt>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub cmds: Vec<Node>,
-
-    pub relkind: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableCmd {
-    pub subtype: i32,
-
-    pub name: String,
-
-    pub num: i32,
-
-    pub newowner: ::core::option::Option<RoleSpec>,
-
-    pub def: ::core::option::Option<Box<Node>>,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDomainStmt {
-    pub subtype: String,
-
-    pub type_name: Vec<Node>,
-
-    pub name: String,
-
-    pub def: ::core::option::Option<Box<Node>>,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct SetOperationStmt {
-    pub op: i32,
-
-    pub all: bool,
-
-    pub larg: ::core::option::Option<Box<Node>>,
-
-    pub rarg: ::core::option::Option<Box<Node>>,
-
-    pub col_types: Vec<Node>,
-
-    pub col_typmods: Vec<Node>,
-
-    pub col_collations: Vec<Node>,
-
-    pub group_clauses: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct GrantStmt {
-    pub is_grant: bool,
-
-    pub targtype: i32,
-
-    pub objtype: i32,
-
-    pub objects: Vec<Node>,
-
-    pub privileges: Vec<Node>,
-
-    pub grantees: Vec<Node>,
-
-    pub grant_option: bool,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct GrantRoleStmt {
-    pub granted_roles: Vec<Node>,
-
-    pub grantee_roles: Vec<Node>,
-
-    pub is_grant: bool,
-
-    pub admin_opt: bool,
-
-    pub grantor: ::core::option::Option<RoleSpec>,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDefaultPrivilegesStmt {
-    pub options: Vec<Node>,
-
-    pub action: ::core::option::Option<GrantStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ClosePortalStmt {
-    pub portalname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct ClusterStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub indexname: String,
-
-    pub options: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CopyStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub attlist: Vec<Node>,
-
-    pub is_from: bool,
-
-    pub is_program: bool,
-
-    pub filename: String,
-
-    pub options: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub table_elts: Vec<Node>,
-
-    pub inh_relations: Vec<Node>,
-
-    pub partbound: ::core::option::Option<PartitionBoundSpec>,
-
-    pub partspec: ::core::option::Option<PartitionSpec>,
-
-    pub of_typename: ::core::option::Option<TypeName>,
-
-    pub constraints: Vec<Node>,
-
-    pub options: Vec<Node>,
-
-    pub oncommit: i32,
-
-    pub tablespacename: String,
-
-    pub access_method: String,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct DefineStmt {
-    pub kind: i32,
-
-    pub oldstyle: bool,
-
-    pub defnames: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub definition: Vec<Node>,
-
-    pub if_not_exists: bool,
-
-    pub replace: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropStmt {
-    pub objects: Vec<Node>,
-
-    pub remove_type: i32,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-
-    pub concurrent: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct TruncateStmt {
-    pub relations: Vec<Node>,
-
-    pub restart_seqs: bool,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CommentStmt {
-    pub objtype: i32,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub comment: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct FetchStmt {
-    pub direction: i32,
-
-    pub how_many: i64,
-
-    pub portalname: String,
-
-    pub ismove: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct IndexStmt {
-    pub idxname: String,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub access_method: String,
-
-    pub table_space: String,
-
-    pub index_params: Vec<Node>,
-
-    pub index_including_params: Vec<Node>,
-
-    pub options: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub exclude_op_names: Vec<Node>,
-
-    pub idxcomment: String,
-
-    pub index_oid: u32,
-
-    pub old_node: u32,
-
-    pub old_create_subid: u32,
-
-    pub old_first_relfilenode_subid: u32,
-
-    pub unique: bool,
-
-    pub primary: bool,
-
-    pub isconstraint: bool,
-
-    pub deferrable: bool,
-
-    pub initdeferred: bool,
-
-    pub transformed: bool,
-
-    pub concurrent: bool,
-
-    pub if_not_exists: bool,
-
-    pub reset_default_tblspc: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateFunctionStmt {
-    pub is_procedure: bool,
-
-    pub replace: bool,
-
-    pub funcname: Vec<Node>,
-
-    pub parameters: Vec<Node>,
-
-    pub return_type: ::core::option::Option<TypeName>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterFunctionStmt {
-    pub objtype: i32,
-
-    pub func: ::core::option::Option<ObjectWithArgs>,
-
-    pub actions: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DoStmt {
-    pub args: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RenameStmt {
-    pub rename_type: i32,
-
-    pub relation_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub subname: String,
-
-    pub newname: String,
-
-    pub behavior: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct RuleStmt {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub rulename: String,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub event: i32,
-
-    pub instead: bool,
-
-    pub actions: Vec<Node>,
-
-    pub replace: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct NotifyStmt {
-    pub conditionname: String,
-
-    pub payload: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct ListenStmt {
-    pub conditionname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct UnlistenStmt {
-    pub conditionname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct TransactionStmt {
-    pub kind: i32,
-
-    pub options: Vec<Node>,
-
-    pub savepoint_name: String,
-
-    pub gid: String,
-
-    pub chain: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ViewStmt {
-    pub view: ::core::option::Option<RangeVar>,
-
-    pub aliases: Vec<Node>,
-
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub replace: bool,
-
-    pub options: Vec<Node>,
-
-    pub with_check_option: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct LoadStmt {
-    pub filename: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateDomainStmt {
-    pub domainname: Vec<Node>,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub coll_clause: ::core::option::Option<Box<CollateClause>>,
-
-    pub constraints: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatedbStmt {
-    pub dbname: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropdbStmt {
-    pub dbname: String,
-
-    pub missing_ok: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct VacuumStmt {
-    pub options: Vec<Node>,
-
-    pub rels: Vec<Node>,
-
-    pub is_vacuumcmd: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ExplainStmt {
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTableAsStmt {
-    pub query: ::core::option::Option<Box<Node>>,
-
-    pub into: ::core::option::Option<Box<IntoClause>>,
-
-    pub relkind: i32,
-
-    pub is_select_into: bool,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateSeqStmt {
-    pub sequence: ::core::option::Option<RangeVar>,
-
-    pub options: Vec<Node>,
-
-    pub owner_id: u32,
-
-    pub for_identity: bool,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterSeqStmt {
-    pub sequence: ::core::option::Option<RangeVar>,
-
-    pub options: Vec<Node>,
-
-    pub for_identity: bool,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct VariableSetStmt {
-    pub kind: i32,
-
-    pub name: String,
-
-    pub args: Vec<Node>,
-
-    pub is_local: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct VariableShowStmt {
-    pub name: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct DiscardStmt {
-    pub target: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTrigStmt {
-    pub trigname: String,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub funcname: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub row: bool,
-
-    pub timing: i32,
-
-    pub events: i32,
-
-    pub columns: Vec<Node>,
-
-    pub when_clause: ::core::option::Option<Box<Node>>,
-
-    pub isconstraint: bool,
-
-    pub transition_rels: Vec<Node>,
-
-    pub deferrable: bool,
-
-    pub initdeferred: bool,
-
-    pub constrrel: ::core::option::Option<RangeVar>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatePLangStmt {
-    pub replace: bool,
-
-    pub plname: String,
-
-    pub plhandler: Vec<Node>,
-
-    pub plinline: Vec<Node>,
-
-    pub plvalidator: Vec<Node>,
-
-    pub pltrusted: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateRoleStmt {
-    pub stmt_type: i32,
-
-    pub role: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterRoleStmt {
-    pub role: ::core::option::Option<RoleSpec>,
-
-    pub options: Vec<Node>,
-
-    pub action: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropRoleStmt {
-    pub roles: Vec<Node>,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct LockStmt {
-    pub relations: Vec<Node>,
-
-    pub mode: i32,
-
-    pub nowait: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ConstraintsSetStmt {
-    pub constraints: Vec<Node>,
-
-    pub deferred: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ReindexStmt {
-    pub kind: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub name: String,
-
-    pub options: i32,
-
-    pub concurrent: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CheckPointStmt {}
-#[derive(Clone, PartialEq)]
-pub struct CreateSchemaStmt {
-    pub schemaname: String,
-
-    pub authrole: ::core::option::Option<RoleSpec>,
-
-    pub schema_elts: Vec<Node>,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDatabaseStmt {
-    pub dbname: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterDatabaseSetStmt {
-    pub dbname: String,
-
-    pub setstmt: ::core::option::Option<VariableSetStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterRoleSetStmt {
-    pub role: ::core::option::Option<RoleSpec>,
-
-    pub database: String,
-
-    pub setstmt: ::core::option::Option<VariableSetStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateConversionStmt {
-    pub conversion_name: Vec<Node>,
-
-    pub for_encoding_name: String,
-
-    pub to_encoding_name: String,
-
-    pub func_name: Vec<Node>,
-
-    pub def: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateCastStmt {
-    pub sourcetype: ::core::option::Option<TypeName>,
-
-    pub targettype: ::core::option::Option<TypeName>,
-
-    pub func: ::core::option::Option<ObjectWithArgs>,
-
-    pub context: i32,
-
-    pub inout: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateOpClassStmt {
-    pub opclassname: Vec<Node>,
-
-    pub opfamilyname: Vec<Node>,
-
-    pub amname: String,
-
-    pub datatype: ::core::option::Option<TypeName>,
-
-    pub items: Vec<Node>,
-
-    pub is_default: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateOpFamilyStmt {
-    pub opfamilyname: Vec<Node>,
-
-    pub amname: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterOpFamilyStmt {
-    pub opfamilyname: Vec<Node>,
-
-    pub amname: String,
-
-    pub is_drop: bool,
-
-    pub items: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct PrepareStmt {
-    pub name: String,
-
-    pub argtypes: Vec<Node>,
-
-    pub query: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ExecuteStmt {
-    pub name: String,
-
-    pub params: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DeallocateStmt {
-    pub name: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct DeclareCursorStmt {
-    pub portalname: String,
-
-    pub options: i32,
-
-    pub query: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTableSpaceStmt {
-    pub tablespacename: String,
-
-    pub owner: ::core::option::Option<RoleSpec>,
-
-    pub location: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropTableSpaceStmt {
-    pub tablespacename: String,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterObjectDependsStmt {
-    pub object_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub extname: ::core::option::Option<Box<Node>>,
-
-    pub remove: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterObjectSchemaStmt {
-    pub object_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub newschema: String,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterOwnerStmt {
-    pub object_type: i32,
-
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub newowner: ::core::option::Option<RoleSpec>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterOperatorStmt {
-    pub opername: ::core::option::Option<ObjectWithArgs>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTypeStmt {
-    pub type_name: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropOwnedStmt {
-    pub roles: Vec<Node>,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ReassignOwnedStmt {
-    pub roles: Vec<Node>,
-
-    pub newrole: ::core::option::Option<RoleSpec>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CompositeTypeStmt {
-    pub typevar: ::core::option::Option<RangeVar>,
-
-    pub coldeflist: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateEnumStmt {
-    pub type_name: Vec<Node>,
-
-    pub vals: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateRangeStmt {
-    pub type_name: Vec<Node>,
-
-    pub params: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterEnumStmt {
-    pub type_name: Vec<Node>,
-
-    pub old_val: String,
-
-    pub new_val: String,
-
-    pub new_val_neighbor: String,
-
-    pub new_val_is_after: bool,
-
-    pub skip_if_new_val_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTsDictionaryStmt {
-    pub dictname: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTsConfigurationStmt {
-    pub kind: i32,
-
-    pub cfgname: Vec<Node>,
-
-    pub tokentype: Vec<Node>,
-
-    pub dicts: Vec<Node>,
-
-    pub r#override: bool,
-
-    pub replace: bool,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateFdwStmt {
-    pub fdwname: String,
-
-    pub func_options: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterFdwStmt {
-    pub fdwname: String,
-
-    pub func_options: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateForeignServerStmt {
-    pub servername: String,
-
-    pub servertype: String,
-
-    pub version: String,
-
-    pub fdwname: String,
-
-    pub if_not_exists: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterForeignServerStmt {
-    pub servername: String,
-
-    pub version: String,
-
-    pub options: Vec<Node>,
-
-    pub has_version: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateUserMappingStmt {
-    pub user: ::core::option::Option<RoleSpec>,
-
-    pub servername: String,
-
-    pub if_not_exists: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterUserMappingStmt {
-    pub user: ::core::option::Option<RoleSpec>,
-
-    pub servername: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropUserMappingStmt {
-    pub user: ::core::option::Option<RoleSpec>,
-
-    pub servername: String,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableSpaceOptionsStmt {
-    pub tablespacename: String,
-
-    pub options: Vec<Node>,
-
-    pub is_reset: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterTableMoveAllStmt {
-    pub orig_tablespacename: String,
-
-    pub objtype: i32,
-
-    pub roles: Vec<Node>,
-
-    pub new_tablespacename: String,
-
-    pub nowait: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct SecLabelStmt {
-    pub objtype: i32,
-
-    pub object: ::core::option::Option<Box<Node>>,
-
-    pub provider: String,
-
-    pub label: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateForeignTableStmt {
-    pub base_stmt: ::core::option::Option<CreateStmt>,
-
-    pub servername: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ImportForeignSchemaStmt {
-    pub server_name: String,
-
-    pub remote_schema: String,
-
-    pub local_schema: String,
-
-    pub list_type: i32,
-
-    pub table_list: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateExtensionStmt {
-    pub extname: String,
-
-    pub if_not_exists: bool,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterExtensionStmt {
-    pub extname: String,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterExtensionContentsStmt {
-    pub extname: String,
-
-    pub action: i32,
-
-    pub objtype: i32,
-
-    pub object: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateEventTrigStmt {
-    pub trigname: String,
-
-    pub eventname: String,
-
-    pub whenclause: Vec<Node>,
-
-    pub funcname: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterEventTrigStmt {
-    pub trigname: String,
-
-    pub tgenabled: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct RefreshMatViewStmt {
-    pub concurrent: bool,
-
-    pub skip_data: bool,
-
-    pub relation: ::core::option::Option<RangeVar>,
-}
-#[derive(Clone, PartialEq)]
-pub struct ReplicaIdentityStmt {
-    pub identity_type: String,
-
-    pub name: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterSystemStmt {
-    pub setstmt: ::core::option::Option<VariableSetStmt>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatePolicyStmt {
-    pub policy_name: String,
-
-    pub table: ::core::option::Option<RangeVar>,
-
-    pub cmd_name: String,
-
-    pub permissive: bool,
-
-    pub roles: Vec<Node>,
-
-    pub qual: ::core::option::Option<Box<Node>>,
-
-    pub with_check: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterPolicyStmt {
-    pub policy_name: String,
-
-    pub table: ::core::option::Option<RangeVar>,
-
-    pub roles: Vec<Node>,
-
-    pub qual: ::core::option::Option<Box<Node>>,
-
-    pub with_check: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateTransformStmt {
-    pub replace: bool,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub lang: String,
-
-    pub fromsql: ::core::option::Option<ObjectWithArgs>,
-
-    pub tosql: ::core::option::Option<ObjectWithArgs>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateAmStmt {
-    pub amname: String,
-
-    pub handler_name: Vec<Node>,
-
-    pub amtype: String,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreatePublicationStmt {
-    pub pubname: String,
-
-    pub options: Vec<Node>,
-
-    pub tables: Vec<Node>,
-
-    pub for_all_tables: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterPublicationStmt {
-    pub pubname: String,
-
-    pub options: Vec<Node>,
-
-    pub tables: Vec<Node>,
-
-    pub for_all_tables: bool,
-
-    pub table_action: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateSubscriptionStmt {
-    pub subname: String,
-
-    pub conninfo: String,
-
-    pub publication: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterSubscriptionStmt {
-    pub kind: i32,
-
-    pub subname: String,
-
-    pub conninfo: String,
-
-    pub publication: Vec<Node>,
-
-    pub options: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct DropSubscriptionStmt {
-    pub subname: String,
-
-    pub missing_ok: bool,
-
-    pub behavior: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateStatsStmt {
-    pub defnames: Vec<Node>,
-
-    pub stat_types: Vec<Node>,
-
-    pub exprs: Vec<Node>,
-
-    pub relations: Vec<Node>,
-
-    pub stxcomment: String,
-
-    pub if_not_exists: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterCollationStmt {
-    pub collname: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CallStmt {
-    pub funccall: ::core::option::Option<Box<FuncCall>>,
-
-    pub funcexpr: ::core::option::Option<Box<FuncExpr>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AlterStatsStmt {
-    pub defnames: Vec<Node>,
-
-    pub stxstattarget: i32,
-
-    pub missing_ok: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AExpr {
-    pub kind: i32,
-
-    pub name: Vec<Node>,
-
-    pub lexpr: ::core::option::Option<Box<Node>>,
-
-    pub rexpr: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ColumnRef {
-    pub fields: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ParamRef {
-    pub number: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct AConst {
-    pub val: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FuncCall {
-    pub funcname: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub agg_order: Vec<Node>,
-
-    pub agg_filter: ::core::option::Option<Box<Node>>,
-
-    pub agg_within_group: bool,
-
-    pub agg_star: bool,
-
-    pub agg_distinct: bool,
-
-    pub func_variadic: bool,
-
-    pub over: ::core::option::Option<Box<WindowDef>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct AStar {}
-#[derive(Clone, PartialEq)]
-pub struct AIndices {
-    pub is_slice: bool,
-
-    pub lidx: ::core::option::Option<Box<Node>>,
-
-    pub uidx: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AIndirection {
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub indirection: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct AArrayExpr {
-    pub elements: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ResTarget {
-    pub name: String,
-
-    pub indirection: Vec<Node>,
-
-    pub val: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct MultiAssignRef {
-    pub source: ::core::option::Option<Box<Node>>,
-
-    pub colno: i32,
-
-    pub ncolumns: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TypeCast {
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CollateClause {
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub collname: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct SortBy {
-    pub node: ::core::option::Option<Box<Node>>,
-
-    pub sortby_dir: i32,
-
-    pub sortby_nulls: i32,
-
-    pub use_op: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WindowDef {
-    pub name: String,
-
-    pub refname: String,
-
-    pub partition_clause: Vec<Node>,
-
-    pub order_clause: Vec<Node>,
-
-    pub frame_options: i32,
-
-    pub start_offset: ::core::option::Option<Box<Node>>,
-
-    pub end_offset: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeSubselect {
-    pub lateral: bool,
-
-    pub subquery: ::core::option::Option<Box<Node>>,
-
-    pub alias: ::core::option::Option<Alias>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeFunction {
-    pub lateral: bool,
-
-    pub ordinality: bool,
-
-    pub is_rowsfrom: bool,
-
-    pub functions: Vec<Node>,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub coldeflist: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTableSample {
-    pub relation: ::core::option::Option<Box<Node>>,
-
-    pub method: Vec<Node>,
-
-    pub args: Vec<Node>,
-
-    pub repeatable: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTableFunc {
-    pub lateral: bool,
-
-    pub docexpr: ::core::option::Option<Box<Node>>,
-
-    pub rowexpr: ::core::option::Option<Box<Node>>,
-
-    pub namespaces: Vec<Node>,
-
-    pub columns: Vec<Node>,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTableFuncCol {
-    pub colname: String,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub for_ordinality: bool,
-
-    pub is_not_null: bool,
-
-    pub colexpr: ::core::option::Option<Box<Node>>,
-
-    pub coldefexpr: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TypeName {
-    pub names: Vec<Node>,
-
-    pub type_oid: u32,
-
-    pub setof: bool,
-
-    pub pct_type: bool,
-
-    pub typmods: Vec<Node>,
-
-    pub typemod: i32,
-
-    pub array_bounds: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct ColumnDef {
-    pub colname: String,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub inhcount: i32,
-
-    pub is_local: bool,
-
-    pub is_not_null: bool,
-
-    pub is_from_type: bool,
-
-    pub storage: String,
-
-    pub raw_default: ::core::option::Option<Box<Node>>,
-
-    pub cooked_default: ::core::option::Option<Box<Node>>,
-
-    pub identity: String,
-
-    pub identity_sequence: ::core::option::Option<RangeVar>,
-
-    pub generated: String,
-
-    pub coll_clause: ::core::option::Option<Box<CollateClause>>,
-
-    pub coll_oid: u32,
-
-    pub constraints: Vec<Node>,
-
-    pub fdwoptions: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct IndexElem {
-    pub name: String,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub indexcolname: String,
-
-    pub collation: Vec<Node>,
-
-    pub opclass: Vec<Node>,
-
-    pub opclassopts: Vec<Node>,
-
-    pub ordering: i32,
-
-    pub nulls_ordering: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct Constraint {
-    pub contype: i32,
-
-    pub conname: String,
-
-    pub deferrable: bool,
-
-    pub initdeferred: bool,
-
-    pub location: i32,
-
-    pub is_no_inherit: bool,
-
-    pub raw_expr: ::core::option::Option<Box<Node>>,
-
-    pub cooked_expr: String,
-
-    pub generated_when: String,
-
-    pub keys: Vec<Node>,
-
-    pub including: Vec<Node>,
-
-    pub exclusions: Vec<Node>,
-
-    pub options: Vec<Node>,
-
-    pub indexname: String,
-
-    pub indexspace: String,
-
-    pub reset_default_tblspc: bool,
-
-    pub access_method: String,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub pktable: ::core::option::Option<RangeVar>,
-
-    pub fk_attrs: Vec<Node>,
-
-    pub pk_attrs: Vec<Node>,
-
-    pub fk_matchtype: String,
-
-    pub fk_upd_action: String,
-
-    pub fk_del_action: String,
-
-    pub old_conpfeqop: Vec<Node>,
-
-    pub old_pktable_oid: u32,
-
-    pub skip_validation: bool,
-
-    pub initially_valid: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct DefElem {
-    pub defnamespace: String,
-
-    pub defname: String,
-
-    pub arg: ::core::option::Option<Box<Node>>,
-
-    pub defaction: i32,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTblEntry {
-    pub rtekind: i32,
-
-    pub relid: u32,
-
-    pub relkind: String,
-
-    pub rellockmode: i32,
-
-    pub tablesample: ::core::option::Option<Box<TableSampleClause>>,
-
-    pub subquery: ::core::option::Option<Box<Query>>,
-
-    pub security_barrier: bool,
-
-    pub jointype: i32,
-
-    pub joinmergedcols: i32,
-
-    pub joinaliasvars: Vec<Node>,
-
-    pub joinleftcols: Vec<Node>,
-
-    pub joinrightcols: Vec<Node>,
-
-    pub functions: Vec<Node>,
-
-    pub funcordinality: bool,
-
-    pub tablefunc: ::core::option::Option<Box<TableFunc>>,
-
-    pub values_lists: Vec<Node>,
-
-    pub ctename: String,
-
-    pub ctelevelsup: u32,
-
-    pub self_reference: bool,
-
-    pub coltypes: Vec<Node>,
-
-    pub coltypmods: Vec<Node>,
-
-    pub colcollations: Vec<Node>,
-
-    pub enrname: String,
-
-    pub enrtuples: f64,
-
-    pub alias: ::core::option::Option<Alias>,
-
-    pub eref: ::core::option::Option<Alias>,
-
-    pub lateral: bool,
-
-    pub inh: bool,
-
-    pub in_from_cl: bool,
-
-    pub required_perms: u32,
-
-    pub check_as_user: u32,
-
-    pub selected_cols: Vec<u64>,
-
-    pub inserted_cols: Vec<u64>,
-
-    pub updated_cols: Vec<u64>,
-
-    pub extra_updated_cols: Vec<u64>,
-
-    pub security_quals: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RangeTblFunction {
-    pub funcexpr: ::core::option::Option<Box<Node>>,
-
-    pub funccolcount: i32,
-
-    pub funccolnames: Vec<Node>,
-
-    pub funccoltypes: Vec<Node>,
-
-    pub funccoltypmods: Vec<Node>,
-
-    pub funccolcollations: Vec<Node>,
-
-    pub funcparams: Vec<u64>,
-}
-#[derive(Clone, PartialEq)]
-pub struct TableSampleClause {
-    pub tsmhandler: u32,
-
-    pub args: Vec<Node>,
-
-    pub repeatable: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct WithCheckOption {
-    pub kind: i32,
-
-    pub relname: String,
-
-    pub polname: String,
-
-    pub qual: ::core::option::Option<Box<Node>>,
-
-    pub cascaded: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct SortGroupClause {
-    pub tle_sort_group_ref: u32,
-
-    pub eqop: u32,
-
-    pub sortop: u32,
-
-    pub nulls_first: bool,
-
-    pub hashable: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct GroupingSet {
-    pub kind: i32,
-
-    pub content: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WindowClause {
-    pub name: String,
-
-    pub refname: String,
-
-    pub partition_clause: Vec<Node>,
-
-    pub order_clause: Vec<Node>,
-
-    pub frame_options: i32,
-
-    pub start_offset: ::core::option::Option<Box<Node>>,
-
-    pub end_offset: ::core::option::Option<Box<Node>>,
-
-    pub start_in_range_func: u32,
-
-    pub end_in_range_func: u32,
-
-    pub in_range_coll: u32,
-
-    pub in_range_asc: bool,
-
-    pub in_range_nulls_first: bool,
-
-    pub winref: u32,
-
-    pub copied_order: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ObjectWithArgs {
-    pub objname: Vec<Node>,
-
-    pub objargs: Vec<Node>,
-
-    pub args_unspecified: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct AccessPriv {
-    pub priv_name: String,
-
-    pub cols: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct CreateOpClassItem {
-    pub itemtype: i32,
-
-    pub name: ::core::option::Option<ObjectWithArgs>,
-
-    pub number: i32,
-
-    pub order_family: Vec<Node>,
-
-    pub class_args: Vec<Node>,
-
-    pub storedtype: ::core::option::Option<TypeName>,
-}
-#[derive(Clone, PartialEq)]
-pub struct TableLikeClause {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub options: u32,
-
-    pub relation_oid: u32,
-}
-#[derive(Clone, PartialEq)]
-pub struct FunctionParameter {
-    pub name: String,
-
-    pub arg_type: ::core::option::Option<TypeName>,
-
-    pub mode: i32,
-
-    pub defexpr: ::core::option::Option<Box<Node>>,
-}
-#[derive(Clone, PartialEq)]
-pub struct LockingClause {
-    pub locked_rels: Vec<Node>,
-
-    pub strength: i32,
-
-    pub wait_policy: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct RowMarkClause {
-    pub rti: u32,
-
-    pub strength: i32,
-
-    pub wait_policy: i32,
-
-    pub pushed_down: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct XmlSerialize {
-    pub xmloption: i32,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub type_name: ::core::option::Option<TypeName>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct WithClause {
-    pub ctes: Vec<Node>,
-
-    pub recursive: bool,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct InferClause {
-    pub index_elems: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub conname: String,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct OnConflictClause {
-    pub action: i32,
-
-    pub infer: ::core::option::Option<Box<InferClause>>,
-
-    pub target_list: Vec<Node>,
-
-    pub where_clause: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct CommonTableExpr {
-    pub ctename: String,
-
-    pub aliascolnames: Vec<Node>,
-
-    pub ctematerialized: i32,
-
-    pub ctequery: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-
-    pub cterecursive: bool,
-
-    pub cterefcount: i32,
-
-    pub ctecolnames: Vec<Node>,
-
-    pub ctecoltypes: Vec<Node>,
-
-    pub ctecoltypmods: Vec<Node>,
-
-    pub ctecolcollations: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct RoleSpec {
-    pub roletype: i32,
-
-    pub rolename: String,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct TriggerTransition {
-    pub name: String,
-
-    pub is_new: bool,
-
-    pub is_table: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionElem {
-    pub name: String,
-
-    pub expr: ::core::option::Option<Box<Node>>,
-
-    pub collation: Vec<Node>,
-
-    pub opclass: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionSpec {
-    pub strategy: String,
-
-    pub part_params: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionBoundSpec {
-    pub strategy: String,
-
-    pub is_default: bool,
-
-    pub modulus: i32,
-
-    pub remainder: i32,
-
-    pub listdatums: Vec<Node>,
-
-    pub lowerdatums: Vec<Node>,
-
-    pub upperdatums: Vec<Node>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionRangeDatum {
-    pub kind: i32,
-
-    pub value: ::core::option::Option<Box<Node>>,
-
-    pub location: i32,
-}
-#[derive(Clone, PartialEq)]
-pub struct PartitionCmd {
-    pub name: ::core::option::Option<RangeVar>,
-
-    pub bound: ::core::option::Option<PartitionBoundSpec>,
-}
-#[derive(Clone, PartialEq)]
-pub struct VacuumRelation {
-    pub relation: ::core::option::Option<RangeVar>,
-
-    pub oid: u32,
-
-    pub va_cols: Vec<Node>,
-}
-#[derive(Clone, PartialEq)]
-pub struct InlineCodeBlock {
-    pub source_text: String,
-
-    pub lang_oid: u32,
-
-    pub lang_is_trusted: bool,
-
-    pub atomic: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct CallContext {
-    pub atomic: bool,
-}
-#[derive(Clone, PartialEq)]
-pub struct ScanToken {
-    pub start: i32,
-
-    pub end: i32,
-
-    pub token: i32,
-
-    pub keyword_kind: i32,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum OverridingKind {
-    Undefined = 0,
-    OverridingNotSet = 1,
-    OverridingUserValue = 2,
-    OverridingSystemValue = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum QuerySource {
-    Undefined = 0,
-    QsrcOriginal = 1,
-    QsrcParser = 2,
-    QsrcInsteadRule = 3,
-    QsrcQualInsteadRule = 4,
-    QsrcNonInsteadRule = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SortByDir {
-    Undefined = 0,
-    SortbyDefault = 1,
-    SortbyAsc = 2,
-    SortbyDesc = 3,
-    SortbyUsing = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SortByNulls {
-    Undefined = 0,
-    SortbyNullsDefault = 1,
-    SortbyNullsFirst = 2,
-    SortbyNullsLast = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AExprKind {
-    Undefined = 0,
-    AexprOp = 1,
-    AexprOpAny = 2,
-    AexprOpAll = 3,
-    AexprDistinct = 4,
-    AexprNotDistinct = 5,
-    AexprNullif = 6,
-    AexprOf = 7,
-    AexprIn = 8,
-    AexprLike = 9,
-    AexprIlike = 10,
-    AexprSimilar = 11,
-    AexprBetween = 12,
-    AexprNotBetween = 13,
-    AexprBetweenSym = 14,
-    AexprNotBetweenSym = 15,
-    AexprParen = 16,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RoleSpecType {
-    Undefined = 0,
-    RolespecCstring = 1,
-    RolespecCurrentUser = 2,
-    RolespecSessionUser = 3,
-    RolespecPublic = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum TableLikeOption {
-    Undefined = 0,
-    CreateTableLikeComments = 1,
-    CreateTableLikeConstraints = 2,
-    CreateTableLikeDefaults = 3,
-    CreateTableLikeGenerated = 4,
-    CreateTableLikeIdentity = 5,
-    CreateTableLikeIndexes = 6,
-    CreateTableLikeStatistics = 7,
-    CreateTableLikeStorage = 8,
-    CreateTableLikeAll = 9,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum DefElemAction {
-    Undefined = 0,
-    DefelemUnspec = 1,
-    DefelemSet = 2,
-    DefelemAdd = 3,
-    DefelemDrop = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum PartitionRangeDatumKind {
-    Undefined = 0,
-    PartitionRangeDatumMinvalue = 1,
-    PartitionRangeDatumValue = 2,
-    PartitionRangeDatumMaxvalue = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RteKind {
-    RtekindUndefined = 0,
-    RteRelation = 1,
-    RteSubquery = 2,
-    RteJoin = 3,
-    RteFunction = 4,
-    RteTablefunc = 5,
-    RteValues = 6,
-    RteCte = 7,
-    RteNamedtuplestore = 8,
-    RteResult = 9,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum WcoKind {
-    WcokindUndefined = 0,
-    WcoViewCheck = 1,
-    WcoRlsInsertCheck = 2,
-    WcoRlsUpdateCheck = 3,
-    WcoRlsConflictCheck = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum GroupingSetKind {
-    Undefined = 0,
-    GroupingSetEmpty = 1,
-    GroupingSetSimple = 2,
-    GroupingSetRollup = 3,
-    GroupingSetCube = 4,
-    GroupingSetSets = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CteMaterialize {
-    CtematerializeUndefined = 0,
-    Default = 1,
-    Always = 2,
-    Never = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SetOperation {
-    Undefined = 0,
-    SetopNone = 1,
-    SetopUnion = 2,
-    SetopIntersect = 3,
-    SetopExcept = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ObjectType {
-    Undefined = 0,
-    ObjectAccessMethod = 1,
-    ObjectAggregate = 2,
-    ObjectAmop = 3,
-    ObjectAmproc = 4,
-    ObjectAttribute = 5,
-    ObjectCast = 6,
-    ObjectColumn = 7,
-    ObjectCollation = 8,
-    ObjectConversion = 9,
-    ObjectDatabase = 10,
-    ObjectDefault = 11,
-    ObjectDefacl = 12,
-    ObjectDomain = 13,
-    ObjectDomconstraint = 14,
-    ObjectEventTrigger = 15,
-    ObjectExtension = 16,
-    ObjectFdw = 17,
-    ObjectForeignServer = 18,
-    ObjectForeignTable = 19,
-    ObjectFunction = 20,
-    ObjectIndex = 21,
-    ObjectLanguage = 22,
-    ObjectLargeobject = 23,
-    ObjectMatview = 24,
-    ObjectOpclass = 25,
-    ObjectOperator = 26,
-    ObjectOpfamily = 27,
-    ObjectPolicy = 28,
-    ObjectProcedure = 29,
-    ObjectPublication = 30,
-    ObjectPublicationRel = 31,
-    ObjectRole = 32,
-    ObjectRoutine = 33,
-    ObjectRule = 34,
-    ObjectSchema = 35,
-    ObjectSequence = 36,
-    ObjectSubscription = 37,
-    ObjectStatisticExt = 38,
-    ObjectTabconstraint = 39,
-    ObjectTable = 40,
-    ObjectTablespace = 41,
-    ObjectTransform = 42,
-    ObjectTrigger = 43,
-    ObjectTsconfiguration = 44,
-    ObjectTsdictionary = 45,
-    ObjectTsparser = 46,
-    ObjectTstemplate = 47,
-    ObjectType = 48,
-    ObjectUserMapping = 49,
-    ObjectView = 50,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum DropBehavior {
-    Undefined = 0,
-    DropRestrict = 1,
-    DropCascade = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AlterTableType {
-    Undefined = 0,
-    AtAddColumn = 1,
-    AtAddColumnRecurse = 2,
-    AtAddColumnToView = 3,
-    AtColumnDefault = 4,
-    AtCookedColumnDefault = 5,
-    AtDropNotNull = 6,
-    AtSetNotNull = 7,
-    AtDropExpression = 8,
-    AtCheckNotNull = 9,
-    AtSetStatistics = 10,
-    AtSetOptions = 11,
-    AtResetOptions = 12,
-    AtSetStorage = 13,
-    AtDropColumn = 14,
-    AtDropColumnRecurse = 15,
-    AtAddIndex = 16,
-    AtReAddIndex = 17,
-    AtAddConstraint = 18,
-    AtAddConstraintRecurse = 19,
-    AtReAddConstraint = 20,
-    AtReAddDomainConstraint = 21,
-    AtAlterConstraint = 22,
-    AtValidateConstraint = 23,
-    AtValidateConstraintRecurse = 24,
-    AtAddIndexConstraint = 25,
-    AtDropConstraint = 26,
-    AtDropConstraintRecurse = 27,
-    AtReAddComment = 28,
-    AtAlterColumnType = 29,
-    AtAlterColumnGenericOptions = 30,
-    AtChangeOwner = 31,
-    AtClusterOn = 32,
-    AtDropCluster = 33,
-    AtSetLogged = 34,
-    AtSetUnLogged = 35,
-    AtDropOids = 36,
-    AtSetTableSpace = 37,
-    AtSetRelOptions = 38,
-    AtResetRelOptions = 39,
-    AtReplaceRelOptions = 40,
-    AtEnableTrig = 41,
-    AtEnableAlwaysTrig = 42,
-    AtEnableReplicaTrig = 43,
-    AtDisableTrig = 44,
-    AtEnableTrigAll = 45,
-    AtDisableTrigAll = 46,
-    AtEnableTrigUser = 47,
-    AtDisableTrigUser = 48,
-    AtEnableRule = 49,
-    AtEnableAlwaysRule = 50,
-    AtEnableReplicaRule = 51,
-    AtDisableRule = 52,
-    AtAddInherit = 53,
-    AtDropInherit = 54,
-    AtAddOf = 55,
-    AtDropOf = 56,
-    AtReplicaIdentity = 57,
-    AtEnableRowSecurity = 58,
-    AtDisableRowSecurity = 59,
-    AtForceRowSecurity = 60,
-    AtNoForceRowSecurity = 61,
-    AtGenericOptions = 62,
-    AtAttachPartition = 63,
-    AtDetachPartition = 64,
-    AtAddIdentity = 65,
-    AtSetIdentity = 66,
-    AtDropIdentity = 67,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum GrantTargetType {
-    Undefined = 0,
-    AclTargetObject = 1,
-    AclTargetAllInSchema = 2,
-    AclTargetDefaults = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum VariableSetKind {
-    Undefined = 0,
-    VarSetValue = 1,
-    VarSetDefault = 2,
-    VarSetCurrent = 3,
-    VarSetMulti = 4,
-    VarReset = 5,
-    VarResetAll = 6,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ConstrType {
-    Undefined = 0,
-    ConstrNull = 1,
-    ConstrNotnull = 2,
-    ConstrDefault = 3,
-    ConstrIdentity = 4,
-    ConstrGenerated = 5,
-    ConstrCheck = 6,
-    ConstrPrimary = 7,
-    ConstrUnique = 8,
-    ConstrExclusion = 9,
-    ConstrForeign = 10,
-    ConstrAttrDeferrable = 11,
-    ConstrAttrNotDeferrable = 12,
-    ConstrAttrDeferred = 13,
-    ConstrAttrImmediate = 14,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ImportForeignSchemaType {
-    Undefined = 0,
-    FdwImportSchemaAll = 1,
-    FdwImportSchemaLimitTo = 2,
-    FdwImportSchemaExcept = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RoleStmtType {
-    Undefined = 0,
-    RolestmtRole = 1,
-    RolestmtUser = 2,
-    RolestmtGroup = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum FetchDirection {
-    Undefined = 0,
-    FetchForward = 1,
-    FetchBackward = 2,
-    FetchAbsolute = 3,
-    FetchRelative = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum FunctionParameterMode {
-    Undefined = 0,
-    FuncParamIn = 1,
-    FuncParamOut = 2,
-    FuncParamInout = 3,
-    FuncParamVariadic = 4,
-    FuncParamTable = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum TransactionStmtKind {
-    Undefined = 0,
-    TransStmtBegin = 1,
-    TransStmtStart = 2,
-    TransStmtCommit = 3,
-    TransStmtRollback = 4,
-    TransStmtSavepoint = 5,
-    TransStmtRelease = 6,
-    TransStmtRollbackTo = 7,
-    TransStmtPrepare = 8,
-    TransStmtCommitPrepared = 9,
-    TransStmtRollbackPrepared = 10,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ViewCheckOption {
-    Undefined = 0,
-    NoCheckOption = 1,
-    LocalCheckOption = 2,
-    CascadedCheckOption = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ClusterOption {
-    Undefined = 0,
-    CluoptRecheck = 1,
-    CluoptVerbose = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum DiscardMode {
-    Undefined = 0,
-    DiscardAll = 1,
-    DiscardPlans = 2,
-    DiscardSequences = 3,
-    DiscardTemp = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ReindexObjectType {
-    Undefined = 0,
-    ReindexObjectIndex = 1,
-    ReindexObjectTable = 2,
-    ReindexObjectSchema = 3,
-    ReindexObjectSystem = 4,
-    ReindexObjectDatabase = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AlterTsConfigType {
-    AlterTsconfigTypeUndefined = 0,
-    AlterTsconfigAddMapping = 1,
-    AlterTsconfigAlterMappingForToken = 2,
-    AlterTsconfigReplaceDict = 3,
-    AlterTsconfigReplaceDictForToken = 4,
-    AlterTsconfigDropMapping = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AlterSubscriptionType {
-    Undefined = 0,
-    AlterSubscriptionOptions = 1,
-    AlterSubscriptionConnection = 2,
-    AlterSubscriptionPublication = 3,
-    AlterSubscriptionRefresh = 4,
-    AlterSubscriptionEnabled = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum OnCommitAction {
-    Undefined = 0,
-    OncommitNoop = 1,
-    OncommitPreserveRows = 2,
-    OncommitDeleteRows = 3,
-    OncommitDrop = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum ParamKind {
-    Undefined = 0,
-    ParamExtern = 1,
-    ParamExec = 2,
-    ParamSublink = 3,
-    ParamMultiexpr = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CoercionContext {
-    Undefined = 0,
-    CoercionImplicit = 1,
-    CoercionAssignment = 2,
-    CoercionExplicit = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CoercionForm {
-    Undefined = 0,
-    CoerceExplicitCall = 1,
-    CoerceExplicitCast = 2,
-    CoerceImplicitCast = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum BoolExprType {
-    Undefined = 0,
-    AndExpr = 1,
-    OrExpr = 2,
-    NotExpr = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SubLinkType {
-    Undefined = 0,
-    ExistsSublink = 1,
-    AllSublink = 2,
-    AnySublink = 3,
-    RowcompareSublink = 4,
-    ExprSublink = 5,
-    MultiexprSublink = 6,
-    ArraySublink = 7,
-    CteSublink = 8,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum RowCompareType {
-    Undefined = 0,
-    RowcompareLt = 1,
-    RowcompareLe = 2,
-    RowcompareEq = 3,
-    RowcompareGe = 4,
-    RowcompareGt = 5,
-    RowcompareNe = 6,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum MinMaxOp {
-    Undefined = 0,
-    IsGreatest = 1,
-    IsLeast = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SqlValueFunctionOp {
-    SqlvalueFunctionOpUndefined = 0,
-    SvfopCurrentDate = 1,
-    SvfopCurrentTime = 2,
-    SvfopCurrentTimeN = 3,
-    SvfopCurrentTimestamp = 4,
-    SvfopCurrentTimestampN = 5,
-    SvfopLocaltime = 6,
-    SvfopLocaltimeN = 7,
-    SvfopLocaltimestamp = 8,
-    SvfopLocaltimestampN = 9,
-    SvfopCurrentRole = 10,
-    SvfopCurrentUser = 11,
-    SvfopUser = 12,
-    SvfopSessionUser = 13,
-    SvfopCurrentCatalog = 14,
-    SvfopCurrentSchema = 15,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum XmlExprOp {
-    Undefined = 0,
-    IsXmlconcat = 1,
-    IsXmlelement = 2,
-    IsXmlforest = 3,
-    IsXmlparse = 4,
-    IsXmlpi = 5,
-    IsXmlroot = 6,
-    IsXmlserialize = 7,
-    IsDocument = 8,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum XmlOptionType {
-    Undefined = 0,
-    XmloptionDocument = 1,
-    XmloptionContent = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum NullTestType {
-    Undefined = 0,
-    IsNull = 1,
-    IsNotNull = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum BoolTestType {
-    Undefined = 0,
-    IsTrue = 1,
-    IsNotTrue = 2,
-    IsFalse = 3,
-    IsNotFalse = 4,
-    IsUnknown = 5,
-    IsNotUnknown = 6,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum CmdType {
-    Undefined = 0,
-    CmdUnknown = 1,
-    CmdSelect = 2,
-    CmdUpdate = 3,
-    CmdInsert = 4,
-    CmdDelete = 5,
-    CmdUtility = 6,
-    CmdNothing = 7,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum JoinType {
-    Undefined = 0,
-    JoinInner = 1,
-    JoinLeft = 2,
-    JoinFull = 3,
-    JoinRight = 4,
-    JoinSemi = 5,
-    JoinAnti = 6,
-    JoinUniqueOuter = 7,
-    JoinUniqueInner = 8,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AggStrategy {
-    Undefined = 0,
-    AggPlain = 1,
-    AggSorted = 2,
-    AggHashed = 3,
-    AggMixed = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum AggSplit {
-    Undefined = 0,
-    AggsplitSimple = 1,
-    AggsplitInitialSerial = 2,
-    AggsplitFinalDeserial = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SetOpCmd {
-    Undefined = 0,
-    SetopcmdIntersect = 1,
-    SetopcmdIntersectAll = 2,
-    SetopcmdExcept = 3,
-    SetopcmdExceptAll = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum SetOpStrategy {
-    Undefined = 0,
-    SetopSorted = 1,
-    SetopHashed = 2,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum OnConflictAction {
-    Undefined = 0,
-    OnconflictNone = 1,
-    OnconflictNothing = 2,
-    OnconflictUpdate = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LimitOption {
-    Undefined = 0,
-    Default = 1,
-    Count = 2,
-    WithTies = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LockClauseStrength {
-    Undefined = 0,
-    LcsNone = 1,
-    LcsForkeyshare = 2,
-    LcsForshare = 3,
-    LcsFornokeyupdate = 4,
-    LcsForupdate = 5,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LockWaitPolicy {
-    Undefined = 0,
-    LockWaitBlock = 1,
-    LockWaitSkip = 2,
-    LockWaitError = 3,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum LockTupleMode {
-    Undefined = 0,
-    LockTupleKeyShare = 1,
-    LockTupleShare = 2,
-    LockTupleNoKeyExclusive = 3,
-    LockTupleExclusive = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum KeywordKind {
-    NoKeyword = 0,
-    UnreservedKeyword = 1,
-    ColNameKeyword = 2,
-    TypeFuncNameKeyword = 3,
-    ReservedKeyword = 4,
-}
-#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, PartialOrd, Ord)]
-#[repr(i32)]
-pub enum Token {
-    Nul = 0,
-    /// Single-character tokens that are returned 1:1 (identical with "self" list in scan.l)
-    /// Either supporting syntax, or single-character operators (some can be both)
-    /// Also see <https://www.postgresql.org/docs/12/sql-syntax-lexical.html#SQL-SYNTAX-SPECIAL-CHARS>
-    ///
-    /// "%"
-    Ascii37 = 37,
-    /// "("
-    Ascii40 = 40,
-    /// ")"
-    Ascii41 = 41,
-    /// "*"
-    Ascii42 = 42,
-    /// "+"
-    Ascii43 = 43,
-    /// ","
-    Ascii44 = 44,
-    /// "-"
-    Ascii45 = 45,
-    /// "."
-    Ascii46 = 46,
-    /// "/"
-    Ascii47 = 47,
-    /// ":"
-    Ascii58 = 58,
-    /// ";"
-    Ascii59 = 59,
-    /// "<"
-    Ascii60 = 60,
-    /// "="
-    Ascii61 = 61,
-    /// ">"
-    Ascii62 = 62,
-    /// "?"
-    Ascii63 = 63,
-    /// "["
-    Ascii91 = 91,
-    /// "\"
-    Ascii92 = 92,
-    /// "]"
-    Ascii93 = 93,
-    /// "^"
-    Ascii94 = 94,
-    /// Named tokens in scan.l
-    Ident = 258,
-    Uident = 259,
-    Fconst = 260,
-    Sconst = 261,
-    Usconst = 262,
-    Bconst = 263,
-    Xconst = 264,
-    Op = 265,
-    Iconst = 266,
-    Param = 267,
-    Typecast = 268,
-    DotDot = 269,
-    ColonEquals = 270,
-    EqualsGreater = 271,
-    LessEquals = 272,
-    GreaterEquals = 273,
-    NotEquals = 274,
-    SqlComment = 275,
-    CComment = 276,
-    AbortP = 277,
-    AbsoluteP = 278,
-    Access = 279,
-    Action = 280,
-    AddP = 281,
-    Admin = 282,
-    After = 283,
-    Aggregate = 284,
-    All = 285,
-    Also = 286,
-    Alter = 287,
-    Always = 288,
-    Analyse = 289,
-    Analyze = 290,
-    And = 291,
-    Any = 292,
-    Array = 293,
-    As = 294,
-    Asc = 295,
-    Assertion = 296,
-    Assignment = 297,
-    Asymmetric = 298,
-    At = 299,
-    Attach = 300,
-    Attribute = 301,
-    Authorization = 302,
-    Backward = 303,
-    Before = 304,
-    BeginP = 305,
-    Between = 306,
-    Bigint = 307,
-    Binary = 308,
-    Bit = 309,
-    BooleanP = 310,
-    Both = 311,
-    By = 312,
-    Cache = 313,
-    Call = 314,
-    Called = 315,
-    Cascade = 316,
-    Cascaded = 317,
-    Case = 318,
-    Cast = 319,
-    CatalogP = 320,
-    Chain = 321,
-    CharP = 322,
-    Character = 323,
-    Characteristics = 324,
-    Check = 325,
-    Checkpoint = 326,
-    Class = 327,
-    Close = 328,
-    Cluster = 329,
-    Coalesce = 330,
-    Collate = 331,
-    Collation = 332,
-    Column = 333,
-    Columns = 334,
-    Comment = 335,
-    Comments = 336,
-    Commit = 337,
-    Committed = 338,
-    Concurrently = 339,
-    Configuration = 340,
-    Conflict = 341,
-    Connection = 342,
-    Constraint = 343,
-    Constraints = 344,
-    ContentP = 345,
-    ContinueP = 346,
-    ConversionP = 347,
-    Copy = 348,
-    Cost = 349,
-    Create = 350,
-    Cross = 351,
-    Csv = 352,
-    Cube = 353,
-    CurrentP = 354,
-    CurrentCatalog = 355,
-    CurrentDate = 356,
-    CurrentRole = 357,
-    CurrentSchema = 358,
-    CurrentTime = 359,
-    CurrentTimestamp = 360,
-    CurrentUser = 361,
-    Cursor = 362,
-    Cycle = 363,
-    DataP = 364,
-    Database = 365,
-    DayP = 366,
-    Deallocate = 367,
-    Dec = 368,
-    DecimalP = 369,
-    Declare = 370,
-    Default = 371,
-    Defaults = 372,
-    Deferrable = 373,
-    Deferred = 374,
-    Definer = 375,
-    DeleteP = 376,
-    Delimiter = 377,
-    Delimiters = 378,
-    Depends = 379,
-    Desc = 380,
-    Detach = 381,
-    Dictionary = 382,
-    DisableP = 383,
-    Discard = 384,
-    Distinct = 385,
-    Do = 386,
-    DocumentP = 387,
-    DomainP = 388,
-    DoubleP = 389,
-    Drop = 390,
-    Each = 391,
-    Else = 392,
-    EnableP = 393,
-    Encoding = 394,
-    Encrypted = 395,
-    EndP = 396,
-    EnumP = 397,
-    Escape = 398,
-    Event = 399,
-    Except = 400,
-    Exclude = 401,
-    Excluding = 402,
-    Exclusive = 403,
-    Execute = 404,
-    Exists = 405,
-    Explain = 406,
-    Expression = 407,
-    Extension = 408,
-    External = 409,
-    Extract = 410,
-    FalseP = 411,
-    Family = 412,
-    Fetch = 413,
-    Filter = 414,
-    FirstP = 415,
-    FloatP = 416,
-    Following = 417,
-    For = 418,
-    Force = 419,
-    Foreign = 420,
-    Forward = 421,
-    Freeze = 422,
-    From = 423,
-    Full = 424,
-    Function = 425,
-    Functions = 426,
-    Generated = 427,
-    Global = 428,
-    Grant = 429,
-    Granted = 430,
-    Greatest = 431,
-    GroupP = 432,
-    Grouping = 433,
-    Groups = 434,
-    Handler = 435,
-    Having = 436,
-    HeaderP = 437,
-    Hold = 438,
-    HourP = 439,
-    IdentityP = 440,
-    IfP = 441,
-    Ilike = 442,
-    Immediate = 443,
-    Immutable = 444,
-    ImplicitP = 445,
-    ImportP = 446,
-    InP = 447,
-    Include = 448,
-    Including = 449,
-    Increment = 450,
-    Index = 451,
-    Indexes = 452,
-    Inherit = 453,
-    Inherits = 454,
-    Initially = 455,
-    InlineP = 456,
-    InnerP = 457,
-    Inout = 458,
-    InputP = 459,
-    Insensitive = 460,
-    Insert = 461,
-    Instead = 462,
-    IntP = 463,
-    Integer = 464,
-    Intersect = 465,
-    Interval = 466,
-    Into = 467,
-    Invoker = 468,
-    Is = 469,
-    Isnull = 470,
-    Isolation = 471,
-    Join = 472,
-    Key = 473,
-    Label = 474,
-    Language = 475,
-    LargeP = 476,
-    LastP = 477,
-    LateralP = 478,
-    Leading = 479,
-    Leakproof = 480,
-    Least = 481,
-    Left = 482,
-    Level = 483,
-    Like = 484,
-    Limit = 485,
-    Listen = 486,
-    Load = 487,
-    Local = 488,
-    Localtime = 489,
-    Localtimestamp = 490,
-    Location = 491,
-    LockP = 492,
-    Locked = 493,
-    Logged = 494,
-    Mapping = 495,
-    Match = 496,
-    Materialized = 497,
-    Maxvalue = 498,
-    Method = 499,
-    MinuteP = 500,
-    Minvalue = 501,
-    Mode = 502,
-    MonthP = 503,
-    Move = 504,
-    NameP = 505,
-    Names = 506,
-    National = 507,
-    Natural = 508,
-    Nchar = 509,
-    New = 510,
-    Next = 511,
-    Nfc = 512,
-    Nfd = 513,
-    Nfkc = 514,
-    Nfkd = 515,
-    No = 516,
-    None = 517,
-    Normalize = 518,
-    Normalized = 519,
-    Not = 520,
-    Nothing = 521,
-    Notify = 522,
-    Notnull = 523,
-    Nowait = 524,
-    NullP = 525,
-    Nullif = 526,
-    NullsP = 527,
-    Numeric = 528,
-    ObjectP = 529,
-    Of = 530,
-    Off = 531,
-    Offset = 532,
-    Oids = 533,
-    Old = 534,
-    On = 535,
-    Only = 536,
-    Operator = 537,
-    Option = 538,
-    Options = 539,
-    Or = 540,
-    Order = 541,
-    Ordinality = 542,
-    Others = 543,
-    OutP = 544,
-    OuterP = 545,
-    Over = 546,
-    Overlaps = 547,
-    Overlay = 548,
-    Overriding = 549,
-    Owned = 550,
-    Owner = 551,
-    Parallel = 552,
-    Parser = 553,
-    Partial = 554,
-    Partition = 555,
-    Passing = 556,
-    Password = 557,
-    Placing = 558,
-    Plans = 559,
-    Policy = 560,
-    Position = 561,
-    Preceding = 562,
-    Precision = 563,
-    Preserve = 564,
-    Prepare = 565,
-    Prepared = 566,
-    Primary = 567,
-    Prior = 568,
-    Privileges = 569,
-    Procedural = 570,
-    Procedure = 571,
-    Procedures = 572,
-    Program = 573,
-    Publication = 574,
-    Quote = 575,
-    Range = 576,
-    Read = 577,
-    Real = 578,
-    Reassign = 579,
-    Recheck = 580,
-    Recursive = 581,
-    Ref = 582,
-    References = 583,
-    Referencing = 584,
-    Refresh = 585,
-    Reindex = 586,
-    RelativeP = 587,
-    Release = 588,
-    Rename = 589,
-    Repeatable = 590,
-    Replace = 591,
-    Replica = 592,
-    Reset = 593,
-    Restart = 594,
-    Restrict = 595,
-    Returning = 596,
-    Returns = 597,
-    Revoke = 598,
-    Right = 599,
-    Role = 600,
-    Rollback = 601,
-    Rollup = 602,
-    Routine = 603,
-    Routines = 604,
-    Row = 605,
-    Rows = 606,
-    Rule = 607,
-    Savepoint = 608,
-    Schema = 609,
-    Schemas = 610,
-    Scroll = 611,
-    Search = 612,
-    SecondP = 613,
-    Security = 614,
-    Select = 615,
-    Sequence = 616,
-    Sequences = 617,
-    Serializable = 618,
-    Server = 619,
-    Session = 620,
-    SessionUser = 621,
-    Set = 622,
-    Sets = 623,
-    Setof = 624,
-    Share = 625,
-    Show = 626,
-    Similar = 627,
-    Simple = 628,
-    Skip = 629,
-    Smallint = 630,
-    Snapshot = 631,
-    Some = 632,
-    SqlP = 633,
-    Stable = 634,
-    StandaloneP = 635,
-    Start = 636,
-    Statement = 637,
-    Statistics = 638,
-    Stdin = 639,
-    Stdout = 640,
-    Storage = 641,
-    Stored = 642,
-    StrictP = 643,
-    StripP = 644,
-    Subscription = 645,
-    Substring = 646,
-    Support = 647,
-    Symmetric = 648,
-    Sysid = 649,
-    SystemP = 650,
-    Table = 651,
-    Tables = 652,
-    Tablesample = 653,
-    Tablespace = 654,
-    Temp = 655,
-    Template = 656,
-    Temporary = 657,
-    TextP = 658,
-    Then = 659,
-    Ties = 660,
-    Time = 661,
-    Timestamp = 662,
-    To = 663,
-    Trailing = 664,
-    Transaction = 665,
-    Transform = 666,
-    Treat = 667,
-    Trigger = 668,
-    Trim = 669,
-    TrueP = 670,
-    Truncate = 671,
-    Trusted = 672,
-    TypeP = 673,
-    TypesP = 674,
-    Uescape = 675,
-    Unbounded = 676,
-    Uncommitted = 677,
-    Unencrypted = 678,
-    Union = 679,
-    Unique = 680,
-    Unknown = 681,
-    Unlisten = 682,
-    Unlogged = 683,
-    Until = 684,
-    Update = 685,
-    User = 686,
-    Using = 687,
-    Vacuum = 688,
-    Valid = 689,
-    Validate = 690,
-    Validator = 691,
-    ValueP = 692,
-    Values = 693,
-    Varchar = 694,
-    Variadic = 695,
-    Varying = 696,
-    Verbose = 697,
-    VersionP = 698,
-    View = 699,
-    Views = 700,
-    Volatile = 701,
-    When = 702,
-    Where = 703,
-    WhitespaceP = 704,
-    Window = 705,
-    With = 706,
-    Within = 707,
-    Without = 708,
-    Work = 709,
-    Wrapper = 710,
-    Write = 711,
-    XmlP = 712,
-    Xmlattributes = 713,
-    Xmlconcat = 714,
-    Xmlelement = 715,
-    Xmlexists = 716,
-    Xmlforest = 717,
-    Xmlnamespaces = 718,
-    Xmlparse = 719,
-    Xmlpi = 720,
-    Xmlroot = 721,
-    Xmlserialize = 722,
-    Xmltable = 723,
-    YearP = 724,
-    YesP = 725,
-    Zone = 726,
-    NotLa = 727,
-    NullsLa = 728,
-    WithLa = 729,
-    Postfixop = 730,
-    Uminus = 731,
-}
diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs
index 7775bbb13e8..55cf3fee9bf 100644
--- a/src/tools/tidy/src/deps.rs
+++ b/src/tools/tidy/src/deps.rs
@@ -63,6 +63,10 @@ const EXCEPTIONS_CRANELIFT: &[(&str, &str)] = &[
     ("target-lexicon", "Apache-2.0 WITH LLVM-exception"),
 ];
 
+const EXCEPTIONS_BOOTSTRAP: &[(&str, &str)] = &[
+    ("ryu", "Apache-2.0 OR BSL-1.0"), // through serde
+];
+
 /// These are the root crates that are part of the runtime. The licenses for
 /// these and all their dependencies *must not* be in the exception list.
 const RUNTIME_CRATES: &[&str] = &["std", "core", "alloc", "test", "panic_abort", "panic_unwind"];
@@ -96,7 +100,6 @@ const PERMITTED_DEPENDENCIES: &[&str] = &[
     "chalk-ir",
     "chalk-solve",
     "chrono",
-    "cmake",
     "compiler_builtins",
     "cpufeatures",
     "crc32fast",
@@ -309,7 +312,13 @@ pub fn check(root: &Path, cargo: &Path, bad: &mut bool) {
     let metadata = t!(cmd.exec());
     let runtime_ids = compute_runtime_crates(&metadata);
     check_exceptions(&metadata, EXCEPTIONS, runtime_ids, bad);
-    check_dependencies(&metadata, PERMITTED_DEPENDENCIES, RESTRICTED_DEPENDENCY_CRATES, bad);
+    check_dependencies(
+        &metadata,
+        "main workspace",
+        PERMITTED_DEPENDENCIES,
+        RESTRICTED_DEPENDENCY_CRATES,
+        bad,
+    );
     check_crate_duplicate(&metadata, FORBIDDEN_TO_HAVE_DUPLICATES, bad);
     check_rustfix(&metadata, bad);
 
@@ -323,11 +332,20 @@ pub fn check(root: &Path, cargo: &Path, bad: &mut bool) {
     check_exceptions(&metadata, EXCEPTIONS_CRANELIFT, runtime_ids, bad);
     check_dependencies(
         &metadata,
+        "cranelift",
         PERMITTED_CRANELIFT_DEPENDENCIES,
         &["rustc_codegen_cranelift"],
         bad,
     );
     check_crate_duplicate(&metadata, &[], bad);
+
+    let mut cmd = cargo_metadata::MetadataCommand::new();
+    cmd.cargo_path(cargo)
+        .manifest_path(root.join("src/bootstrap/Cargo.toml"))
+        .features(cargo_metadata::CargoOpt::AllFeatures);
+    let metadata = t!(cmd.exec());
+    let runtime_ids = HashSet::new();
+    check_exceptions(&metadata, EXCEPTIONS_BOOTSTRAP, runtime_ids, bad);
 }
 
 /// Check that all licenses are in the valid list in `LICENSES`.
@@ -409,6 +427,7 @@ fn check_exceptions(
 /// Specifically, this checks that the dependencies are on the `PERMITTED_DEPENDENCIES`.
 fn check_dependencies(
     metadata: &Metadata,
+    descr: &str,
     permitted_dependencies: &[&'static str],
     restricted_dependency_crates: &[&'static str],
     bad: &mut bool,
@@ -438,7 +457,7 @@ fn check_dependencies(
     }
 
     if !unapproved.is_empty() {
-        tidy_error!(bad, "Dependencies not explicitly permitted:");
+        tidy_error!(bad, "Dependencies for {} not explicitly permitted:", descr);
         for dep in unapproved {
             println!("* {dep}");
         }
diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs
index f59121181d2..8ec5c332493 100644
--- a/src/tools/tidy/src/ui_tests.rs
+++ b/src/tools/tidy/src/ui_tests.rs
@@ -8,7 +8,7 @@ use std::path::Path;
 const ENTRY_LIMIT: usize = 1000;
 // FIXME: The following limits should be reduced eventually.
 const ROOT_ENTRY_LIMIT: usize = 968;
-const ISSUES_ENTRY_LIMIT: usize = 2179;
+const ISSUES_ENTRY_LIMIT: usize = 2147;
 
 fn check_entries(path: &Path, bad: &mut bool) {
     let dirs = walkdir::WalkDir::new(&path.join("test/ui"))
diff --git a/src/version b/src/version
index af92bdd9f58..9405730420f 100644
--- a/src/version
+++ b/src/version
@@ -1 +1 @@
-1.63.0
+1.64.0