about summary refs log tree commit diff
path: root/tests
diff options
context:
space:
mode:
Diffstat (limited to 'tests')
-rw-r--r--tests/assembly/nvptx-kernel-abi/nvptx-kernel-args-abi-v7.rs18
-rw-r--r--tests/codegen/bigint-helpers.rs13
-rw-r--r--tests/codegen/intrinsics/disjoint_bitor.rs30
-rw-r--r--tests/crashes/125810.rs10
-rw-r--r--tests/crashes/134355.rs6
-rw-r--r--tests/crashes/135124.rs9
-rw-r--r--tests/crashes/90110.rs57
-rw-r--r--tests/mir-opt/building/enum_cast.droppy.built.after.mir71
-rw-r--r--tests/mir-opt/building/enum_cast.rs21
-rw-r--r--tests/run-make/split-debuginfo/Makefile371
-rw-r--r--tests/run-make/split-debuginfo/rmake.rs1618
-rw-r--r--tests/rustdoc-json/primitives/primitive_impls.rs5
-rw-r--r--tests/rustdoc-ui/custom_code_classes_in_docs-warning3.rs5
-rw-r--r--tests/rustdoc-ui/custom_code_classes_in_docs-warning3.stderr4
-rw-r--r--tests/rustdoc/cfg_doc_reexport.rs5
-rw-r--r--tests/rustdoc/cross-crate-primitive-doc.rs5
-rw-r--r--tests/rustdoc/intra-doc/no-doc-primitive.rs5
-rw-r--r--tests/rustdoc/reexport-trait-from-hidden-111064-2.rs5
-rw-r--r--tests/rustdoc/safe-intrinsic.rs5
-rw-r--r--tests/ui/associated-consts/issue-58022.stderr18
-rw-r--r--tests/ui/borrowck/borrowck-thread-local-static-borrow-outlives-fn.stderr2
-rw-r--r--tests/ui/cenum_impl_drop_cast.rs3
-rw-r--r--tests/ui/cenum_impl_drop_cast.stderr25
-rw-r--r--tests/ui/check-cfg/cargo-build-script.stderr2
-rw-r--r--tests/ui/check-cfg/cargo-feature.none.stderr2
-rw-r--r--tests/ui/check-cfg/cargo-feature.some.stderr2
-rw-r--r--tests/ui/check-cfg/cfg-value-for-cfg-name-duplicate.stderr2
-rw-r--r--tests/ui/check-cfg/cfg-value-for-cfg-name-multiple.stderr2
-rw-r--r--tests/ui/check-cfg/exhaustive-names-values.feature.stderr2
-rw-r--r--tests/ui/check-cfg/exhaustive-names-values.full.stderr2
-rw-r--r--tests/ui/check-cfg/mix.stderr2
-rw-r--r--tests/ui/check-cfg/raw-keywords.edition2015.stderr2
-rw-r--r--tests/ui/check-cfg/raw-keywords.edition2021.stderr2
-rw-r--r--tests/ui/check-cfg/report-in-external-macros.cargo.stderr2
-rw-r--r--tests/ui/check-cfg/report-in-external-macros.rustc.stderr2
-rw-r--r--tests/ui/check-cfg/well-known-names.stderr1
-rw-r--r--tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs (renamed from tests/ui/issues/issue-40883.rs)0
-rw-r--r--tests/ui/consts/const-slice-array-deref.rs1
-rw-r--r--tests/ui/consts/const-slice-array-deref.stderr13
-rw-r--r--tests/ui/consts/const-unsized.rs8
-rw-r--r--tests/ui/consts/const-unsized.stderr54
-rw-r--r--tests/ui/consts/const_refs_to_static-ice-121413.rs2
-rw-r--r--tests/ui/consts/const_refs_to_static-ice-121413.stderr11
-rw-r--r--tests/ui/contracts/contract-annotation-limitations.rs28
-rw-r--r--tests/ui/contracts/contract-annotation-limitations.stderr23
-rw-r--r--tests/ui/contracts/contract-attributes-generics.chk_const_fail.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-generics.chk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-generics.chk_fail_pre.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-generics.chk_pass.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-generics.rs71
-rw-r--r--tests/ui/contracts/contract-attributes-generics.unchk_pass.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-nest.chk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-nest.chk_fail_pre.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-nest.chk_pass.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-nest.rs45
-rw-r--r--tests/ui/contracts/contract-attributes-nest.unchk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-nest.unchk_fail_pre.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-nest.unchk_pass.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-tail.chk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-tail.chk_fail_pre.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-tail.chk_pass.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-tail.rs43
-rw-r--r--tests/ui/contracts/contract-attributes-tail.unchk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-tail.unchk_fail_pre.stderr11
-rw-r--r--tests/ui/contracts/contract-attributes-tail.unchk_pass.stderr11
-rw-r--r--tests/ui/contracts/contract-captures-via-closure-copy.rs26
-rw-r--r--tests/ui/contracts/contract-captures-via-closure-copy.stderr11
-rw-r--r--tests/ui/contracts/contract-captures-via-closure-noncopy.rs23
-rw-r--r--tests/ui/contracts/contract-captures-via-closure-noncopy.stderr36
-rw-r--r--tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_ret.stderr11
-rw-r--r--tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_try.stderr11
-rw-r--r--tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_yeet.stderr11
-rw-r--r--tests/ui/contracts/contracts-ensures-early-fn-exit.chk_pass.stderr11
-rw-r--r--tests/ui/contracts/contracts-ensures-early-fn-exit.rs49
-rw-r--r--tests/ui/contracts/contracts-ensures-early-fn-exit.unchk_pass.stderr11
-rw-r--r--tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.rs15
-rw-r--r--tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.stderr11
-rw-r--r--tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.rs17
-rw-r--r--tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.stderr11
-rw-r--r--tests/ui/contracts/disallow-contract-annotation-on-non-fn.rs53
-rw-r--r--tests/ui/contracts/disallow-contract-annotation-on-non-fn.stderr53
-rw-r--r--tests/ui/contracts/internal_machinery/contract-ast-extensions-nest.rs44
-rw-r--r--tests/ui/contracts/internal_machinery/contract-ast-extensions-tail.rs42
-rw-r--r--tests/ui/contracts/internal_machinery/contract-intrinsics.rs36
-rw-r--r--tests/ui/contracts/internal_machinery/contract-lang-items.chk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/internal_machinery/contract-lang-items.chk_pass.stderr11
-rw-r--r--tests/ui/contracts/internal_machinery/contract-lang-items.rs39
-rw-r--r--tests/ui/contracts/internal_machinery/contract-lang-items.unchk_fail_post.stderr11
-rw-r--r--tests/ui/contracts/internal_machinery/contract-lang-items.unchk_pass.stderr11
-rw-r--r--tests/ui/contracts/internal_machinery/contracts-lowering-ensures-is-not-inherited-when-nesting.rs15
-rw-r--r--tests/ui/contracts/internal_machinery/contracts-lowering-requires-is-not-inherited-when-nesting.rs17
-rw-r--r--tests/ui/contracts/internal_machinery/internal-feature-gating.rs20
-rw-r--r--tests/ui/contracts/internal_machinery/internal-feature-gating.stderr63
-rw-r--r--tests/ui/crate-loading/crateresolve1.rs4
-rw-r--r--tests/ui/crate-loading/crateresolve2.rs2
-rw-r--r--tests/ui/diagnostic-width/E0271.ascii.stderr2
-rw-r--r--tests/ui/diagnostic-width/E0271.rs2
-rw-r--r--tests/ui/diagnostic-width/E0271.unicode.stderr2
-rw-r--r--tests/ui/editions/auxiliary/nested_macro_rules_dep_2021.rs23
-rw-r--r--tests/ui/editions/auxiliary/nested_macro_rules_dep_2024.rs23
-rw-r--r--tests/ui/editions/nested-macro-rules-edition.e2021.stderr27
-rw-r--r--tests/ui/editions/nested-macro-rules-edition.rs39
-rw-r--r--tests/ui/enum/closure-in-enum-issue-48838.rs (renamed from tests/ui/issues/issue-48838.rs)0
-rw-r--r--tests/ui/enum/closure-in-enum-issue-48838.stderr (renamed from tests/ui/issues/issue-48838.stderr)4
-rw-r--r--tests/ui/enum/enum-inside-enum-issue-40350.rs (renamed from tests/ui/issues/issue-40350.rs)0
-rw-r--r--tests/ui/error-codes/E0462.rs2
-rw-r--r--tests/ui/error-codes/E0464.rs2
-rw-r--r--tests/ui/error-codes/E0523.rs2
-rw-r--r--tests/ui/error-codes/E0746.stderr4
-rw-r--r--tests/ui/expr/if/if-let-no-match-guards-issue-41272.rs (renamed from tests/ui/issues/issue-41272.rs)0
-rw-r--r--tests/ui/extern-flag/empty-extern-arg.stderr4
-rw-r--r--tests/ui/feature-gates/feature-gate-cfg-contract-checks.rs5
-rw-r--r--tests/ui/feature-gates/feature-gate-cfg-contract-checks.stderr13
-rw-r--r--tests/ui/feature-gates/feature-gate-contracts.rs11
-rw-r--r--tests/ui/feature-gates/feature-gate-contracts.stderr43
-rw-r--r--tests/ui/fn/error-recovery-mismatch.rs20
-rw-r--r--tests/ui/fn/error-recovery-mismatch.stderr46
-rw-r--r--tests/ui/fn/param-mismatch-trait-fn.rs10
-rw-r--r--tests/ui/fn/param-mismatch-trait-fn.stderr23
-rw-r--r--tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.rs2
-rw-r--r--tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.stderr37
-rw-r--r--tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs2
-rw-r--r--tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr198
-rw-r--r--tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.rs6
-rw-r--r--tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr115
-rw-r--r--tests/ui/inference/issue-72616.stderr2
-rw-r--r--tests/ui/issues/issue-17954.stderr2
-rw-r--r--tests/ui/issues/issue-18107.rs2
-rw-r--r--tests/ui/issues/issue-18107.stderr2
-rw-r--r--tests/ui/issues/issue-5883.rs2
-rw-r--r--tests/ui/issues/issue-5883.stderr16
-rw-r--r--tests/ui/json/json-multiple.rs1
-rw-r--r--tests/ui/json/json-options.rs1
-rw-r--r--tests/ui/lang-items/lang-item-missing.stderr4
-rw-r--r--tests/ui/lexer/floating-point-0e10-issue-40408.rs (renamed from tests/ui/issues/issue-40408.rs)0
-rw-r--r--tests/ui/macros/const-expr-invocations-issue-40136.rs (renamed from tests/ui/issues/issue-40136.rs)0
-rw-r--r--tests/ui/macros/macros-in-trait-positions-issue-40845.rs (renamed from tests/ui/issues/issue-40845.rs)0
-rw-r--r--tests/ui/macros/macros-in-trait-positions-issue-40845.stderr (renamed from tests/ui/issues/issue-40845.stderr)4
-rw-r--r--tests/ui/match/enum-and-break-in-match-issue-41213.rs (renamed from tests/ui/issues/issue-41213.rs)2
-rw-r--r--tests/ui/methods/issues/issue-61525.stderr2
-rw-r--r--tests/ui/privacy/privacy2.rs4
-rw-r--r--tests/ui/privacy/privacy2.stderr38
-rw-r--r--tests/ui/privacy/privacy3.rs4
-rw-r--r--tests/ui/privacy/privacy3.stderr32
-rw-r--r--tests/ui/proc-macro/issue-59191-replace-root-with-fn.stderr6
-rw-r--r--tests/ui/self/arbitrary_self_type_infinite_recursion.rs24
-rw-r--r--tests/ui/self/arbitrary_self_type_infinite_recursion.stderr47
-rw-r--r--tests/ui/self/dispatch-from-dyn-layout-2.rs16
-rw-r--r--tests/ui/self/dispatch-from-dyn-layout-3.rs19
-rw-r--r--tests/ui/self/dispatch-from-dyn-layout.rs (renamed from tests/crashes/57276.rs)6
-rw-r--r--tests/ui/static/issue-24446.rs1
-rw-r--r--tests/ui/static/issue-24446.stderr16
-rw-r--r--tests/ui/statics/unsized_type2.stderr14
-rw-r--r--tests/ui/suggestions/dyn-incompatible-trait-references-self.stderr24
-rw-r--r--tests/ui/suggestions/for-loop-missing-in.fixed (renamed from tests/ui/issues/issue-40782.fixed)0
-rw-r--r--tests/ui/suggestions/for-loop-missing-in.rs (renamed from tests/ui/issues/issue-40782.rs)0
-rw-r--r--tests/ui/suggestions/for-loop-missing-in.stderr (renamed from tests/ui/issues/issue-40782.stderr)4
-rw-r--r--tests/ui/suggestions/suggest-std-when-using-type.fixed5
-rw-r--r--tests/ui/suggestions/suggest-std-when-using-type.rs5
-rw-r--r--tests/ui/suggestions/suggest-std-when-using-type.stderr16
-rw-r--r--tests/ui/suggestions/trait-with-missing-associated-type-restriction.stderr2
-rw-r--r--tests/ui/trait-bounds/deep-level-Send-bound-check-issue-40827.rs (renamed from tests/ui/issues/issue-40827.rs)0
-rw-r--r--tests/ui/trait-bounds/deep-level-Send-bound-check-issue-40827.stderr (renamed from tests/ui/issues/issue-40827.stderr)16
-rw-r--r--tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs1
-rw-r--r--tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr15
-rw-r--r--tests/ui/traits/const-traits/span-bug-issue-121418.stderr22
-rw-r--r--tests/ui/traits/issue-52893.stderr2
-rw-r--r--tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.rs7
-rw-r--r--tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.stderr26
-rw-r--r--tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.rs2
-rw-r--r--tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.stderr6
-rw-r--r--tests/ui/traits/next-solver/specialization-transmute.rs2
-rw-r--r--tests/ui/traits/next-solver/specialization-transmute.stderr8
-rw-r--r--tests/ui/traits/next-solver/unsound-region-obligation.rs2
-rw-r--r--tests/ui/traits/next-solver/unsound-region-obligation.stderr4
-rw-r--r--tests/ui/type/pattern_types/assoc_const.default.stderr36
-rw-r--r--tests/ui/type/pattern_types/assoc_const.rs24
-rw-r--r--tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.rs10
-rw-r--r--tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.stderr42
-rw-r--r--tests/ui/type/pattern_types/bad_pat.rs2
-rw-r--r--tests/ui/type/pattern_types/bad_pat.stderr2
-rw-r--r--tests/ui/type/pattern_types/const_block.rs10
-rw-r--r--tests/ui/type/pattern_types/const_block.stderr72
-rw-r--r--tests/ui/type/pattern_types/free_const.rs13
-rw-r--r--tests/ui/type/pattern_types/nested.rs4
-rw-r--r--tests/ui/type/pattern_types/nested.stderr52
-rw-r--r--tests/ui/type/pattern_types/pattern_type_mismatch.rs12
-rw-r--r--tests/ui/type/pattern_types/pattern_type_mismatch.stderr44
-rw-r--r--tests/ui/type/pattern_types/signed_ranges.rs24
-rw-r--r--tests/ui/type/pattern_types/signed_ranges.stderr41
-rw-r--r--tests/ui/type/pattern_types/unimplemented_pat.rs8
-rw-r--r--tests/ui/type/pattern_types/unimplemented_pat.stderr21
-rw-r--r--tests/ui/typeck/coercion-check-for-addition-issue-40610.rs (renamed from tests/ui/issues/issue-40610.rs)0
-rw-r--r--tests/ui/typeck/coercion-check-for-addition-issue-40610.stderr (renamed from tests/ui/issues/issue-40610.stderr)2
-rw-r--r--tests/ui/typeck/coercion-check-for-indexing-expression-issue-40861.rs (renamed from tests/ui/issues/issue-40861.rs)0
-rw-r--r--tests/ui/typeck/coercion-check-for-indexing-expression-issue-40861.stderr (renamed from tests/ui/issues/issue-40861.stderr)2
-rw-r--r--tests/ui/typeck/issue-105946.rs1
-rw-r--r--tests/ui/typeck/issue-105946.stderr23
-rw-r--r--tests/ui/typeck/unsized-rvalue-issue-41139.rs (renamed from tests/ui/issues/issue-41139.rs)0
-rw-r--r--tests/ui/typeck/unsized-rvalue-issue-41139.stderr (renamed from tests/ui/issues/issue-41139.stderr)2
-rw-r--r--tests/ui/unsized/box-instead-of-dyn-fn.rs2
-rw-r--r--tests/ui/unsized/box-instead-of-dyn-fn.stderr2
-rw-r--r--tests/ui/unsized/issue-91801.rs2
-rw-r--r--tests/ui/unsized/issue-91801.stderr2
-rw-r--r--tests/ui/unsized/issue-91803.rs2
-rw-r--r--tests/ui/unsized/issue-91803.stderr2
-rw-r--r--tests/ui/wf/range-expr-root-of-constant-issue-40749.rs (renamed from tests/ui/issues/issue-40749.rs)0
-rw-r--r--tests/ui/wf/range-expr-root-of-constant-issue-40749.stderr (renamed from tests/ui/issues/issue-40749.stderr)2
-rw-r--r--tests/ui/where-clauses/ignore-err-clauses.rs1
-rw-r--r--tests/ui/where-clauses/ignore-err-clauses.stderr13
-rw-r--r--tests/ui/while/while-let-scope-issue-40235.rs (renamed from tests/ui/issues/issue-40235.rs)2
211 files changed, 3988 insertions, 1100 deletions
diff --git a/tests/assembly/nvptx-kernel-abi/nvptx-kernel-args-abi-v7.rs b/tests/assembly/nvptx-kernel-abi/nvptx-kernel-args-abi-v7.rs
index fb3a325a41f..b3bfc66a5a5 100644
--- a/tests/assembly/nvptx-kernel-abi/nvptx-kernel-args-abi-v7.rs
+++ b/tests/assembly/nvptx-kernel-abi/nvptx-kernel-args-abi-v7.rs
@@ -242,22 +242,6 @@ pub unsafe extern "ptx-kernel" fn f_float_array_arg(_a: [f32; 5]) {}
 //pub unsafe extern "ptx-kernel" fn f_u128_array_arg(_a: [u128; 5]) {}
 
 // CHECK: .visible .entry f_u32_slice_arg(
-// CHECK: .param .u64 f_u32_slice_arg_param_0
-// CHECK: .param .u64 f_u32_slice_arg_param_1
+// CHECK: .param .align 8 .b8 f_u32_slice_arg_param_0[16]
 #[no_mangle]
 pub unsafe extern "ptx-kernel" fn f_u32_slice_arg(_a: &[u32]) {}
-
-// CHECK: .visible .entry f_tuple_u8_u8_arg(
-// CHECK: .param .align 1 .b8 f_tuple_u8_u8_arg_param_0[2]
-#[no_mangle]
-pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_arg(_a: (u8, u8)) {}
-
-// CHECK: .visible .entry f_tuple_u32_u32_arg(
-// CHECK: .param .align 4 .b8 f_tuple_u32_u32_arg_param_0[8]
-#[no_mangle]
-pub unsafe extern "ptx-kernel" fn f_tuple_u32_u32_arg(_a: (u32, u32)) {}
-
-// CHECK: .visible .entry f_tuple_u8_u8_u32_arg(
-// CHECK: .param .align 4 .b8 f_tuple_u8_u8_u32_arg_param_0[8]
-#[no_mangle]
-pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_u32_arg(_a: (u8, u8, u32)) {}
diff --git a/tests/codegen/bigint-helpers.rs b/tests/codegen/bigint-helpers.rs
new file mode 100644
index 00000000000..355cccb8150
--- /dev/null
+++ b/tests/codegen/bigint-helpers.rs
@@ -0,0 +1,13 @@
+//@ compile-flags: -C opt-level=3
+
+#![crate_type = "lib"]
+#![feature(bigint_helper_methods)]
+
+// CHECK-LABEL: @u32_carrying_add
+#[no_mangle]
+pub fn u32_carrying_add(a: u32, b: u32, c: bool) -> (u32, bool) {
+    // CHECK: @llvm.uadd.with.overflow.i32
+    // CHECK: @llvm.uadd.with.overflow.i32
+    // CHECK: or disjoint i1
+    u32::carrying_add(a, b, c)
+}
diff --git a/tests/codegen/intrinsics/disjoint_bitor.rs b/tests/codegen/intrinsics/disjoint_bitor.rs
new file mode 100644
index 00000000000..fc45439ee0b
--- /dev/null
+++ b/tests/codegen/intrinsics/disjoint_bitor.rs
@@ -0,0 +1,30 @@
+//@ compile-flags: -C no-prepopulate-passes -Z mir-opt-level=0
+
+#![crate_type = "lib"]
+#![feature(core_intrinsics)]
+
+use std::intrinsics::disjoint_bitor;
+
+// CHECK-LABEL: @disjoint_bitor_signed
+#[no_mangle]
+pub unsafe fn disjoint_bitor_signed(x: i32, y: i32) -> i32 {
+    // CHECK: or disjoint i32 %x, %y
+    disjoint_bitor(x, y)
+}
+
+// CHECK-LABEL: @disjoint_bitor_unsigned
+#[no_mangle]
+pub unsafe fn disjoint_bitor_unsigned(x: u64, y: u64) -> u64 {
+    // CHECK: or disjoint i64 %x, %y
+    disjoint_bitor(x, y)
+}
+
+// CHECK-LABEL: @disjoint_bitor_literal
+#[no_mangle]
+pub unsafe fn disjoint_bitor_literal() -> u8 {
+    // This is a separate check because even without any passes,
+    // LLVM will fold so it's not an instruction, which can assert in LLVM.
+
+    // CHECK: store i8 3
+    disjoint_bitor(1, 2)
+}
diff --git a/tests/crashes/125810.rs b/tests/crashes/125810.rs
deleted file mode 100644
index 4a152da8ddf..00000000000
--- a/tests/crashes/125810.rs
+++ /dev/null
@@ -1,10 +0,0 @@
-//@ known-bug: rust-lang/rust#125810
-#![feature(arbitrary_self_types, dispatch_from_dyn)]
-
-use std::ops::{Deref, DispatchFromDyn};
-
-trait Trait<T: Deref<Target = Self> + DispatchFromDyn<T>> {
-    fn MONO_BUF(self: T) -> dyn Trait<T>;
-}
-
-fn main() {}
diff --git a/tests/crashes/134355.rs b/tests/crashes/134355.rs
deleted file mode 100644
index b662341e6b1..00000000000
--- a/tests/crashes/134355.rs
+++ /dev/null
@@ -1,6 +0,0 @@
-//@ known-bug: #134355
-
-//@compile-flags: --crate-type=lib
-fn digit() -> str {
-    return { i32::MIN };
-}
diff --git a/tests/crashes/135124.rs b/tests/crashes/135124.rs
deleted file mode 100644
index d6655cb46fa..00000000000
--- a/tests/crashes/135124.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-//@ known-bug: #135124
-trait A  {
-    fn y(&self)
-    {
-        fn call() -> impl Sized {}
-        self.fold(call());
-    }
-    fn fold(&self, &self._) {}
-}
diff --git a/tests/crashes/90110.rs b/tests/crashes/90110.rs
deleted file mode 100644
index a27a1f42b7a..00000000000
--- a/tests/crashes/90110.rs
+++ /dev/null
@@ -1,57 +0,0 @@
-//@ known-bug: #90110
-
-use std::fs::File;
-use std::io::{BufReader, BufRead};
-use std::str::Split;
-use std::path::Path;
-
-pub trait Parser<D>
-where dyn Parser<D>: Sized
-{
-    fn new(split_header: Split<&str>) -> Self where Self: Sized;
-    fn parse_line(&self, split_line: &Split<&str>) -> D;
-}
-
-
-pub struct CsvReader<D> {
-    parser: Box<dyn Parser<D>>,
-
-    reader: BufReader<File>,
-    buf: String,    // Buffer we will read into. Avoids re-allocation on each line.
-    path: String,   // Record this so we can return more informative error messages.
-    line: usize,    // Same motivation for this.
-}
-
-impl<D> CsvReader<D>
-where dyn Parser<D>: Sized
-{
-    fn new<F>(path: &str, make_parser: F) -> CsvReader<D>
-    where F: Fn(Split<char>) -> dyn Parser<D> {
-        let file = match File::open(Path::new(path)) {
-            Err(err) => panic!("Couldn't read {}: {}", path, err),
-            Ok(file) => file,
-        };
-
-        let mut reader = BufReader::new(file);
-
-        let mut buf = String::new();
-
-        let parser = Box::new(match reader.read_line(&mut buf) {
-            Err(err) => panic!("Failed to read the header line from {}: {}", path, err),
-            Ok(_) => {
-                let split_header = buf.split(',');
-                make_parser(split_header)
-            },
-        });
-
-        CsvReader {
-            parser: parser,
-            reader,
-            buf,
-            path: path.to_string(),
-            line: 2,
-        }
-    }
-}
-
-pub fn main() {}
diff --git a/tests/mir-opt/building/enum_cast.droppy.built.after.mir b/tests/mir-opt/building/enum_cast.droppy.built.after.mir
deleted file mode 100644
index f53c9199a49..00000000000
--- a/tests/mir-opt/building/enum_cast.droppy.built.after.mir
+++ /dev/null
@@ -1,71 +0,0 @@
-// MIR for `droppy` after built
-
-fn droppy() -> () {
-    let mut _0: ();
-    let _1: ();
-    let _2: Droppy;
-    let _4: Droppy;
-    let mut _5: isize;
-    let mut _6: u8;
-    let mut _7: bool;
-    let _8: Droppy;
-    scope 1 {
-        debug x => _2;
-        scope 2 {
-            debug y => _3;
-        }
-        scope 3 {
-            let _3: usize;
-        }
-    }
-    scope 4 {
-        debug z => _8;
-    }
-
-    bb0: {
-        StorageLive(_1);
-        StorageLive(_2);
-        _2 = Droppy::C;
-        FakeRead(ForLet(None), _2);
-        StorageLive(_3);
-        StorageLive(_4);
-        _4 = move _2;
-        _5 = discriminant(_4);
-        _6 = copy _5 as u8 (IntToInt);
-        _7 = Le(copy _6, const 2_u8);
-        assume(move _7);
-        _3 = move _5 as usize (IntToInt);
-        drop(_4) -> [return: bb1, unwind: bb4];
-    }
-
-    bb1: {
-        StorageDead(_4);
-        FakeRead(ForLet(None), _3);
-        _1 = const ();
-        StorageDead(_3);
-        drop(_2) -> [return: bb2, unwind: bb5];
-    }
-
-    bb2: {
-        StorageDead(_2);
-        StorageDead(_1);
-        StorageLive(_8);
-        _8 = Droppy::B;
-        FakeRead(ForLet(None), _8);
-        _0 = const ();
-        drop(_8) -> [return: bb3, unwind: bb5];
-    }
-
-    bb3: {
-        StorageDead(_8);
-        return;
-    }
-
-    bb4 (cleanup): {
-        drop(_2) -> [return: bb5, unwind terminate(cleanup)];
-    }
-
-    bb5 (cleanup): {
-        resume;
-    }
-}
diff --git a/tests/mir-opt/building/enum_cast.rs b/tests/mir-opt/building/enum_cast.rs
index 7ff0cdbfe8d..4fb9a27e309 100644
--- a/tests/mir-opt/building/enum_cast.rs
+++ b/tests/mir-opt/building/enum_cast.rs
@@ -41,27 +41,6 @@ fn far(far: Far) -> isize {
     far as isize
 }
 
-// EMIT_MIR enum_cast.droppy.built.after.mir
-enum Droppy {
-    A,
-    B,
-    C,
-}
-
-impl Drop for Droppy {
-    fn drop(&mut self) {}
-}
-
-fn droppy() {
-    {
-        let x = Droppy::C;
-        // remove this entire test once `cenum_impl_drop_cast` becomes a hard error
-        #[allow(cenum_impl_drop_cast)]
-        let y = x as usize;
-    }
-    let z = Droppy::B;
-}
-
 #[repr(i16)]
 enum SignedAroundZero {
     A = -2,
diff --git a/tests/run-make/split-debuginfo/Makefile b/tests/run-make/split-debuginfo/Makefile
deleted file mode 100644
index 5f463ffe8cd..00000000000
--- a/tests/run-make/split-debuginfo/Makefile
+++ /dev/null
@@ -1,371 +0,0 @@
-# ignore-cross-compile
-# ignore-riscv64 On this platform only `-Csplit-debuginfo=off` is supported, see #120518
-
-include ../tools.mk
-
-all: off packed unpacked
-
-ifeq ($(UNAME),Darwin)
-# If disabled, don't run `dsymutil`.
-off:
-	rm -rf $(TMPDIR)/*.dSYM
-	$(RUSTC) foo.rs -g -C split-debuginfo=off
-	[ ! -d $(TMPDIR)/foo.dSYM ]
-
-# Packed by default, but only if debuginfo is requested
-packed:
-	rm -rf $(TMPDIR)/*.dSYM
-	$(RUSTC) foo.rs
-	[ ! -d $(TMPDIR)/foo.dSYM ]
-	rm -rf $(TMPDIR)/*.dSYM
-	$(RUSTC) foo.rs -g
-	[ -d $(TMPDIR)/foo.dSYM ]
-	rm -rf $(TMPDIR)/*.dSYM
-	$(RUSTC) foo.rs -g -C split-debuginfo=packed
-	[ -d $(TMPDIR)/foo.dSYM ]
-	rm -rf $(TMPDIR)/*.dSYM
-
-# Object files are preserved with unpacked and `dsymutil` isn't run
-unpacked:
-	$(RUSTC) foo.rs -g -C split-debuginfo=unpacked
-	ls $(TMPDIR)/*.o
-	[ ! -d $(TMPDIR)/foo.dSYM ]
-else
-ifdef IS_WINDOWS
-# Windows only supports packed debuginfo - nothing to test.
-off:
-packed:
-unpacked:
-else
-# Some non-Windows, non-Darwin platforms are not stable, and some are.
-ifeq ($(UNAME),Linux)
-  UNSTABLEOPTS :=
-else
-  UNSTABLEOPTS := -Zunstable-options
-endif
-
-# - Debuginfo in `.o` files
-# - `.o` deleted
-# - `.dwo` never created
-# - `.dwp` never created
-off:
-	$(RUSTC) foo.rs -g -C $(UNSTABLEOPTS) split-debuginfo=off
-	[ ! -f $(TMPDIR)/*.dwp ]
-	[ ! -f $(TMPDIR)/*.dwo ]
-	$(RUSTC) foo.rs -g
-	[ ! -f $(TMPDIR)/*.dwp ]
-	[ ! -f $(TMPDIR)/*.dwo ]
-
-packed: packed-split packed-single packed-lto packed-remapped packed-crosscrate
-
-# - Debuginfo in `.dwo` files
-# - `.o` deleted
-# - `.dwo` deleted
-# - `.dwp` present
-packed-split:
-	$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=split
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/foo.dwp
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` deleted
-# - `.dwo` never created
-# - `.dwp` present
-packed-single:
-	$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=packed -Zsplit-dwarf-kind=single
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/foo.dwp
-	rm $(TMPDIR)/$(call BIN,foo)
-
-packed-lto: packed-lto-split packed-lto-single
-
-# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
-# - `.o` never created
-# - `.dwo` never created
-# - `.dwp` never created
-packed-lto-split:
-	$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=packed -Zsplit-dwarf-kind=split \
-		--crate-type=rlib -Clinker-plugin-lto
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/libbaz.rlib
-
-# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
-# - `.o` never created
-# - `.dwo` never created
-# - `.dwp` never created
-packed-lto-single:
-	$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=packed -Zsplit-dwarf-kind=single \
-		--crate-type=rlib -Clinker-plugin-lto
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/libbaz.rlib
-
-packed-remapped: packed-remapped-split packed-remapped-single packed-remapped-scope packed-remapped-wrong-scope
-
-# - Debuginfo in `.dwo` files
-# - `.o` and binary refer to remapped `.dwo` paths which do not exist
-# - `.o` deleted
-# - `.dwo` deleted
-# - `.dwp` present
-packed-remapped-split:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
-		-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/foo.dwp
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` and binary refer to remapped `.o` paths which do not exist
-# - `.o` deleted
-# - `.dwo` never created
-# - `.dwp` present
-packed-remapped-single:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
-		-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/foo.dwp
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` and binary refer to remapped `.o` paths which do not exist
-# - `.o` deleted
-# - `.dwo` never created
-# - `.dwp` present
-packed-remapped-scope:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
-		-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a \
-		-Z remap-path-scope=debuginfo foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/foo.dwp
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` and binary refer to remapped `.o` paths which do not exist
-# - `.o` deleted
-# - `.dwo` never created
-# - `.dwp` present
-packed-remapped-wrong-scope:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=packed -C debuginfo=2 \
-		-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a \
-		-Z remap-path-scope=macro foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (grep $(TMPDIR)) || exit 1
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/foo.dwp
-	rm $(TMPDIR)/$(call BIN,foo)
-
-packed-crosscrate: packed-crosscrate-split packed-crosscrate-single
-
-# - Debuginfo in `.dwo` files
-# - (bar) `.rlib` file created, contains `.dwo`
-# - (bar) `.o` deleted
-# - (bar) `.dwo` deleted
-# - (bar) `.dwp` never created
-# - (main) `.o` deleted
-# - (main) `.dwo` deleted
-# - (main) `.dwp` present
-packed-crosscrate-split:
-	$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
-		-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
-	ls $(TMPDIR)/*.rlib
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
-		-C split-debuginfo=packed -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/main.dwp
-	rm $(TMPDIR)/$(call BIN,main)
-
-# - Debuginfo in `.o` files
-# - (bar) `.rlib` file created, contains `.o`
-# - (bar) `.o` deleted
-# - (bar) `.dwo` never created
-# - (bar) `.dwp` never created
-# - (main) `.o` deleted
-# - (main) `.dwo` never created
-# - (main) `.dwp` present
-packed-crosscrate-single:
-	$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=packed \
-		-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
-	ls $(TMPDIR)/*.rlib
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
-		-C split-debuginfo=packed -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	rm $(TMPDIR)/main.dwp
-	rm $(TMPDIR)/$(call BIN,main)
-
-unpacked: unpacked-split unpacked-single unpacked-lto unpacked-remapped unpacked-crosscrate
-
-# - Debuginfo in `.dwo` files
-# - `.o` deleted
-# - `.dwo` present
-# - `.dwp` never created
-unpacked-split:
-	$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=split
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	rm $(TMPDIR)/*.dwo
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` present
-# - `.dwo` never created
-# - `.dwp` never created
-unpacked-single:
-	$(RUSTC) foo.rs -g $(UNSTABLEOPTS) -C split-debuginfo=unpacked -Zsplit-dwarf-kind=single
-	ls $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,foo)
-
-unpacked-lto: unpacked-lto-split unpacked-lto-single
-
-# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
-# - `.o` present (bitcode)
-# - `.dwo` never created
-# - `.dwp` never created
-unpacked-lto-split:
-	$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=unpacked -Zsplit-dwarf-kind=split \
-		--crate-type=rlib -Clinker-plugin-lto
-	rm $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/libbaz.rlib
-
-# - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
-# - `.o` present (bitcode)
-# - `.dwo` never created
-# - `.dwp` never created
-unpacked-lto-single:
-	$(RUSTC) baz.rs -g $(UNSTABLEOPTS) -Csplit-debuginfo=unpacked -Zsplit-dwarf-kind=single \
-		--crate-type=rlib -Clinker-plugin-lto
-	rm $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/libbaz.rlib
-
-unpacked-remapped: unpacked-remapped-split unpacked-remapped-single unpacked-remapped-scope unpacked-remapped-wrong-scope
-
-# - Debuginfo in `.dwo` files
-# - `.o` and binary refer to remapped `.dwo` paths which do not exist
-# - `.o` deleted
-# - `.dwo` present
-# - `.dwp` never created
-unpacked-remapped-split:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
-		-Z split-dwarf-kind=split --remap-path-prefix $(TMPDIR)=/a foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	rm $(TMPDIR)/*.dwo
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` and binary refer to remapped `.o` paths which do not exist
-# - `.o` present
-# - `.dwo` never created
-# - `.dwp` never created
-unpacked-remapped-single:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
-		-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
-	rm $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` and binary refer to remapped `.o` paths which do not exist
-# - `.o` present
-# - `.dwo` never created
-# - `.dwp` never created
-unpacked-remapped-scope:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
-		-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a \
-		-Z remap-path-scope=debuginfo foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (! grep $(TMPDIR)) || exit 1
-	rm $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,foo)
-
-# - Debuginfo in `.o` files
-# - `.o` and binary refer to remapped `.o` paths which do not exist
-# - `.o` present
-# - `.dwo` never created
-# - `.dwp` never created
-unpacked-remapped-wrong-scope:
-	$(RUSTC) $(UNSTABLEOPTS) -C split-debuginfo=unpacked -C debuginfo=2 \
-		-Z split-dwarf-kind=single --remap-path-prefix $(TMPDIR)=/a \
-		-Z remap-path-scope=macro foo.rs -g
-	objdump -Wi $(TMPDIR)/foo | grep DW_AT_GNU_dwo_name | (grep $(TMPDIR)) || exit 1
-	rm $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,foo)
-
-unpacked-crosscrate: unpacked-crosscrate-split unpacked-crosscrate-single
-
-# - Debuginfo in `.dwo` files
-# - (bar) `.rlib` file created, contains `.dwo`
-# - (bar) `.o` deleted
-# - (bar) `.dwo` present
-# - (bar) `.dwp` never created
-# - (main) `.o` deleted
-# - (main) `.dwo` present
-# - (main) `.dwp` never created
-unpacked-crosscrate-split:
-	$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=unpacked \
-		-Zsplit-dwarf-kind=split -C debuginfo=2 -g bar.rs
-	ls $(TMPDIR)/*.rlib
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwo
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
-		-C split-debuginfo=unpacked -Zsplit-dwarf-kind=split -C debuginfo=2 -g main.rs
-	ls $(TMPDIR)/*.o && exit 1 || exit 0
-	rm $(TMPDIR)/*.dwo
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,main)
-
-# - Debuginfo in `.o` files
-# - (bar) `.rlib` file created, contains `.o`
-# - (bar) `.o` present
-# - (bar) `.dwo` never created
-# - (bar) `.dwp` never created
-# - (main) `.o` present
-# - (main) `.dwo` never created
-# - (main) `.dwp` never created
-unpacked-crosscrate-single:
-	$(RUSTC) --crate-type lib $(UNSTABLEOPTS) -C split-debuginfo=unpacked \
-		-Zsplit-dwarf-kind=single -C debuginfo=2 -g bar.rs
-	ls $(TMPDIR)/*.rlib
-	ls $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	$(RUSTC) --extern bar=$(TMPDIR)/libbar.rlib $(UNSTABLEOPTS) \
-		-C split-debuginfo=unpacked -Zsplit-dwarf-kind=single -C debuginfo=2 -g main.rs
-	ls $(TMPDIR)/*.o
-	ls $(TMPDIR)/*.dwo && exit 1 || exit 0
-	ls $(TMPDIR)/*.dwp && exit 1 || exit 0
-	rm $(TMPDIR)/$(call BIN,main)
-endif
-endif
diff --git a/tests/run-make/split-debuginfo/rmake.rs b/tests/run-make/split-debuginfo/rmake.rs
new file mode 100644
index 00000000000..530a5d119f1
--- /dev/null
+++ b/tests/run-make/split-debuginfo/rmake.rs
@@ -0,0 +1,1618 @@
+// ignore-tidy-linelength
+//! Basic smoke tests for behavior of `-C split-debuginfo` and the combined behavior when used in
+//! conjunction with other flags such as:
+//!
+//! - `--remap-path-prefix`: see
+//!   <https://doc.rust-lang.org/rustc/command-line-arguments.html#--remap-path-prefix-remap-source-names-in-output>.
+//! - `-Z remap-path-scope`: see
+//!     - <https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/remap-path-scope.html>
+//!     - <https://github.com/rust-lang/rust/issues/111540>
+//!     - RFC #3127 trim-paths: <https://github.com/rust-lang/rfcs/pull/3127>
+//! - `-Z split-dwarf-kind`: see <https://github.com/rust-lang/rust/pull/89819>.
+//! - `-Clinker-plugin-lto`: see <https://doc.rust-lang.org/rustc/linker-plugin-lto.html>.
+//!
+//! # Test implementation remark
+//!
+//! - The pattern match on enum variants are intentional, because I find that they are very
+//!   revealing with respect to the kind of test coverage that we have and don't have.
+//!
+//! # Known limitations
+//!
+//! - The linux test coverage of cross-interactions between `-C split-debuginfo` and other flags are
+//!   significantly higher than the lack of such coverage for Windows and Darwin.
+//! - windows-gnu is not tested at all, see the `FIXME(#135531)`s below.
+//! - This test for the most part merely checks for existence/absence of certain artifacts, it does
+//!   not sanity check if the debuginfo artifacts are actually usable or contains the expected
+//!   amount/quality of debuginfo, especially on windows-msvc and darwin.
+//! - FIXME(#111540): this test has insufficient coverage in relation to trim-paths RFC, see also
+//!   the comment <https://github.com/rust-lang/rust/issues/111540#issuecomment-1994010274>. The
+//!   basic `llvm-dwarfdump` textual output inspection here is very fragile. The original `Makefile`
+//!   version used `objdump` (not to be confused with `llvm-objdump`) but inspected the wrong line
+//!   because it was looking at `DW_AT_GNU_dwo_name` when it should've been looking at
+//!   `DW_AT_comp_dir`.
+//! - This test does not have good coverage for what values of `-Csplit-debuginfo` are stable vs
+//!   non-stable for the various targets, i.e. which values *should* be gated behind
+//!   `-Zunstable-options` for a given target. The `Makefile` version yolo'd a `-Zunstable-options`
+//!   for non-windows + non-linux + non-darwin, but had a misplaced interpolation which suggested to
+//!   me that that conditional `-Zunstable-options` never actually materialized.
+//!
+//! # Additional references
+//!
+//! - Apple `.dSYM` debug symbol bundles: <https://lldb.llvm.org/use/symbols.html>.
+//! - LLVM `dsymutil`: <https://llvm.org/docs/CommandGuide/dsymutil.html>.
+
+// NOTE: this is a host test
+//@ ignore-cross-compile
+
+// NOTE: this seems to be a host test, and testing on host `riscv64-gc-unknown-linux-gnu` reveals
+// that this test is failing because of [MC: "error: A dwo section may not contain relocations" when
+// building with fission + RISCV64 #56642](https://github.com/llvm/llvm-project/issues/56642). This
+// test is ignored for now to unblock efforts to bring riscv64 targets to be exercised in CI, cf.
+// [Enable riscv64gc-gnu testing #126641](https://github.com/rust-lang/rust/pull/126641).
+//@ ignore-riscv64 (https://github.com/llvm/llvm-project/issues/56642)
+
+// FIXME(#135531): the `Makefile` version practically didn't test `-C split-debuginfo` on Windows
+// at all, and lumped windows-msvc and windows-gnu together at that.
+//@ ignore-windows-gnu
+
+#![deny(warnings)]
+
+use std::collections::BTreeSet;
+
+use run_make_support::rustc::Rustc;
+use run_make_support::{
+    cwd, has_extension, is_darwin, is_msvc, is_windows, llvm_dwarfdump, run_in_tmpdir, rustc,
+    shallow_find_directories, shallow_find_files, uname,
+};
+
+/// `-C debuginfo`. See <https://doc.rust-lang.org/rustc/codegen-options/index.html#debuginfo>.
+#[derive(Debug, PartialEq, Copy, Clone)]
+enum DebuginfoLevel {
+    /// `-C debuginfo=0` or `-C debuginfo=none` aka no debuginfo at all, default.
+    None,
+    /// `-C debuginfo=2` aka full debuginfo, aliased via `-g`.
+    Full,
+    /// The cli flag is not explicitly provided; default.
+    Unspecified,
+}
+
+impl DebuginfoLevel {
+    fn cli_value(&self) -> &'static str {
+        // `-Cdebuginfo=...`
+        match self {
+            DebuginfoLevel::None => "none",
+            DebuginfoLevel::Full => "2",
+            DebuginfoLevel::Unspecified => unreachable!(),
+        }
+    }
+}
+
+/// `-C split-debuginfo`. See
+/// <https://doc.rust-lang.org/rustc/codegen-options/index.html#split-debuginfo>.
+///
+/// Note that all three options are supported on Linux and Apple platforms, packed is supported on
+/// Windows-MSVC, and all other platforms support off. Attempting to use an unsupported option
+/// requires using the nightly channel with the `-Z unstable-options` flag.
+#[derive(Debug, PartialEq, Copy, Clone)]
+enum SplitDebuginfo {
+    /// `-C split-debuginfo=off`. Default for platforms with ELF binaries and windows-gnu (not
+    /// Windows MSVC and not macOS). Typically DWARF debug information can be found in the final
+    /// artifact in sections of the executable.
+    ///
+    /// - Not supported on Windows MSVC.
+    /// - On macOS this options prevents the final execution of `dsymutil` to generate debuginfo.
+    Off,
+    /// `-C split-debuginfo=unpacked`. Debug information will be found in separate files for each
+    /// compilation unit (object file).
+    ///
+    /// - Not supported on Windows MSVC.
+    /// - On macOS this means the original object files will contain debug information.
+    /// - On other Unix platforms this means that `*.dwo` files will contain debug information.
+    Unpacked,
+    /// `-C split-debuginfo=packed`. Default for Windows MSVC and macOS. "Packed" here means that
+    /// all the debug information is packed into a separate file from the main executable.
+    ///
+    /// - On Windows MSVC this is a `*.pdb` file.
+    /// - On macOS this is a `*.dSYM` folder.
+    /// - On other platforms this is a `*.dwp` file.
+    Packed,
+    /// The cli flag is not explicitly provided; uses platform default.
+    Unspecified,
+}
+
+impl SplitDebuginfo {
+    fn cli_value(&self) -> &'static str {
+        // `-Csplit-debuginfo=...`
+        match self {
+            SplitDebuginfo::Off => "off",
+            SplitDebuginfo::Unpacked => "unpacked",
+            SplitDebuginfo::Packed => "packed",
+            SplitDebuginfo::Unspecified => unreachable!(),
+        }
+    }
+}
+
+/// `-Z split-dwarf-kind`
+#[derive(Debug, PartialEq, Copy, Clone)]
+enum SplitDwarfKind {
+    /// `-Zsplit-dwarf-kind=split`
+    Split,
+    /// `-Zsplit-dwarf-kind=single`
+    Single,
+    Unspecified,
+}
+
+impl SplitDwarfKind {
+    fn cli_value(&self) -> &'static str {
+        // `-Zsplit-dwarf-kind=...`
+        match self {
+            SplitDwarfKind::Split => "split",
+            SplitDwarfKind::Single => "single",
+            SplitDwarfKind::Unspecified => unreachable!(),
+        }
+    }
+}
+
+/// `-C linker-plugin-lto`
+#[derive(Debug, PartialEq, Copy, Clone)]
+enum LinkerPluginLto {
+    /// Pass `-C linker-plugin-lto`.
+    Yes,
+    /// Don't pass `-C linker-plugin-lto`.
+    Unspecified,
+}
+
+/// `--remap-path-prefix` or not.
+#[derive(Debug, Clone)]
+enum RemapPathPrefix {
+    /// `--remap-path-prefix=$prefix=$remapped_prefix`.
+    Yes { remapped_prefix: &'static str },
+    /// Don't pass `--remap-path-prefix`.
+    Unspecified,
+}
+
+/// `-Zremap-path-scope`. See
+/// <https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/remap-path-scope.html#remap-path-scope>.
+#[derive(Debug, Clone)]
+enum RemapPathScope {
+    /// Comma-separated list of remap scopes: `macro`, `diagnostics`, `debuginfo`, `object`, `all`.
+    Yes(&'static str),
+    Unspecified,
+}
+
+/// Whether to pass `-Zunstable-options`.
+#[derive(Debug, PartialEq, Copy, Clone)]
+enum UnstableOptions {
+    Yes,
+    Unspecified,
+}
+
+#[track_caller]
+fn cwd_filenames() -> BTreeSet<String> {
+    let files = shallow_find_files(cwd(), |path| {
+        // Fiilter out source files
+        !has_extension(path, "rs")
+    });
+    files.iter().map(|p| p.file_name().unwrap().to_os_string().into_string().unwrap()).collect()
+}
+
+#[track_caller]
+fn cwd_dwo_filenames() -> BTreeSet<String> {
+    let files = shallow_find_files(cwd(), |path| has_extension(path, "dwo"));
+    files.iter().map(|p| p.file_name().unwrap().to_os_string().into_string().unwrap()).collect()
+}
+
+#[track_caller]
+fn cwd_object_filenames() -> BTreeSet<String> {
+    let files = shallow_find_files(cwd(), |path| has_extension(path, "o"));
+    files.iter().map(|p| p.file_name().unwrap().to_os_string().into_string().unwrap()).collect()
+}
+
+#[must_use]
+struct FileAssertions<'expected> {
+    expected_files: BTreeSet<&'expected str>,
+}
+
+impl<'expected> FileAssertions<'expected> {
+    #[track_caller]
+    fn assert_on(self, found_files: &BTreeSet<String>) {
+        let found_files: BTreeSet<_> = found_files.iter().map(|f| f.as_str()).collect();
+        assert!(
+            found_files.is_superset(&self.expected_files),
+            "expected {:?} to exist, but only found {:?}",
+            self.expected_files,
+            found_files
+        );
+
+        let unexpected_files: BTreeSet<_> =
+            found_files.difference(&self.expected_files).copied().collect();
+        assert!(unexpected_files.is_empty(), "found unexpected files: {:?}", unexpected_files);
+    }
+}
+
+/// Windows MSVC only supports packed debuginfo.
+mod windows_msvc_tests {
+    use super::*;
+
+    pub(crate) fn split_debuginfo(split_kind: SplitDebuginfo, level: DebuginfoLevel) {
+        // NOTE: `-C debuginfo` and other flags are not exercised here on Windows MSVC.
+        run_in_tmpdir(|| {
+            println!("checking: split_kind={:?} + level={:?}", split_kind, level);
+            match (split_kind, level) {
+                (SplitDebuginfo::Off, _) => {
+                    rustc()
+                        .input("foo.rs")
+                        .split_debuginfo(split_kind.cli_value())
+                        .run_fail()
+                        .assert_stderr_contains(
+                            "error: `-Csplit-debuginfo=off` is unstable on this platform",
+                        );
+                }
+                (SplitDebuginfo::Unpacked, _) => {
+                    rustc()
+                        .input("foo.rs")
+                        .split_debuginfo(split_kind.cli_value())
+                        .run_fail()
+                        .assert_stderr_contains(
+                            "error: `-Csplit-debuginfo=unpacked` is unstable on this platform",
+                        );
+                }
+                (SplitDebuginfo::Packed, _) => {
+                    rustc().input("foo.rs").split_debuginfo(split_kind.cli_value()).run();
+
+                    let found_files = cwd_filenames();
+                    FileAssertions { expected_files: BTreeSet::from(["foo.exe", "foo.pdb"]) }
+                        .assert_on(&found_files);
+                }
+                (split_kind, level) => {
+                    panic!(
+                        "split_kind={:?} + level={:?} is not handled on Windows MSVC",
+                        split_kind, level
+                    )
+                }
+            }
+        });
+    }
+}
+
+mod darwin_tests {
+    use super::*;
+
+    pub(crate) fn split_debuginfo(split_kind: SplitDebuginfo, level: DebuginfoLevel) {
+        run_in_tmpdir(|| {
+            println!("checking: split_kind={:?} + level={:?}", split_kind, level);
+
+            let dsym_directories =
+                || shallow_find_directories(cwd(), |path| has_extension(path, "dSYM"));
+
+            match (split_kind, level) {
+                (_, DebuginfoLevel::Unspecified) => {
+                    rustc().input("foo.rs").run();
+                    let directories =
+                        shallow_find_directories(cwd(), |path| has_extension(path, "dSYM"));
+                    assert!(
+                        directories.is_empty(),
+                        "expected no `*.dSYM` folder to be generated when `-Cdebuginfo` is not specified"
+                    );
+                }
+                (_, DebuginfoLevel::None) => {
+                    rustc().input("foo.rs").debuginfo(level.cli_value()).run();
+                    let directories = dsym_directories();
+                    assert!(
+                        directories.is_empty(),
+                        "expected no `*.dSYM` folder to be generated when `-Cdebuginfo=none`"
+                    );
+                }
+                (SplitDebuginfo::Off, _) => {
+                    rustc()
+                        .input("foo.rs")
+                        .split_debuginfo(split_kind.cli_value())
+                        .debuginfo(level.cli_value())
+                        .run();
+                    let directories = dsym_directories();
+                    assert!(
+                        directories.is_empty(),
+                        "expected no `*.dSYM` folder to be generated since we expect `-Csplit-debuginfo=off` to inhibit final debuginfo generation on macOS"
+                    );
+                }
+                (SplitDebuginfo::Unpacked, _) => {
+                    rustc().input("foo.rs").split_debuginfo(split_kind.cli_value()).run();
+                    let directories = dsym_directories();
+                    assert!(
+                        directories.is_empty(),
+                        "expected no `*.dSYM` folder to be generated since we expect on macOS the object files to contain debuginfo instead"
+                    );
+                }
+                (SplitDebuginfo::Packed, DebuginfoLevel::Full) => {
+                    rustc()
+                        .input("foo.rs")
+                        .split_debuginfo(split_kind.cli_value())
+                        .debuginfo(level.cli_value())
+                        .run();
+                    let directories = shallow_find_directories(cwd(), |path| {
+                        path.file_name().unwrap() == "foo.dSYM"
+                    });
+                    assert_eq!(directories.len(), 1, "failed to find `foo.dSYM`");
+                }
+                (SplitDebuginfo::Unspecified, DebuginfoLevel::Full) => {
+                    rustc().input("foo.rs").debuginfo(level.cli_value()).run();
+                    let directories = shallow_find_directories(cwd(), |path| {
+                        path.file_name().unwrap() == "foo.dSYM"
+                    });
+                    assert_eq!(directories.len(), 1, "failed to find `foo.dSYM`");
+                }
+            }
+        });
+    }
+}
+
+mod shared_linux_other_tests {
+    use std::path::PathBuf;
+
+    use super::*;
+
+    fn rustc(unstable_options: UnstableOptions) -> Rustc {
+        if unstable_options == UnstableOptions::Yes {
+            let mut rustc = run_make_support::rustc();
+            rustc.arg("-Zunstable-options");
+            rustc
+        } else {
+            run_make_support::rustc()
+        }
+    }
+
+    #[derive(PartialEq)]
+    pub(crate) enum CrossCrateTest {
+        Yes,
+        No,
+    }
+
+    pub(crate) fn split_debuginfo(
+        cross_crate_test: CrossCrateTest,
+        unstable_options: UnstableOptions,
+        split_kind: SplitDebuginfo,
+        level: DebuginfoLevel,
+        split_dwarf_kind: SplitDwarfKind,
+        lto: LinkerPluginLto,
+        remap_path_prefix: RemapPathPrefix,
+        remap_path_scope: RemapPathScope,
+    ) {
+        run_in_tmpdir(|| {
+            println!(
+                "checking: unstable_options={:?} + split_kind={:?} + level={:?} + split_dwarf_kind={:?} + lto={:?} + remap_path_prefix={:?} + remap_path_scope={:?}",
+                unstable_options,
+                split_kind,
+                level,
+                split_dwarf_kind,
+                lto,
+                remap_path_prefix,
+                remap_path_scope
+            );
+
+            match cross_crate_test {
+                CrossCrateTest::Yes => cross_crate_split_debuginfo(
+                    unstable_options,
+                    split_kind,
+                    level,
+                    split_dwarf_kind,
+                    lto,
+                    remap_path_prefix,
+                    remap_path_scope,
+                ),
+                CrossCrateTest::No => simple_split_debuginfo(
+                    unstable_options,
+                    split_kind,
+                    level,
+                    split_dwarf_kind,
+                    lto,
+                    remap_path_prefix,
+                    remap_path_scope,
+                ),
+            }
+        });
+    }
+
+    fn cross_crate_split_debuginfo(
+        unstable_options: UnstableOptions,
+        split_kind: SplitDebuginfo,
+        level: DebuginfoLevel,
+        split_dwarf_kind: SplitDwarfKind,
+        lto: LinkerPluginLto,
+        remap_path_prefix: RemapPathPrefix,
+        remap_path_scope: RemapPathScope,
+    ) {
+        match (split_kind, level, split_dwarf_kind, lto, remap_path_prefix, remap_path_scope) {
+            // packed-crosscrate-split
+            // - Debuginfo in `.dwo` files
+            // - (bar) `.rlib` file created, contains `.dwo`
+            // - (bar) `.o` deleted
+            // - (bar) `.dwo` deleted
+            // - (bar) `.dwp` never created
+            // - (main) `.o` deleted
+            // - (main) `.dwo` deleted
+            // - (main) `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("bar.rs")
+                    .crate_type("lib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["libbar.rlib"]) }
+                    .assert_on(&found_files);
+
+                rustc(unstable_options)
+                    .extern_("bar", "libbar.rlib")
+                    .input("main.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let found_files = cwd_filenames();
+                FileAssertions {
+                    expected_files: BTreeSet::from(["libbar.rlib", "main", "main.dwp"]),
+                }
+                .assert_on(&found_files);
+            }
+
+            // packed-crosscrate-single
+            // - Debuginfo in `.o` files
+            // - (bar) `.rlib` file created, contains `.o`
+            // - (bar) `.o` deleted
+            // - (bar) `.dwo` never created
+            // - (bar) `.dwp` never created
+            // - (main) `.o` deleted
+            // - (main) `.dwo` never created
+            // - (main) `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("bar.rs")
+                    .crate_type("lib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["libbar.rlib"]) }
+                    .assert_on(&found_files);
+
+                rustc(unstable_options)
+                    .extern_("bar", "libbar.rlib")
+                    .input("main.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let found_files = cwd_filenames();
+                FileAssertions {
+                    expected_files: BTreeSet::from(["libbar.rlib", "main", "main.dwp"]),
+                }
+                .assert_on(&found_files);
+            }
+
+            // unpacked-crosscrate-split
+            // - Debuginfo in `.dwo` files
+            // - (bar) `.rlib` file created, contains `.dwo`
+            // - (bar) `.o` deleted
+            // - (bar) `.dwo` present
+            // - (bar) `.dwp` never created
+            // - (main) `.o` deleted
+            // - (main) `.dwo` present
+            // - (main) `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("bar.rs")
+                    .crate_type("lib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let bar_found_files = cwd_filenames();
+
+                let bar_dwo_files = cwd_dwo_filenames();
+                assert_eq!(bar_dwo_files.len(), 1);
+
+                let mut bar_expected_files = BTreeSet::new();
+                bar_expected_files.extend(bar_dwo_files);
+                bar_expected_files.insert("libbar.rlib".to_string());
+
+                FileAssertions {
+                    expected_files: bar_expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&bar_found_files);
+
+                rustc(unstable_options)
+                    .extern_("bar", "libbar.rlib")
+                    .input("main.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let overall_found_files = cwd_filenames();
+
+                let overall_dwo_files = cwd_dwo_filenames();
+                assert_eq!(overall_dwo_files.len(), 2);
+
+                let mut overall_expected_files = BTreeSet::new();
+                overall_expected_files.extend(overall_dwo_files);
+                overall_expected_files.insert("main".to_string());
+                overall_expected_files.insert("libbar.rlib".to_string());
+
+                FileAssertions {
+                    expected_files: overall_expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&overall_found_files);
+            }
+
+            // unpacked-crosscrate-single
+            // - Debuginfo in `.o` files
+            // - (bar) `.rlib` file created, contains `.o`
+            // - (bar) `.o` present
+            // - (bar) `.dwo` never created
+            // - (bar) `.dwp` never created
+            // - (main) `.o` present
+            // - (main) `.dwo` never created
+            // - (main) `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("bar.rs")
+                    .crate_type("lib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let bar_found_files = cwd_filenames();
+
+                let bar_object_files = cwd_object_filenames();
+                assert_eq!(bar_object_files.len(), 1);
+
+                let mut bar_expected_files = BTreeSet::new();
+                bar_expected_files.extend(bar_object_files);
+                bar_expected_files.insert("libbar.rlib".to_string());
+
+                FileAssertions {
+                    expected_files: bar_expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&bar_found_files);
+
+                rustc(unstable_options)
+                    .extern_("bar", "libbar.rlib")
+                    .input("main.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+
+                let overall_found_files = cwd_filenames();
+
+                let overall_object_files = cwd_object_filenames();
+                assert_eq!(overall_object_files.len(), 2);
+
+                let mut overall_expected_files = BTreeSet::new();
+                overall_expected_files.extend(overall_object_files);
+                overall_expected_files.insert("main".to_string());
+                overall_expected_files.insert("libbar.rlib".to_string());
+
+                FileAssertions {
+                    expected_files: overall_expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&overall_found_files);
+            }
+
+            _ => {}
+        }
+    }
+
+    fn simple_split_debuginfo(
+        unstable_options: UnstableOptions,
+        split_kind: SplitDebuginfo,
+        level: DebuginfoLevel,
+        split_dwarf_kind: SplitDwarfKind,
+        lto: LinkerPluginLto,
+        remap_path_prefix: RemapPathPrefix,
+        remap_path_scope: RemapPathScope,
+    ) {
+        match (split_kind, level, split_dwarf_kind, lto, remap_path_prefix, remap_path_scope) {
+            // off (unspecified):
+            // - Debuginfo in `.o` files
+            // - `.o` deleted
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unspecified,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Unspecified,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options).input("foo.rs").debuginfo(level.cli_value()).run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo"]) }.assert_on(&found_files);
+            }
+
+            // off:
+            // - Debuginfo in `.o` files
+            // - `.o` deleted
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Off,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Unspecified,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo"]) }.assert_on(&found_files);
+            }
+
+            // packed-split:
+            // - Debuginfo in `.dwo` files
+            // - `.o` deleted
+            // - `.dwo` deleted
+            // - `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo", "foo.dwp"]) }
+                    .assert_on(&found_files);
+            }
+
+            // packed-single:
+            // - Debuginfo in `.o` files
+            // - `.o` deleted
+            // - `.dwo` never created
+            // - `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo", "foo.dwp"]) }
+                    .assert_on(&found_files);
+            }
+
+            // packed-lto-split::
+            // - `rmeta` file added to `rlib`, no object files are generated and thus no
+            //   debuginfo is generated.
+            // - `.o` never created
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Yes,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("baz.rs")
+                    .crate_type("rlib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .arg("-Clinker-plugin-lto")
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["libbaz.rlib"]) }
+                    .assert_on(&found_files);
+            }
+
+            // packed-lto-single:
+            // - `rmeta` file added to `rlib`, no object files are generated and thus no
+            //   debuginfo is generated
+            // - `.o` never created
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Yes,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("baz.rs")
+                    .crate_type("rlib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .arg("-Clinker-plugin-lto")
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["libbaz.rlib"]) }
+                    .assert_on(&found_files);
+            }
+
+            // packed-remapped-split:
+            // - Debuginfo in `.dwo` files
+            // - `.o` and binary refer to remapped `.dwo` paths which do not exist
+            // - `.o` deleted
+            // - `.dwo` deleted
+            // - `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo", "foo.dwp"]) }
+                    .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::Remapped);
+            }
+
+            // packed-remapped-single:
+            // - `.o` and binary refer to remapped `.o` paths which do not exist
+            // - `.o` deleted
+            // - `.dwo` never created
+            // - `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo", "foo.dwp"]) }
+                    .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::Remapped);
+            }
+
+            // packed-remapped-scope:
+            // - Debuginfo in `.o` files
+            // - `.o` and binary refer to remapped `.o` paths which do not exist
+            // - `.o` deleted
+            // - `.dwo` never created
+            // - `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Yes(scope @ "debuginfo"),
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .arg(format!("-Zremap-path-scope={scope}"))
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo", "foo.dwp"]) }
+                    .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::Remapped);
+            }
+
+            // packed-remapped-wrong-scope:
+            // - `.o` and binary refer to un-remapped `.o` paths because remap path scope is
+            //   macro.
+            // - `.o` deleted
+            // - `.dwo` never created
+            // - `.dwp` present
+            (
+                SplitDebuginfo::Packed,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Yes(scope @ "macro"),
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .arg(format!("-Zremap-path-scope={scope}"))
+                    .run();
+                let found_files = cwd_filenames();
+                FileAssertions { expected_files: BTreeSet::from(["foo", "foo.dwp"]) }
+                    .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::NoRemap);
+            }
+
+            // unpacked-split
+            // - Debuginfo in `.dwo` files
+            // - `.o` deleted
+            // - `.dwo` present
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+                let found_files = cwd_filenames();
+
+                let dwo_files = cwd_dwo_filenames();
+                assert_eq!(dwo_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(dwo_files);
+                expected_files.insert("foo".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_str).collect(),
+                }
+                .assert_on(&found_files);
+            }
+
+            // unpacked-single
+            // - Debuginfo in `.o` files
+            // - `.o` present
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .run();
+                let found_files = cwd_filenames();
+
+                let object_files = cwd_object_filenames();
+                assert_eq!(object_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(object_files);
+                expected_files.insert("foo".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_str).collect(),
+                }
+                .assert_on(&found_files);
+            }
+
+            // unpacked-lto-split
+            // - `rmeta` file added to `rlib`, no object files are generated and thus no debuginfo
+            //   is generated
+            // - `.o` not present
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Yes,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("baz.rs")
+                    .crate_type("rlib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .arg("-Clinker-plugin-lto")
+                    .run();
+
+                let found_files = cwd_filenames();
+
+                FileAssertions { expected_files: BTreeSet::from(["libbaz.rlib"]) }
+                    .assert_on(&found_files);
+            }
+
+            // unpacked-lto-single
+            // - rmeta file added to rlib, no object files are generated and thus no debuginfo is generated
+            // - `.o` present (bitcode)
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Yes,
+                RemapPathPrefix::Unspecified,
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("baz.rs")
+                    .crate_type("rlib")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .arg("-Clinker-plugin-lto")
+                    .run();
+
+                let found_files = cwd_filenames();
+
+                let object_files = cwd_object_filenames();
+                assert_eq!(object_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(object_files);
+                expected_files.insert("libbaz.rlib".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&found_files);
+            }
+
+            // unpacked-remapped-split
+            // - Debuginfo in `.dwo` files
+            // - `.o` and binary refer to remapped `.dwo` paths which do not exist
+            // - `.o` deleted
+            // - `.dwo` present
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Split,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .run();
+
+                let found_files = cwd_filenames();
+
+                let dwo_files = cwd_dwo_filenames();
+                assert_eq!(dwo_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(dwo_files);
+                expected_files.insert("foo".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::Remapped);
+            }
+
+            // unpacked-remapped-single
+            // - Debuginfo in `.o` files
+            // - `.o` and binary refer to remapped `.o` paths which do not exist
+            // - `.o` present
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Unspecified,
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .run();
+
+                let found_files = cwd_filenames();
+
+                let object_files = cwd_object_filenames();
+                assert_eq!(object_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(object_files);
+                expected_files.insert("foo".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::Remapped);
+            }
+
+            // unpacked-remapped-scope
+            // - Debuginfo in `.o` files
+            // - `.o` and binary refer to remapped `.o` paths which do not exist
+            // - `.o` present
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Yes(scope @ "debuginfo"),
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .arg(format!("-Zremap-path-scope={scope}"))
+                    .run();
+
+                let found_files = cwd_filenames();
+
+                let object_files = cwd_object_filenames();
+                assert_eq!(object_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(object_files);
+                expected_files.insert("foo".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::Remapped);
+            }
+
+            // unpacked-remapped-wrong-scope
+            // - Debuginfo in `.o` files
+            // - `.o` and binary refer to un-remapped `.o` paths because remap path scope is macro
+            // - `.o` present
+            // - `.dwo` never created
+            // - `.dwp` never created
+            (
+                SplitDebuginfo::Unpacked,
+                DebuginfoLevel::Full,
+                SplitDwarfKind::Single,
+                LinkerPluginLto::Unspecified,
+                RemapPathPrefix::Yes { remapped_prefix },
+                RemapPathScope::Yes(scope @ "macro"),
+            ) => {
+                rustc(unstable_options)
+                    .input("foo.rs")
+                    .split_debuginfo(split_kind.cli_value())
+                    .debuginfo(level.cli_value())
+                    .arg(format!("-Zsplit-dwarf-kind={}", split_dwarf_kind.cli_value()))
+                    .remap_path_prefix(cwd(), remapped_prefix)
+                    .arg(format!("-Zremap-path-scope={scope}"))
+                    .run();
+
+                let found_files = cwd_filenames();
+
+                let object_files = cwd_object_filenames();
+                assert_eq!(object_files.len(), 1);
+
+                let mut expected_files = BTreeSet::new();
+                expected_files.extend(object_files);
+                expected_files.insert("foo".to_string());
+
+                FileAssertions {
+                    expected_files: expected_files.iter().map(String::as_ref).collect(),
+                }
+                .assert_on(&found_files);
+
+                check_path_remap(cwd(), RemapExpectation::NoRemap);
+            }
+
+            (split_kind, level, split_dwarf_kind, lto, remap_path_prefix, remap_path_scope) => {
+                panic!(
+                    "split_kind={:?} + level={:?} + split_dwarf_kind={:?} + lto={:?} + remap_path_prefix={:?} + remap_path_scope={:?} is not handled on linux/other",
+                    split_kind, level, split_dwarf_kind, lto, remap_path_prefix, remap_path_scope
+                )
+            }
+        }
+    }
+
+    #[derive(PartialEq)]
+    enum RemapExpectation {
+        Remapped,
+        NoRemap,
+    }
+
+    #[track_caller]
+    fn check_path_remap(cwd_path: PathBuf, remap_expectation: RemapExpectation) {
+        let cwd_path = cwd_path.to_str().unwrap();
+        let output = llvm_dwarfdump().input("foo").arg("--debug-info").run().stdout_utf8();
+        let output_lines: Vec<_> = output.lines().collect();
+
+        // Look for `DW_AT_comp_dir` and `DW_AT_GNU_dwo_name` via `llvm-dwarfdump`. Note: space
+        // between uses tabs.
+        //
+        // ```text
+        // 0x0000000b: DW_TAG_compile_unit
+        //     DW_AT_stmt_list   (0x00000000)
+        //     DW_AT_comp_dir    ("/__MY_REMAPPED_PATH") # this could be e.g. /home/repos/rust/ if not remapped
+        //     DW_AT_GNU_dwo_name        ("foo.foo.fc848df41df7a00d-cgu.0.rcgu.dwo")
+        // ```
+        //
+        // FIXME: this is very fragile because the output format can be load-bearing, but doing this
+        // via `object` + `gimli` is rather difficult.
+        let mut window = output_lines.windows(2);
+        while let Some([first_ln, second_ln]) = window.next() {
+            let first_ln = first_ln.trim();
+            let second_ln = second_ln.trim();
+
+            if !second_ln.starts_with("DW_AT_GNU_dwo_name") {
+                continue;
+            }
+
+            let Some((comp_dir_attr_name, comp_dir_attr_val)) = first_ln.split_once("\t") else {
+                continue;
+            };
+
+            println!("comp_dir_attr_name: `{}`", comp_dir_attr_name);
+            println!("cwd_path_string: `{}`", cwd_path);
+
+            if comp_dir_attr_name != "DW_AT_comp_dir" {
+                continue;
+            }
+
+            println!("comp_dir_attr_val: `{}`", comp_dir_attr_val);
+
+            // Possibly `("/__MY_REMAPPED_PATH")` or `($cwd_path_string)`.
+            //
+            // FIXME: this check is insufficiently precise, it should probably also match on suffix
+            // (`.o` vs `.dwo` reference). But also, string matching is just very fragile.
+            let comp_dir_attr_val = comp_dir_attr_val.trim();
+
+            match remap_expectation {
+                RemapExpectation::Remapped => {
+                    assert!(
+                        !comp_dir_attr_val.contains(&cwd_path),
+                        "unexpected non-remapped path found in `DW_AT_comp_dir`: {}",
+                        comp_dir_attr_val
+                    );
+                }
+                RemapExpectation::NoRemap => {
+                    assert!(
+                        comp_dir_attr_val.contains(&cwd_path),
+                        "failed to find un-remapped path in `DW_AT_comp_dir`: {}",
+                        comp_dir_attr_val
+                    );
+                }
+            }
+        }
+    }
+}
+
+fn main() {
+    // ENHANCEMENT: we are only checking that split-debuginfo is splitting is some way, shape or
+    // form, we do not sanity check the actual debuginfo artifacts on non-Linux! It may be possible
+    // to also sanity check the debuginfo artifacts, but I did not want to do that during the port
+    // to rmake.rs initially.
+
+    // ENHANCEMENT: the Linux checks have significantly more coverage for interaction between `-C
+    // split-debuginfo` and other flags compared to windows-msvc or windows-gnu or darwin or some
+    // other non-linux targets. It would be cool if their test coverage could be improved.
+
+    // NOTE: these combinations are not exhaustive, because while porting to rmake.rs initially I
+    // tried to preserve the existing test behavior closely. Notably, no attempt was made to
+    // exhaustively cover all cases in the 6-fold Cartesian product of `{,-Csplit=debuginfo=...}` x
+    // `{,-Cdebuginfo=...}` x `{,--remap-path-prefix}` x `{,-Zremap-path-scope=...}` x
+    // `{,-Zsplit-dwarf-kind=...}` x `{,-Clinker-plugin-lto}`. If you really want to, you can
+    // identify which combination isn't exercised with a 6-layers nested for loop iterating through
+    // each of the cli flag enum variants.
+
+    if is_msvc() {
+        // FIXME: the windows-msvc test coverage is sparse at best.
+
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Off, DebuginfoLevel::Unspecified);
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Unpacked, DebuginfoLevel::Unspecified);
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Packed, DebuginfoLevel::Unspecified);
+
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Off, DebuginfoLevel::None);
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Unpacked, DebuginfoLevel::None);
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Packed, DebuginfoLevel::None);
+
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Off, DebuginfoLevel::Full);
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Unpacked, DebuginfoLevel::Full);
+        windows_msvc_tests::split_debuginfo(SplitDebuginfo::Packed, DebuginfoLevel::Full);
+    } else if is_windows() {
+        // FIXME(#135531): the `Makefile` version didn't test windows at all. I don't know about the
+        // intended behavior on windows-gnu to expand test coverage while porting this to rmake.rs,
+        // but the test coverage here really should be expanded since some windows-gnu targets are
+        // Tier 1.
+    } else if is_darwin() {
+        // FIXME: the darwin test coverage is sparse at best.
+
+        // Expect no `.dSYM` generation if debuginfo is not requested (special case).
+        darwin_tests::split_debuginfo(SplitDebuginfo::Unspecified, DebuginfoLevel::Unspecified);
+
+        darwin_tests::split_debuginfo(SplitDebuginfo::Off, DebuginfoLevel::Unspecified);
+        darwin_tests::split_debuginfo(SplitDebuginfo::Unpacked, DebuginfoLevel::Unspecified);
+        darwin_tests::split_debuginfo(SplitDebuginfo::Packed, DebuginfoLevel::Unspecified);
+
+        darwin_tests::split_debuginfo(SplitDebuginfo::Off, DebuginfoLevel::None);
+        darwin_tests::split_debuginfo(SplitDebuginfo::Unpacked, DebuginfoLevel::None);
+        darwin_tests::split_debuginfo(SplitDebuginfo::Packed, DebuginfoLevel::None);
+
+        darwin_tests::split_debuginfo(SplitDebuginfo::Off, DebuginfoLevel::Full);
+        darwin_tests::split_debuginfo(SplitDebuginfo::Unpacked, DebuginfoLevel::Full);
+        darwin_tests::split_debuginfo(SplitDebuginfo::Packed, DebuginfoLevel::Full);
+    } else {
+        // Unix as well as the non-linux + non-windows + non-darwin targets.
+
+        // FIXME: this `uname` check is very funny, it really should be refined (e.g. llvm bug
+        // <https://github.com/llvm/llvm-project/issues/56642> for riscv64 targets).
+
+        // NOTE: some options are not stable on non-linux + non-windows + non-darwin targets...
+        let unstable_options =
+            if uname() == "Linux" { UnstableOptions::Unspecified } else { UnstableOptions::Yes };
+
+        // FIXME: we should add a test with scope `split-debuginfo,split-debuginfo-path` that greps
+        // the entire `.dwp` file for remapped paths (i.e. without going through objdump or
+        // readelf). See <https://github.com/rust-lang/rust/pull/118518#discussion_r1452180392>.
+
+        use shared_linux_other_tests::CrossCrateTest;
+
+        // unspecified `-Csplit-debuginfo`
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unspecified,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Unspecified,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // off
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Off,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Unspecified,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-lto-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Yes,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-lto-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Yes,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // FIXME: the remapping tests probably need to be reworked, see
+        // <https://github.com/rust-lang/rust/pull/118518#discussion_r1452174338>.
+
+        // packed-remapped-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-remapped-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-remapped-scope
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Yes("debuginfo"),
+        );
+
+        // packed-remapped-wrong-scope
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Yes("macro"),
+        );
+
+        // packed-crosscrate-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::Yes,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // packed-crosscrate-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::Yes,
+            unstable_options,
+            SplitDebuginfo::Packed,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-lto-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Yes,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-lto-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Yes,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-remapped-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-remapped-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-remapped-scope
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Yes("debuginfo"),
+        );
+
+        // unpacked-remapped-wrong-scope
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::No,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Yes { remapped_prefix: "/__MY_REMAPPED_PATH__" },
+            RemapPathScope::Yes("macro"),
+        );
+
+        // unpacked-crosscrate-split
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::Yes,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Split,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+
+        // unpacked-crosscrate-single
+        shared_linux_other_tests::split_debuginfo(
+            CrossCrateTest::Yes,
+            unstable_options,
+            SplitDebuginfo::Unpacked,
+            DebuginfoLevel::Full,
+            SplitDwarfKind::Single,
+            LinkerPluginLto::Unspecified,
+            RemapPathPrefix::Unspecified,
+            RemapPathScope::Unspecified,
+        );
+    }
+}
diff --git a/tests/rustdoc-json/primitives/primitive_impls.rs b/tests/rustdoc-json/primitives/primitive_impls.rs
index 77d1d68f8e4..58c222ce4f0 100644
--- a/tests/rustdoc-json/primitives/primitive_impls.rs
+++ b/tests/rustdoc-json/primitives/primitive_impls.rs
@@ -1,4 +1,4 @@
-#![feature(no_core)]
+#![feature(no_core, lang_items)]
 #![feature(rustc_attrs)]
 #![feature(rustdoc_internals)]
 #![no_core]
@@ -6,6 +6,9 @@
 
 //@ set impl_i32 = "$.index[*][?(@.docs=='Only core can do this')].id"
 
+#[lang = "sized"]
+trait Sized {}
+
 /// Only core can do this
 impl i32 {
     //@ set identity = "$.index[*][?(@.docs=='Do Nothing')].id"
diff --git a/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.rs b/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.rs
index 6b1aa455d98..18ac37280c0 100644
--- a/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.rs
+++ b/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.rs
@@ -2,9 +2,12 @@
 // feature.
 
 #![deny(warnings)]
-#![feature(no_core)]
+#![feature(no_core, lang_items)]
 #![no_core]
 
+#[lang = "sized"]
+trait Sized {}
+
 /// ```{class="}
 /// main;
 /// ```
diff --git a/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.stderr b/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.stderr
index 385b2ccacc1..cc13cc0fe53 100644
--- a/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.stderr
+++ b/tests/rustdoc-ui/custom_code_classes_in_docs-warning3.stderr
@@ -1,5 +1,5 @@
 error: unclosed quote string `"`
-  --> $DIR/custom_code_classes_in_docs-warning3.rs:8:1
+  --> $DIR/custom_code_classes_in_docs-warning3.rs:11:1
    |
 LL | / /// ```{class="}
 LL | | /// main;
@@ -17,7 +17,7 @@ LL | #![deny(warnings)]
    = note: `#[deny(rustdoc::invalid_codeblock_attributes)]` implied by `#[deny(warnings)]`
 
 error: unclosed quote string `"`
-  --> $DIR/custom_code_classes_in_docs-warning3.rs:8:1
+  --> $DIR/custom_code_classes_in_docs-warning3.rs:11:1
    |
 LL | / /// ```{class="}
 LL | | /// main;
diff --git a/tests/rustdoc/cfg_doc_reexport.rs b/tests/rustdoc/cfg_doc_reexport.rs
index f8101e2a958..44ec3663284 100644
--- a/tests/rustdoc/cfg_doc_reexport.rs
+++ b/tests/rustdoc/cfg_doc_reexport.rs
@@ -1,9 +1,12 @@
 #![feature(doc_cfg)]
-#![feature(no_core)]
+#![feature(no_core, lang_items)]
 
 #![crate_name = "foo"]
 #![no_core]
 
+#[lang = "sized"]
+trait Sized {}
+
 //@ has 'foo/index.html'
 //@ has - '//dt/*[@class="stab portability"]' 'foobar'
 //@ has - '//dt/*[@class="stab portability"]' 'bar'
diff --git a/tests/rustdoc/cross-crate-primitive-doc.rs b/tests/rustdoc/cross-crate-primitive-doc.rs
index ca33dedcbae..0ffde5b0f2d 100644
--- a/tests/rustdoc/cross-crate-primitive-doc.rs
+++ b/tests/rustdoc/cross-crate-primitive-doc.rs
@@ -2,9 +2,12 @@
 //@ compile-flags: --extern-html-root-url=primitive_doc=../ -Z unstable-options
 //@ only-linux
 
-#![feature(no_core)]
+#![feature(no_core, lang_items)]
 #![no_core]
 
+#[lang = "sized"]
+trait Sized {}
+
 extern crate primitive_doc;
 
 //@ has 'cross_crate_primitive_doc/fn.foo.html' '//a[@href="../primitive_doc/primitive.usize.html"]' 'usize'
diff --git a/tests/rustdoc/intra-doc/no-doc-primitive.rs b/tests/rustdoc/intra-doc/no-doc-primitive.rs
index 1f8622ab867..79825643b98 100644
--- a/tests/rustdoc/intra-doc/no-doc-primitive.rs
+++ b/tests/rustdoc/intra-doc/no-doc-primitive.rs
@@ -6,8 +6,13 @@
 #![rustc_coherence_is_core]
 #![crate_type = "rlib"]
 
+
 //@ has no_doc_primitive/index.html
 //! A [`char`] and its [`char::len_utf8`].
+
+#[lang = "sized"]
+trait Sized {}
+
 impl char {
     pub fn len_utf8(self) -> usize {
         42
diff --git a/tests/rustdoc/reexport-trait-from-hidden-111064-2.rs b/tests/rustdoc/reexport-trait-from-hidden-111064-2.rs
index 2b21f9862b4..61060b3ff7c 100644
--- a/tests/rustdoc/reexport-trait-from-hidden-111064-2.rs
+++ b/tests/rustdoc/reexport-trait-from-hidden-111064-2.rs
@@ -1,8 +1,11 @@
 // Regression test for <https://github.com/rust-lang/rust/issues/111064>.
-#![feature(no_core)]
+#![feature(no_core, lang_items)]
 #![no_core]
 #![crate_name = "foo"]
 
+#[lang = "sized"]
+trait Sized {}
+
 //@ files "foo" "['sidebar-items.js', 'all.html', 'hidden', 'index.html', 'struct.Bar.html', \
 //        'visible']"
 //@ files "foo/hidden" "['inner']"
diff --git a/tests/rustdoc/safe-intrinsic.rs b/tests/rustdoc/safe-intrinsic.rs
index 07af04ace60..1edc1d9f79b 100644
--- a/tests/rustdoc/safe-intrinsic.rs
+++ b/tests/rustdoc/safe-intrinsic.rs
@@ -1,10 +1,13 @@
 #![feature(intrinsics)]
-#![feature(no_core)]
+#![feature(no_core, lang_items)]
 #![feature(rustc_attrs)]
 
 #![no_core]
 #![crate_name = "foo"]
 
+#[lang = "sized"]
+trait Sized {}
+
 //@ has 'foo/fn.abort.html'
 //@ has - '//pre[@class="rust item-decl"]' 'pub fn abort() -> !'
 #[rustc_intrinsic]
diff --git a/tests/ui/associated-consts/issue-58022.stderr b/tests/ui/associated-consts/issue-58022.stderr
index 82cbc9ed3b0..37cb162b2b2 100644
--- a/tests/ui/associated-consts/issue-58022.stderr
+++ b/tests/ui/associated-consts/issue-58022.stderr
@@ -1,12 +1,3 @@
-error[E0790]: cannot refer to the associated constant on trait without specifying the corresponding `impl` type
-  --> $DIR/issue-58022.rs:4:25
-   |
-LL |     const SIZE: usize;
-   |     ------------------ `Foo::SIZE` defined here
-LL |
-LL |     fn new(slice: &[u8; Foo::SIZE]) -> Self;
-   |                         ^^^^^^^^^ cannot refer to the associated constant of trait
-
 error[E0277]: the size for values of type `[u8]` cannot be known at compilation time
   --> $DIR/issue-58022.rs:13:41
    |
@@ -21,6 +12,15 @@ LL | pub struct Bar<T: ?Sized>(T);
    |            ^^^
    = note: the return type of a function must have a statically known size
 
+error[E0790]: cannot refer to the associated constant on trait without specifying the corresponding `impl` type
+  --> $DIR/issue-58022.rs:4:25
+   |
+LL |     const SIZE: usize;
+   |     ------------------ `Foo::SIZE` defined here
+LL |
+LL |     fn new(slice: &[u8; Foo::SIZE]) -> Self;
+   |                         ^^^^^^^^^ cannot refer to the associated constant of trait
+
 error[E0423]: expected function, tuple struct or tuple variant, found trait `Foo`
   --> $DIR/issue-58022.rs:15:9
    |
diff --git a/tests/ui/borrowck/borrowck-thread-local-static-borrow-outlives-fn.stderr b/tests/ui/borrowck/borrowck-thread-local-static-borrow-outlives-fn.stderr
index 11ee8f7bb91..6e0c69a4eb0 100644
--- a/tests/ui/borrowck/borrowck-thread-local-static-borrow-outlives-fn.stderr
+++ b/tests/ui/borrowck/borrowck-thread-local-static-borrow-outlives-fn.stderr
@@ -4,7 +4,7 @@ error[E0712]: thread-local variable borrowed past end of function
 LL |      assert_static(&FOO);
    |                    ^^^^ thread-local variables cannot be borrowed beyond the end of the function
 LL | }
-   |  - end of enclosing function is here
+   | - end of enclosing function is here
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/cenum_impl_drop_cast.rs b/tests/ui/cenum_impl_drop_cast.rs
index 96e3d967e2c..f681434dd86 100644
--- a/tests/ui/cenum_impl_drop_cast.rs
+++ b/tests/ui/cenum_impl_drop_cast.rs
@@ -1,5 +1,3 @@
-#![deny(cenum_impl_drop_cast)]
-
 enum E {
     A = 0,
 }
@@ -14,5 +12,4 @@ fn main() {
     let e = E::A;
     let i = e as u32;
     //~^ ERROR cannot cast enum `E` into integer `u32` because it implements `Drop`
-    //~| WARN this was previously accepted
 }
diff --git a/tests/ui/cenum_impl_drop_cast.stderr b/tests/ui/cenum_impl_drop_cast.stderr
index 541d15d021d..35c69f4b4b7 100644
--- a/tests/ui/cenum_impl_drop_cast.stderr
+++ b/tests/ui/cenum_impl_drop_cast.stderr
@@ -1,31 +1,8 @@
 error: cannot cast enum `E` into integer `u32` because it implements `Drop`
-  --> $DIR/cenum_impl_drop_cast.rs:15:13
+  --> $DIR/cenum_impl_drop_cast.rs:13:13
    |
 LL |     let i = e as u32;
    |             ^^^^^^^^
-   |
-   = 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 #73333 <https://github.com/rust-lang/rust/issues/73333>
-note: the lint level is defined here
-  --> $DIR/cenum_impl_drop_cast.rs:1:9
-   |
-LL | #![deny(cenum_impl_drop_cast)]
-   |         ^^^^^^^^^^^^^^^^^^^^
 
 error: aborting due to 1 previous error
 
-Future incompatibility report: Future breakage diagnostic:
-error: cannot cast enum `E` into integer `u32` because it implements `Drop`
-  --> $DIR/cenum_impl_drop_cast.rs:15:13
-   |
-LL |     let i = e as u32;
-   |             ^^^^^^^^
-   |
-   = 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 #73333 <https://github.com/rust-lang/rust/issues/73333>
-note: the lint level is defined here
-  --> $DIR/cenum_impl_drop_cast.rs:1:9
-   |
-LL | #![deny(cenum_impl_drop_cast)]
-   |         ^^^^^^^^^^^^^^^^^^^^
-
diff --git a/tests/ui/check-cfg/cargo-build-script.stderr b/tests/ui/check-cfg/cargo-build-script.stderr
index df0bc47571c..03a7156a4d6 100644
--- a/tests/ui/check-cfg/cargo-build-script.stderr
+++ b/tests/ui/check-cfg/cargo-build-script.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `has_foo`
 LL | #[cfg(has_foo)]
    |       ^^^^^^^
    |
-   = help: expected names are: `has_bar` and 30 more
+   = help: expected names are: `has_bar` and 31 more
    = help: consider using a Cargo feature instead
    = help: or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:
             [lints.rust]
diff --git a/tests/ui/check-cfg/cargo-feature.none.stderr b/tests/ui/check-cfg/cargo-feature.none.stderr
index 58813a1f677..b83d1794984 100644
--- a/tests/ui/check-cfg/cargo-feature.none.stderr
+++ b/tests/ui/check-cfg/cargo-feature.none.stderr
@@ -25,7 +25,7 @@ warning: unexpected `cfg` condition name: `tokio_unstable`
 LL | #[cfg(tokio_unstable)]
    |       ^^^^^^^^^^^^^^
    |
-   = help: expected names are: `docsrs`, `feature`, and `test` and 30 more
+   = help: expected names are: `docsrs`, `feature`, and `test` and 31 more
    = help: consider using a Cargo feature instead
    = help: or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:
             [lints.rust]
diff --git a/tests/ui/check-cfg/cargo-feature.some.stderr b/tests/ui/check-cfg/cargo-feature.some.stderr
index 5a12be81338..2cddcbbcd7f 100644
--- a/tests/ui/check-cfg/cargo-feature.some.stderr
+++ b/tests/ui/check-cfg/cargo-feature.some.stderr
@@ -25,7 +25,7 @@ warning: unexpected `cfg` condition name: `tokio_unstable`
 LL | #[cfg(tokio_unstable)]
    |       ^^^^^^^^^^^^^^
    |
-   = help: expected names are: `CONFIG_NVME`, `docsrs`, `feature`, and `test` and 30 more
+   = help: expected names are: `CONFIG_NVME`, `docsrs`, `feature`, and `test` and 31 more
    = help: consider using a Cargo feature instead
    = help: or consider adding in `Cargo.toml` the `check-cfg` lint config for the lint:
             [lints.rust]
diff --git a/tests/ui/check-cfg/cfg-value-for-cfg-name-duplicate.stderr b/tests/ui/check-cfg/cfg-value-for-cfg-name-duplicate.stderr
index 7c276c58170..68e1259dbb8 100644
--- a/tests/ui/check-cfg/cfg-value-for-cfg-name-duplicate.stderr
+++ b/tests/ui/check-cfg/cfg-value-for-cfg-name-duplicate.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `value`
 LL | #[cfg(value)]
    |       ^^^^^
    |
-   = help: expected names are: `bar`, `bee`, `cow`, and `foo` and 30 more
+   = help: expected names are: `bar`, `bee`, `cow`, and `foo` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(value)`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
    = note: `#[warn(unexpected_cfgs)]` on by default
diff --git a/tests/ui/check-cfg/cfg-value-for-cfg-name-multiple.stderr b/tests/ui/check-cfg/cfg-value-for-cfg-name-multiple.stderr
index 9687a043e83..138c7fc7584 100644
--- a/tests/ui/check-cfg/cfg-value-for-cfg-name-multiple.stderr
+++ b/tests/ui/check-cfg/cfg-value-for-cfg-name-multiple.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `my_value`
 LL | #[cfg(my_value)]
    |       ^^^^^^^^
    |
-   = help: expected names are: `bar` and `foo` and 30 more
+   = help: expected names are: `bar` and `foo` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(my_value)`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
    = note: `#[warn(unexpected_cfgs)]` on by default
diff --git a/tests/ui/check-cfg/exhaustive-names-values.feature.stderr b/tests/ui/check-cfg/exhaustive-names-values.feature.stderr
index 10302f0a7e4..af66cbd8189 100644
--- a/tests/ui/check-cfg/exhaustive-names-values.feature.stderr
+++ b/tests/ui/check-cfg/exhaustive-names-values.feature.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `unknown_key`
 LL | #[cfg(unknown_key = "value")]
    |       ^^^^^^^^^^^^^^^^^^^^^
    |
-   = help: expected names are: `feature` and 30 more
+   = help: expected names are: `feature` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(unknown_key, values("value"))`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
    = note: `#[warn(unexpected_cfgs)]` on by default
diff --git a/tests/ui/check-cfg/exhaustive-names-values.full.stderr b/tests/ui/check-cfg/exhaustive-names-values.full.stderr
index 10302f0a7e4..af66cbd8189 100644
--- a/tests/ui/check-cfg/exhaustive-names-values.full.stderr
+++ b/tests/ui/check-cfg/exhaustive-names-values.full.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `unknown_key`
 LL | #[cfg(unknown_key = "value")]
    |       ^^^^^^^^^^^^^^^^^^^^^
    |
-   = help: expected names are: `feature` and 30 more
+   = help: expected names are: `feature` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(unknown_key, values("value"))`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
    = note: `#[warn(unexpected_cfgs)]` on by default
diff --git a/tests/ui/check-cfg/mix.stderr b/tests/ui/check-cfg/mix.stderr
index 033aaef848f..be4d7c77276 100644
--- a/tests/ui/check-cfg/mix.stderr
+++ b/tests/ui/check-cfg/mix.stderr
@@ -44,7 +44,7 @@ warning: unexpected `cfg` condition name: `uu`
 LL | #[cfg_attr(uu, unix)]
    |            ^^
    |
-   = help: expected names are: `feature` and 30 more
+   = help: expected names are: `feature` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(uu)`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
 
diff --git a/tests/ui/check-cfg/raw-keywords.edition2015.stderr b/tests/ui/check-cfg/raw-keywords.edition2015.stderr
index f19ded9cb67..8ca33e088fc 100644
--- a/tests/ui/check-cfg/raw-keywords.edition2015.stderr
+++ b/tests/ui/check-cfg/raw-keywords.edition2015.stderr
@@ -14,7 +14,7 @@ warning: unexpected `cfg` condition name: `r#false`
 LL | #[cfg(r#false)]
    |       ^^^^^^^
    |
-   = help: expected names are: `async`, `edition2015`, `edition2021`, and `r#true` and 30 more
+   = help: expected names are: `async`, `edition2015`, `edition2021`, and `r#true` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(r#false)`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
 
diff --git a/tests/ui/check-cfg/raw-keywords.edition2021.stderr b/tests/ui/check-cfg/raw-keywords.edition2021.stderr
index 6096148a259..cce55720bdd 100644
--- a/tests/ui/check-cfg/raw-keywords.edition2021.stderr
+++ b/tests/ui/check-cfg/raw-keywords.edition2021.stderr
@@ -14,7 +14,7 @@ warning: unexpected `cfg` condition name: `r#false`
 LL | #[cfg(r#false)]
    |       ^^^^^^^
    |
-   = help: expected names are: `r#async`, `edition2015`, `edition2021`, and `r#true` and 30 more
+   = help: expected names are: `r#async`, `edition2015`, `edition2021`, and `r#true` and 31 more
    = help: to expect this configuration use `--check-cfg=cfg(r#false)`
    = note: see <https://doc.rust-lang.org/nightly/rustc/check-cfg.html> for more information about checking conditional configuration
 
diff --git a/tests/ui/check-cfg/report-in-external-macros.cargo.stderr b/tests/ui/check-cfg/report-in-external-macros.cargo.stderr
index a6584d777a3..989a01f2244 100644
--- a/tests/ui/check-cfg/report-in-external-macros.cargo.stderr
+++ b/tests/ui/check-cfg/report-in-external-macros.cargo.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `my_lib_cfg`
 LL |     cfg_macro::my_lib_macro!();
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
-   = help: expected names are: `feature` and 30 more
+   = help: expected names are: `feature` and 31 more
    = note: using a cfg inside a macro will use the cfgs from the destination crate and not the ones from the defining crate
    = help: try referring to `cfg_macro::my_lib_macro` crate for guidance on how handle this unexpected cfg
    = help: the macro `cfg_macro::my_lib_macro` may come from an old version of the `cfg_macro` crate, try updating your dependency with `cargo update -p cfg_macro`
diff --git a/tests/ui/check-cfg/report-in-external-macros.rustc.stderr b/tests/ui/check-cfg/report-in-external-macros.rustc.stderr
index 914b5a0efe3..95d10e014f3 100644
--- a/tests/ui/check-cfg/report-in-external-macros.rustc.stderr
+++ b/tests/ui/check-cfg/report-in-external-macros.rustc.stderr
@@ -4,7 +4,7 @@ warning: unexpected `cfg` condition name: `my_lib_cfg`
 LL |     cfg_macro::my_lib_macro!();
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
-   = help: expected names are: `feature` and 30 more
+   = help: expected names are: `feature` and 31 more
    = note: using a cfg inside a macro will use the cfgs from the destination crate and not the ones from the defining crate
    = help: try referring to `cfg_macro::my_lib_macro` crate for guidance on how handle this unexpected cfg
    = help: to expect this configuration use `--check-cfg=cfg(my_lib_cfg)`
diff --git a/tests/ui/check-cfg/well-known-names.stderr b/tests/ui/check-cfg/well-known-names.stderr
index 4ff90261158..000315443f8 100644
--- a/tests/ui/check-cfg/well-known-names.stderr
+++ b/tests/ui/check-cfg/well-known-names.stderr
@@ -5,6 +5,7 @@ LL | #[cfg(list_all_well_known_cfgs)]
    |       ^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = help: expected names are: `clippy`
+`contract_checks`
 `debug_assertions`
 `doc`
 `doctest`
diff --git a/tests/ui/issues/issue-40883.rs b/tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs
index a4646d67c68..a4646d67c68 100644
--- a/tests/ui/issues/issue-40883.rs
+++ b/tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs
diff --git a/tests/ui/consts/const-slice-array-deref.rs b/tests/ui/consts/const-slice-array-deref.rs
index 9d84ed4bdb0..99563ac968c 100644
--- a/tests/ui/consts/const-slice-array-deref.rs
+++ b/tests/ui/consts/const-slice-array-deref.rs
@@ -1,6 +1,5 @@
 const ONE: [u16] = [1];
 //~^ ERROR the size for values of type `[u16]` cannot be known at compilation time
-//~| ERROR the size for values of type `[u16]` cannot be known at compilation time
 //~| ERROR mismatched types
 
 const TWO: &'static u16 = &ONE[0];
diff --git a/tests/ui/consts/const-slice-array-deref.stderr b/tests/ui/consts/const-slice-array-deref.stderr
index 6e69744144e..346685380cc 100644
--- a/tests/ui/consts/const-slice-array-deref.stderr
+++ b/tests/ui/consts/const-slice-array-deref.stderr
@@ -12,22 +12,13 @@ error[E0308]: mismatched types
 LL | const ONE: [u16] = [1];
    |                    ^^^ expected `[u16]`, found `[u16; 1]`
 
-error[E0277]: the size for values of type `[u16]` cannot be known at compilation time
-  --> $DIR/const-slice-array-deref.rs:1:20
-   |
-LL | const ONE: [u16] = [1];
-   |                    ^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `[u16]`
-   = note: constant expressions must have a statically known size
-
 error[E0161]: cannot move a value of type `[u16]`
-  --> $DIR/const-slice-array-deref.rs:6:28
+  --> $DIR/const-slice-array-deref.rs:5:28
    |
 LL | const TWO: &'static u16 = &ONE[0];
    |                            ^^^ the size of `[u16]` cannot be statically determined
 
-error: aborting due to 4 previous errors
+error: aborting due to 3 previous errors
 
 Some errors have detailed explanations: E0161, E0277, E0308.
 For more information about an error, try `rustc --explain E0161`.
diff --git a/tests/ui/consts/const-unsized.rs b/tests/ui/consts/const-unsized.rs
index 18682aa6eb6..e8af3323ceb 100644
--- a/tests/ui/consts/const-unsized.rs
+++ b/tests/ui/consts/const-unsized.rs
@@ -2,19 +2,19 @@ use std::fmt::Debug;
 
 const CONST_0: dyn Debug + Sync = *(&0 as &(dyn Debug + Sync));
 //~^ ERROR the size for values of type
-//~| ERROR the size for values of type
+//~| ERROR cannot move out of a shared reference
 
 const CONST_FOO: str = *"foo";
 //~^ ERROR the size for values of type
-//~| ERROR the size for values of type
+//~| ERROR cannot move out of a shared reference
 
 static STATIC_1: dyn Debug + Sync = *(&1 as &(dyn Debug + Sync));
 //~^ ERROR the size for values of type
-//~| ERROR the size for values of type
+//~| ERROR cannot move out of a shared reference
 
 static STATIC_BAR: str = *"bar";
 //~^ ERROR the size for values of type
-//~| ERROR the size for values of type
+//~| ERROR cannot move out of a shared reference
 
 fn main() {
     println!("{:?} {:?} {:?} {:?}", &CONST_0, &CONST_FOO, &STATIC_1, &STATIC_BAR);
diff --git a/tests/ui/consts/const-unsized.stderr b/tests/ui/consts/const-unsized.stderr
index 0b69cad9651..7931d7adafd 100644
--- a/tests/ui/consts/const-unsized.stderr
+++ b/tests/ui/consts/const-unsized.stderr
@@ -6,15 +6,6 @@ LL | const CONST_0: dyn Debug + Sync = *(&0 as &(dyn Debug + Sync));
    |
    = help: the trait `Sized` is not implemented for `(dyn Debug + Sync + 'static)`
 
-error[E0277]: the size for values of type `(dyn Debug + Sync + 'static)` cannot be known at compilation time
-  --> $DIR/const-unsized.rs:3:35
-   |
-LL | const CONST_0: dyn Debug + Sync = *(&0 as &(dyn Debug + Sync));
-   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `(dyn Debug + Sync + 'static)`
-   = note: constant expressions must have a statically known size
-
 error[E0277]: the size for values of type `str` cannot be known at compilation time
   --> $DIR/const-unsized.rs:7:18
    |
@@ -23,15 +14,6 @@ LL | const CONST_FOO: str = *"foo";
    |
    = help: the trait `Sized` is not implemented for `str`
 
-error[E0277]: the size for values of type `str` cannot be known at compilation time
-  --> $DIR/const-unsized.rs:7:24
-   |
-LL | const CONST_FOO: str = *"foo";
-   |                        ^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `str`
-   = note: constant expressions must have a statically known size
-
 error[E0277]: the size for values of type `(dyn Debug + Sync + 'static)` cannot be known at compilation time
   --> $DIR/const-unsized.rs:11:18
    |
@@ -40,15 +22,6 @@ LL | static STATIC_1: dyn Debug + Sync = *(&1 as &(dyn Debug + Sync));
    |
    = help: the trait `Sized` is not implemented for `(dyn Debug + Sync + 'static)`
 
-error[E0277]: the size for values of type `(dyn Debug + Sync + 'static)` cannot be known at compilation time
-  --> $DIR/const-unsized.rs:11:37
-   |
-LL | static STATIC_1: dyn Debug + Sync = *(&1 as &(dyn Debug + Sync));
-   |                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `(dyn Debug + Sync + 'static)`
-   = note: constant expressions must have a statically known size
-
 error[E0277]: the size for values of type `str` cannot be known at compilation time
   --> $DIR/const-unsized.rs:15:20
    |
@@ -57,14 +30,29 @@ LL | static STATIC_BAR: str = *"bar";
    |
    = help: the trait `Sized` is not implemented for `str`
 
-error[E0277]: the size for values of type `str` cannot be known at compilation time
+error[E0507]: cannot move out of a shared reference
+  --> $DIR/const-unsized.rs:3:35
+   |
+LL | const CONST_0: dyn Debug + Sync = *(&0 as &(dyn Debug + Sync));
+   |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `dyn Debug + Sync`, which does not implement the `Copy` trait
+
+error[E0507]: cannot move out of a shared reference
+  --> $DIR/const-unsized.rs:7:24
+   |
+LL | const CONST_FOO: str = *"foo";
+   |                        ^^^^^^ move occurs because value has type `str`, which does not implement the `Copy` trait
+
+error[E0507]: cannot move out of a shared reference
+  --> $DIR/const-unsized.rs:11:37
+   |
+LL | static STATIC_1: dyn Debug + Sync = *(&1 as &(dyn Debug + Sync));
+   |                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ move occurs because value has type `dyn Debug + Sync`, which does not implement the `Copy` trait
+
+error[E0507]: cannot move out of a shared reference
   --> $DIR/const-unsized.rs:15:26
    |
 LL | static STATIC_BAR: str = *"bar";
-   |                          ^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `str`
-   = note: constant expressions must have a statically known size
+   |                          ^^^^^^ move occurs because value has type `str`, which does not implement the `Copy` trait
 
 error[E0161]: cannot move a value of type `str`
   --> $DIR/const-unsized.rs:20:48
@@ -80,5 +68,5 @@ LL |     println!("{:?} {:?} {:?} {:?}", &CONST_0, &CONST_FOO, &STATIC_1, &STATI
 
 error: aborting due to 10 previous errors
 
-Some errors have detailed explanations: E0161, E0277.
+Some errors have detailed explanations: E0161, E0277, E0507.
 For more information about an error, try `rustc --explain E0161`.
diff --git a/tests/ui/consts/const_refs_to_static-ice-121413.rs b/tests/ui/consts/const_refs_to_static-ice-121413.rs
index 7ef67d9a984..432ae1ad5e3 100644
--- a/tests/ui/consts/const_refs_to_static-ice-121413.rs
+++ b/tests/ui/consts/const_refs_to_static-ice-121413.rs
@@ -9,11 +9,9 @@ const REF_INTERIOR_MUT: &usize = {
     //~^ ERROR failed to resolve: use of undeclared type `AtomicUsize`
     //~| WARN trait objects without an explicit `dyn` are deprecated
     //~| ERROR the size for values of type `(dyn Sync + 'static)` cannot be known at compilation time
-    //~| ERROR the size for values of type `(dyn Sync + 'static)` cannot be known at compilation time
     //~| WARN this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2021!
     //~| HELP if this is a dyn-compatible trait, use `dyn`
     //~| HELP the trait `Sized` is not implemented for `(dyn Sync + 'static)`
-    //~| HELP the trait `Sized` is not implemented for `(dyn Sync + 'static)`
     unsafe { &*(&FOO as *const _ as *const usize) }
 };
 pub fn main() {}
diff --git a/tests/ui/consts/const_refs_to_static-ice-121413.stderr b/tests/ui/consts/const_refs_to_static-ice-121413.stderr
index 7beb43d84fb..8665d9b6852 100644
--- a/tests/ui/consts/const_refs_to_static-ice-121413.stderr
+++ b/tests/ui/consts/const_refs_to_static-ice-121413.stderr
@@ -31,16 +31,7 @@ LL |     static FOO: Sync = AtomicUsize::new(0);
    |
    = help: the trait `Sized` is not implemented for `(dyn Sync + 'static)`
 
-error[E0277]: the size for values of type `(dyn Sync + 'static)` cannot be known at compilation time
-  --> $DIR/const_refs_to_static-ice-121413.rs:8:24
-   |
-LL |     static FOO: Sync = AtomicUsize::new(0);
-   |                        ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `(dyn Sync + 'static)`
-   = note: constant expressions must have a statically known size
-
-error: aborting due to 3 previous errors; 1 warning emitted
+error: aborting due to 2 previous errors; 1 warning emitted
 
 Some errors have detailed explanations: E0277, E0433.
 For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/contracts/contract-annotation-limitations.rs b/tests/ui/contracts/contract-annotation-limitations.rs
new file mode 100644
index 00000000000..10b3bacab5c
--- /dev/null
+++ b/tests/ui/contracts/contract-annotation-limitations.rs
@@ -0,0 +1,28 @@
+//! Test for some of the existing limitations and the current error messages.
+//! Some of these limitations may be removed in the future.
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+#![allow(dead_code)]
+
+/// Represent a 5-star system.
+struct Stars(u8);
+
+impl Stars {
+    fn is_valid(&self) -> bool {
+        self.0 <= 5
+    }
+}
+
+trait ParseStars {
+    #[core::contracts::ensures(|ret| ret.is_none_or(Stars::is_valid))]
+    //~^ ERROR contract annotations is only supported in functions with bodies
+    fn parse_string(input: String) -> Option<Stars>;
+
+    #[core::contracts::ensures(|ret| ret.is_none_or(Stars::is_valid))]
+    //~^ ERROR contract annotations is only supported in functions with bodies
+    fn parse<T>(input: T) -> Option<Stars> where T: for<'a> Into<&'a str>;
+}
+
+fn main() {
+}
diff --git a/tests/ui/contracts/contract-annotation-limitations.stderr b/tests/ui/contracts/contract-annotation-limitations.stderr
new file mode 100644
index 00000000000..14338cf4b86
--- /dev/null
+++ b/tests/ui/contracts/contract-annotation-limitations.stderr
@@ -0,0 +1,23 @@
+error: contract annotations is only supported in functions with bodies
+  --> $DIR/contract-annotation-limitations.rs:18:5
+   |
+LL |     #[core::contracts::ensures(|ret| ret.is_none_or(Stars::is_valid))]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations is only supported in functions with bodies
+  --> $DIR/contract-annotation-limitations.rs:22:5
+   |
+LL |     #[core::contracts::ensures(|ret| ret.is_none_or(Stars::is_valid))]
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-annotation-limitations.rs:4:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+error: aborting due to 2 previous errors; 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-generics.chk_const_fail.stderr b/tests/ui/contracts/contract-attributes-generics.chk_const_fail.stderr
new file mode 100644
index 00000000000..0630811d4f7
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-generics.chk_const_fail.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-generics.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-generics.chk_fail_post.stderr b/tests/ui/contracts/contract-attributes-generics.chk_fail_post.stderr
new file mode 100644
index 00000000000..0630811d4f7
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-generics.chk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-generics.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-generics.chk_fail_pre.stderr b/tests/ui/contracts/contract-attributes-generics.chk_fail_pre.stderr
new file mode 100644
index 00000000000..0630811d4f7
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-generics.chk_fail_pre.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-generics.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-generics.chk_pass.stderr b/tests/ui/contracts/contract-attributes-generics.chk_pass.stderr
new file mode 100644
index 00000000000..0630811d4f7
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-generics.chk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-generics.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-generics.rs b/tests/ui/contracts/contract-attributes-generics.rs
new file mode 100644
index 00000000000..fd79c6abedd
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-generics.rs
@@ -0,0 +1,71 @@
+//! Test that contracts can be applied to generic functions.
+
+//@ revisions: unchk_pass chk_pass chk_fail_pre chk_fail_post chk_const_fail
+//
+//@ [unchk_pass] run-pass
+//@ [chk_pass] run-pass
+//
+//@ [chk_fail_pre] run-fail
+//@ [chk_fail_post] run-fail
+//@ [chk_const_fail] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_pre] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
+//@ [chk_const_fail] compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+use std::ops::Sub;
+
+/// Dummy fn contract that precondition fails for val < 0, and post-condition fail for val == 1
+#[core::contracts::requires(val > 0u8.into())]
+#[core::contracts::ensures(|ret| *ret > 0u8.into())]
+fn decrement<T>(val: T) -> T
+where T: PartialOrd + Sub<Output=T> + From<u8>
+{
+    val - 1u8.into()
+}
+
+/// Create a structure that takes a constant parameter.
+#[allow(dead_code)]
+struct Capped<const MAX: usize>(usize);
+
+/// Now declare a function to create stars which shouldn't exceed 5 stars.
+// Add redundant braces to ensure the built-in macro can handle this syntax.
+#[allow(unused_braces)]
+#[core::contracts::requires(num <= 5)]
+unsafe fn stars_unchecked(num: usize) -> Capped<{ 5 }> {
+    Capped(num)
+}
+
+
+fn main() {
+    check_decrement();
+    check_stars();
+}
+
+fn check_stars() {
+    // This should always pass.
+    let _ = unsafe { stars_unchecked(3) };
+
+    // This violates the contract.
+    #[cfg(any(unchk_pass, chk_const_fail))]
+    let _ = unsafe { stars_unchecked(10) };
+}
+
+fn check_decrement() {
+    // This should always pass
+    assert_eq!(decrement(10u8), 9u8);
+
+    // This should fail requires but pass with no contract check.
+    #[cfg(any(unchk_pass, chk_fail_pre))]
+    assert_eq!(decrement(-2i128), -3i128);
+
+    // This should fail ensures but pass with no contract check.
+    #[cfg(any(unchk_pass, chk_fail_post))]
+    assert_eq!(decrement(1i32), 0i32);
+}
diff --git a/tests/ui/contracts/contract-attributes-generics.unchk_pass.stderr b/tests/ui/contracts/contract-attributes-generics.unchk_pass.stderr
new file mode 100644
index 00000000000..0630811d4f7
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-generics.unchk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-generics.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-nest.chk_fail_post.stderr b/tests/ui/contracts/contract-attributes-nest.chk_fail_post.stderr
new file mode 100644
index 00000000000..9ca95b8bb01
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.chk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-nest.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-nest.chk_fail_pre.stderr b/tests/ui/contracts/contract-attributes-nest.chk_fail_pre.stderr
new file mode 100644
index 00000000000..9ca95b8bb01
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.chk_fail_pre.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-nest.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-nest.chk_pass.stderr b/tests/ui/contracts/contract-attributes-nest.chk_pass.stderr
new file mode 100644
index 00000000000..9ca95b8bb01
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.chk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-nest.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-nest.rs b/tests/ui/contracts/contract-attributes-nest.rs
new file mode 100644
index 00000000000..e1e61b88f28
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.rs
@@ -0,0 +1,45 @@
+//@ revisions: unchk_pass unchk_fail_pre unchk_fail_post chk_pass chk_fail_pre chk_fail_post
+//
+//@ [unchk_pass] run-pass
+//@ [unchk_fail_pre] run-pass
+//@ [unchk_fail_post] run-pass
+//@ [chk_pass] run-pass
+//
+//@ [chk_fail_pre] run-fail
+//@ [chk_fail_post] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_pre] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_post] compile-flags: -Zcontract-checks=no
+//
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_pre] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+#[core::contracts::requires(x.baz > 0)]
+#[core::contracts::ensures(|ret| *ret > 100)]
+fn nest(x: Baz) -> i32
+{
+    loop {
+        return x.baz + 50;
+    }
+}
+
+struct Baz { baz: i32 }
+
+const BAZ_PASS_PRE_POST: Baz = Baz { baz: 100 };
+#[cfg(any(unchk_fail_post, chk_fail_post))]
+const BAZ_FAIL_POST: Baz = Baz { baz: 10 };
+#[cfg(any(unchk_fail_pre, chk_fail_pre))]
+const BAZ_FAIL_PRE: Baz = Baz { baz: -10 };
+
+fn main() {
+    assert_eq!(nest(BAZ_PASS_PRE_POST), 150);
+    #[cfg(any(unchk_fail_pre, chk_fail_pre))]
+    nest(BAZ_FAIL_PRE);
+    #[cfg(any(unchk_fail_post, chk_fail_post))]
+    nest(BAZ_FAIL_POST);
+}
diff --git a/tests/ui/contracts/contract-attributes-nest.unchk_fail_post.stderr b/tests/ui/contracts/contract-attributes-nest.unchk_fail_post.stderr
new file mode 100644
index 00000000000..9ca95b8bb01
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.unchk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-nest.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-nest.unchk_fail_pre.stderr b/tests/ui/contracts/contract-attributes-nest.unchk_fail_pre.stderr
new file mode 100644
index 00000000000..9ca95b8bb01
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.unchk_fail_pre.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-nest.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-nest.unchk_pass.stderr b/tests/ui/contracts/contract-attributes-nest.unchk_pass.stderr
new file mode 100644
index 00000000000..9ca95b8bb01
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-nest.unchk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-nest.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-tail.chk_fail_post.stderr b/tests/ui/contracts/contract-attributes-tail.chk_fail_post.stderr
new file mode 100644
index 00000000000..f87e7e19fa3
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.chk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-tail.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-tail.chk_fail_pre.stderr b/tests/ui/contracts/contract-attributes-tail.chk_fail_pre.stderr
new file mode 100644
index 00000000000..f87e7e19fa3
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.chk_fail_pre.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-tail.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-tail.chk_pass.stderr b/tests/ui/contracts/contract-attributes-tail.chk_pass.stderr
new file mode 100644
index 00000000000..f87e7e19fa3
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.chk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-tail.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-tail.rs b/tests/ui/contracts/contract-attributes-tail.rs
new file mode 100644
index 00000000000..ce4a6be5b82
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.rs
@@ -0,0 +1,43 @@
+//@ revisions: unchk_pass unchk_fail_pre unchk_fail_post chk_pass chk_fail_pre chk_fail_post
+//
+//@ [unchk_pass] run-pass
+//@ [unchk_fail_pre] run-pass
+//@ [unchk_fail_post] run-pass
+//@ [chk_pass] run-pass
+//
+//@ [chk_fail_pre] run-fail
+//@ [chk_fail_post] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_pre] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_post] compile-flags: -Zcontract-checks=no
+//
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_pre] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+#[core::contracts::requires(x.baz > 0)]
+#[core::contracts::ensures(|ret| *ret > 100)]
+fn tail(x: Baz) -> i32
+{
+    x.baz + 50
+}
+
+struct Baz { baz: i32 }
+
+const BAZ_PASS_PRE_POST: Baz = Baz { baz: 100 };
+#[cfg(any(unchk_fail_post, chk_fail_post))]
+const BAZ_FAIL_POST: Baz = Baz { baz: 10 };
+#[cfg(any(unchk_fail_pre, chk_fail_pre))]
+const BAZ_FAIL_PRE: Baz = Baz { baz: -10 };
+
+fn main() {
+    assert_eq!(tail(BAZ_PASS_PRE_POST), 150);
+    #[cfg(any(unchk_fail_pre, chk_fail_pre))]
+    tail(BAZ_FAIL_PRE);
+    #[cfg(any(unchk_fail_post, chk_fail_post))]
+    tail(BAZ_FAIL_POST);
+}
diff --git a/tests/ui/contracts/contract-attributes-tail.unchk_fail_post.stderr b/tests/ui/contracts/contract-attributes-tail.unchk_fail_post.stderr
new file mode 100644
index 00000000000..f87e7e19fa3
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.unchk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-tail.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-tail.unchk_fail_pre.stderr b/tests/ui/contracts/contract-attributes-tail.unchk_fail_pre.stderr
new file mode 100644
index 00000000000..f87e7e19fa3
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.unchk_fail_pre.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-tail.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-attributes-tail.unchk_pass.stderr b/tests/ui/contracts/contract-attributes-tail.unchk_pass.stderr
new file mode 100644
index 00000000000..f87e7e19fa3
--- /dev/null
+++ b/tests/ui/contracts/contract-attributes-tail.unchk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-attributes-tail.rs:19:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-captures-via-closure-copy.rs b/tests/ui/contracts/contract-captures-via-closure-copy.rs
new file mode 100644
index 00000000000..32c6d2bf4fe
--- /dev/null
+++ b/tests/ui/contracts/contract-captures-via-closure-copy.rs
@@ -0,0 +1,26 @@
+//@ run-fail
+//@ compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+struct Baz {
+    baz: i32
+}
+
+#[track_caller]
+#[core::contracts::requires(x.baz > 0)]
+#[core::contracts::ensures({let old = x.baz; move |ret:&Baz| ret.baz == old*2 })]
+// Relevant thing is this:  ^^^^^^^^^^^^^^^
+// because we are capturing state that is Copy
+fn doubler(x: Baz) -> Baz {
+    Baz { baz: x.baz + 10 }
+}
+
+fn main() {
+    assert_eq!(doubler(Baz { baz: 10 }).baz, 20);
+    assert_eq!(doubler(Baz { baz: 100 }).baz, 200);
+    // This is a *run-fail* test because it is still exercising the
+    // contract machinery, specifically because this second invocation
+    // of `doubler` shows how the code does not meet its contract.
+}
diff --git a/tests/ui/contracts/contract-captures-via-closure-copy.stderr b/tests/ui/contracts/contract-captures-via-closure-copy.stderr
new file mode 100644
index 00000000000..d92db601608
--- /dev/null
+++ b/tests/ui/contracts/contract-captures-via-closure-copy.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-captures-via-closure-copy.rs:4:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contract-captures-via-closure-noncopy.rs b/tests/ui/contracts/contract-captures-via-closure-noncopy.rs
new file mode 100644
index 00000000000..976f64c7fd9
--- /dev/null
+++ b/tests/ui/contracts/contract-captures-via-closure-noncopy.rs
@@ -0,0 +1,23 @@
+//@ compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+struct Baz {
+    baz: i32
+}
+
+#[track_caller]
+#[core::contracts::requires(x.baz > 0)]
+#[core::contracts::ensures({let old = x; move |ret:&Baz| ret.baz == old.baz*2 })]
+// Relevant thing is this:  ^^^^^^^^^^^
+// because we are capturing state that is non-Copy.
+//~^^^ ERROR trait bound `Baz: std::marker::Copy` is not satisfied
+fn doubler(x: Baz) -> Baz {
+    Baz { baz: x.baz + 10 }
+}
+
+fn main() {
+    assert_eq!(doubler(Baz { baz: 10 }).baz, 20);
+    assert_eq!(doubler(Baz { baz: 100 }).baz, 200);
+}
diff --git a/tests/ui/contracts/contract-captures-via-closure-noncopy.stderr b/tests/ui/contracts/contract-captures-via-closure-noncopy.stderr
new file mode 100644
index 00000000000..4a47671fee1
--- /dev/null
+++ b/tests/ui/contracts/contract-captures-via-closure-noncopy.stderr
@@ -0,0 +1,36 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-captures-via-closure-noncopy.rs:3:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+error[E0277]: the trait bound `Baz: std::marker::Copy` is not satisfied in `{closure@$DIR/contract-captures-via-closure-noncopy.rs:12:42: 12:57}`
+  --> $DIR/contract-captures-via-closure-noncopy.rs:12:1
+   |
+LL | #[core::contracts::ensures({let old = x; move |ret:&Baz| ret.baz == old.baz*2 })]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^------------------------------------^^^^
+   | |                                        |
+   | |                                        within this `{closure@$DIR/contract-captures-via-closure-noncopy.rs:12:42: 12:57}`
+   | |                                        this tail expression is of type `{closure@contract-captures-via-closure-noncopy.rs:12:42}`
+   | unsatisfied trait bound
+   |
+   = help: within `{closure@$DIR/contract-captures-via-closure-noncopy.rs:12:42: 12:57}`, the trait `std::marker::Copy` is not implemented for `Baz`
+note: required because it's used within this closure
+  --> $DIR/contract-captures-via-closure-noncopy.rs:12:42
+   |
+LL | #[core::contracts::ensures({let old = x; move |ret:&Baz| ret.baz == old.baz*2 })]
+   |                                          ^^^^^^^^^^^^^^^
+note: required by a bound in `build_check_ensures`
+  --> $SRC_DIR/core/src/contracts.rs:LL:COL
+help: consider annotating `Baz` with `#[derive(Copy)]`
+   |
+LL + #[derive(Copy)]
+LL | struct Baz {
+   |
+
+error: aborting due to 1 previous error; 1 warning emitted
+
+For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_ret.stderr b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_ret.stderr
new file mode 100644
index 00000000000..d693fad446a
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_ret.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-ensures-early-fn-exit.rs:16:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_try.stderr b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_try.stderr
new file mode 100644
index 00000000000..d693fad446a
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_try.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-ensures-early-fn-exit.rs:16:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_yeet.stderr b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_yeet.stderr
new file mode 100644
index 00000000000..d693fad446a
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_fail_yeet.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-ensures-early-fn-exit.rs:16:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_pass.stderr b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_pass.stderr
new file mode 100644
index 00000000000..d693fad446a
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-early-fn-exit.chk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-ensures-early-fn-exit.rs:16:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contracts-ensures-early-fn-exit.rs b/tests/ui/contracts/contracts-ensures-early-fn-exit.rs
new file mode 100644
index 00000000000..034cead3b4e
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-early-fn-exit.rs
@@ -0,0 +1,49 @@
+//@ revisions: unchk_pass chk_pass chk_fail_try chk_fail_ret chk_fail_yeet
+//
+//@ [unchk_pass] run-pass
+//@ [chk_pass] run-pass
+//@ [chk_fail_try] run-fail
+//@ [chk_fail_ret] run-fail
+//@ [chk_fail_yeet] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_try] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_ret] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_yeet] compile-flags: -Zcontract-checks=yes
+//! This test ensures that ensures clauses are checked for different return points of a function.
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+#![feature(yeet_expr)]
+
+/// This ensures will fail in different return points depending on the input.
+#[core::contracts::ensures(|ret: &Option<u32>| ret.is_some())]
+fn try_sum(x: u32, y: u32, z: u32) -> Option<u32> {
+    // Use Yeet to return early.
+    if x == u32::MAX && (y > 0 || z > 0) { do yeet }
+
+    // Use `?` to early return.
+    let partial = x.checked_add(y)?;
+
+    // Explicitly use `return` clause.
+    if u32::MAX - partial < z {
+        return None;
+    }
+
+    Some(partial + z)
+}
+
+fn main() {
+    // This should always succeed
+    assert_eq!(try_sum(0, 1, 2), Some(3));
+
+    #[cfg(any(unchk_pass, chk_fail_yeet))]
+    assert_eq!(try_sum(u32::MAX, 1, 1), None);
+
+    #[cfg(any(unchk_pass, chk_fail_try))]
+    assert_eq!(try_sum(u32::MAX - 10, 12, 0), None);
+
+    #[cfg(any(unchk_pass, chk_fail_ret))]
+    assert_eq!(try_sum(u32::MAX - 10, 2, 100), None);
+}
diff --git a/tests/ui/contracts/contracts-ensures-early-fn-exit.unchk_pass.stderr b/tests/ui/contracts/contracts-ensures-early-fn-exit.unchk_pass.stderr
new file mode 100644
index 00000000000..d693fad446a
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-early-fn-exit.unchk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-ensures-early-fn-exit.rs:16:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.rs b/tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.rs
new file mode 100644
index 00000000000..f01a852fbff
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.rs
@@ -0,0 +1,15 @@
+//@ run-pass
+//@ compile-flags: -Zcontract-checks=yes
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+#[core::contracts::ensures(|ret| *ret > 0)]
+fn outer() -> i32 {
+    let inner_closure = || -> i32 { 0 };
+    inner_closure();
+    10
+}
+
+fn main() {
+    outer();
+}
diff --git a/tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.stderr b/tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.stderr
new file mode 100644
index 00000000000..49a372b53c7
--- /dev/null
+++ b/tests/ui/contracts/contracts-ensures-is-not-inherited-when-nesting.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-ensures-is-not-inherited-when-nesting.rs:3:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.rs b/tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.rs
new file mode 100644
index 00000000000..2c2a4a69785
--- /dev/null
+++ b/tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.rs
@@ -0,0 +1,17 @@
+//@ run-pass
+//@ compile-flags: -Zcontract-checks=yes
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+
+struct Outer { outer: std::cell::Cell<i32> }
+
+#[core::contracts::requires(x.outer.get() > 0)]
+fn outer(x: Outer) {
+    let inner_closure = || { };
+    x.outer.set(0);
+    inner_closure();
+}
+
+fn main() {
+    outer(Outer { outer: 1.into() });
+}
diff --git a/tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.stderr b/tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.stderr
new file mode 100644
index 00000000000..48898c4434a
--- /dev/null
+++ b/tests/ui/contracts/contracts-requires-is-not-inherited-when-nesting.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contracts-requires-is-not-inherited-when-nesting.rs:3:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/disallow-contract-annotation-on-non-fn.rs b/tests/ui/contracts/disallow-contract-annotation-on-non-fn.rs
new file mode 100644
index 00000000000..69be906782a
--- /dev/null
+++ b/tests/ui/contracts/disallow-contract-annotation-on-non-fn.rs
@@ -0,0 +1,53 @@
+//! Checks for compilation errors related to adding contracts to non-function items.
+
+#![feature(contracts)]
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+#![allow(dead_code)]
+
+#[core::contracts::requires(true)]
+//~^ ERROR contract annotations can only be used on functions
+struct Dummy(usize);
+
+#[core::contracts::ensures(|v| v == 100)]
+//~^ ERROR contract annotations can only be used on functions
+const MAX_VAL: usize = 100;
+
+// FIXME: Improve the error message here. The macro thinks this is a function.
+#[core::contracts::ensures(|v| v == 100)]
+//~^ ERROR contract annotations is only supported in functions with bodies
+type NewDummy = fn(usize) -> Dummy;
+
+#[core::contracts::ensures(|v| v == 100)]
+//~^ ERROR contract annotations is only supported in functions with bodies
+const NEW_DUMMY_FN : fn(usize) -> Dummy = || { Dummy(0) };
+
+#[core::contracts::requires(true)]
+//~^ ERROR contract annotations can only be used on functions
+impl Dummy {
+
+    // This should work
+    #[core::contracts::ensures(|ret| ret.0 == v)]
+    fn new(v: usize) -> Dummy {
+        Dummy(v)
+    }
+}
+
+#[core::contracts::ensures(|dummy| dummy.0 > 0)]
+//~^ ERROR contract annotations can only be used on functions
+impl From<usize> for Dummy {
+    // This should work.
+    #[core::contracts::ensures(|ret| ret.0 == v)]
+    fn from(value: usize) -> Self {
+        Dummy::new(value)
+    }
+}
+
+/// You should not be able to annotate a trait either.
+#[core::contracts::requires(true)]
+//~^ ERROR contract annotations can only be used on functions
+pub trait DummyBuilder {
+    fn build() -> Dummy;
+}
+
+fn main() {
+}
diff --git a/tests/ui/contracts/disallow-contract-annotation-on-non-fn.stderr b/tests/ui/contracts/disallow-contract-annotation-on-non-fn.stderr
new file mode 100644
index 00000000000..0a7fff8183e
--- /dev/null
+++ b/tests/ui/contracts/disallow-contract-annotation-on-non-fn.stderr
@@ -0,0 +1,53 @@
+error: contract annotations can only be used on functions
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:7:1
+   |
+LL | #[core::contracts::requires(true)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations can only be used on functions
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:11:1
+   |
+LL | #[core::contracts::ensures(|v| v == 100)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations is only supported in functions with bodies
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:16:1
+   |
+LL | #[core::contracts::ensures(|v| v == 100)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations is only supported in functions with bodies
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:20:1
+   |
+LL | #[core::contracts::ensures(|v| v == 100)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations can only be used on functions
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:24:1
+   |
+LL | #[core::contracts::requires(true)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations can only be used on functions
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:35:1
+   |
+LL | #[core::contracts::ensures(|dummy| dummy.0 > 0)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: contract annotations can only be used on functions
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:46:1
+   |
+LL | #[core::contracts::requires(true)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/disallow-contract-annotation-on-non-fn.rs:3:12
+   |
+LL | #![feature(contracts)]
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+error: aborting due to 7 previous errors; 1 warning emitted
+
diff --git a/tests/ui/contracts/internal_machinery/contract-ast-extensions-nest.rs b/tests/ui/contracts/internal_machinery/contract-ast-extensions-nest.rs
new file mode 100644
index 00000000000..6d8cd3949ee
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-ast-extensions-nest.rs
@@ -0,0 +1,44 @@
+//@ revisions: unchk_pass unchk_fail_pre unchk_fail_post chk_pass chk_fail_pre chk_fail_post
+//
+//@ [unchk_pass] run-pass
+//@ [unchk_fail_pre] run-pass
+//@ [unchk_fail_post] run-pass
+//@ [chk_pass] run-pass
+//
+//@ [chk_fail_pre] run-fail
+//@ [chk_fail_post] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_pre] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_post] compile-flags: -Zcontract-checks=no
+//
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_pre] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts_internals)]
+
+fn nest(x: Baz) -> i32
+    contract_requires(|| x.baz > 0)
+    contract_ensures(|ret| *ret > 100)
+{
+    loop {
+        return x.baz + 50;
+    }
+}
+
+struct Baz { baz: i32 }
+
+const BAZ_PASS_PRE_POST: Baz = Baz { baz: 100 };
+#[cfg(any(unchk_fail_post, chk_fail_post))]
+const BAZ_FAIL_POST: Baz = Baz { baz: 10 };
+#[cfg(any(unchk_fail_pre, chk_fail_pre))]
+const BAZ_FAIL_PRE: Baz = Baz { baz: -10 };
+
+fn main() {
+    assert_eq!(nest(BAZ_PASS_PRE_POST), 150);
+    #[cfg(any(unchk_fail_pre, chk_fail_pre))]
+    nest(BAZ_FAIL_PRE);
+    #[cfg(any(unchk_fail_post, chk_fail_post))]
+    nest(BAZ_FAIL_POST);
+}
diff --git a/tests/ui/contracts/internal_machinery/contract-ast-extensions-tail.rs b/tests/ui/contracts/internal_machinery/contract-ast-extensions-tail.rs
new file mode 100644
index 00000000000..07ec26f921b
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-ast-extensions-tail.rs
@@ -0,0 +1,42 @@
+//@ revisions: unchk_pass unchk_fail_pre unchk_fail_post chk_pass chk_fail_pre chk_fail_post
+//
+//@ [unchk_pass] run-pass
+//@ [unchk_fail_pre] run-pass
+//@ [unchk_fail_post] run-pass
+//@ [chk_pass] run-pass
+//
+//@ [chk_fail_pre] run-fail
+//@ [chk_fail_post] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_pre] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_post] compile-flags: -Zcontract-checks=no
+//
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_pre] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts_internals)]
+
+fn tail(x: Baz) -> i32
+    contract_requires(|| x.baz > 0)
+    contract_ensures(|ret| *ret > 100)
+{
+    x.baz + 50
+}
+
+struct Baz { baz: i32 }
+
+const BAZ_PASS_PRE_POST: Baz = Baz { baz: 100 };
+#[cfg(any(unchk_fail_post, chk_fail_post))]
+const BAZ_FAIL_POST: Baz = Baz { baz: 10 };
+#[cfg(any(unchk_fail_pre, chk_fail_pre))]
+const BAZ_FAIL_PRE: Baz = Baz { baz: -10 };
+
+fn main() {
+    assert_eq!(tail(BAZ_PASS_PRE_POST), 150);
+    #[cfg(any(unchk_fail_pre, chk_fail_pre))]
+    tail(BAZ_FAIL_PRE);
+    #[cfg(any(unchk_fail_post, chk_fail_post))]
+    tail(BAZ_FAIL_POST);
+}
diff --git a/tests/ui/contracts/internal_machinery/contract-intrinsics.rs b/tests/ui/contracts/internal_machinery/contract-intrinsics.rs
new file mode 100644
index 00000000000..ae692afd146
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-intrinsics.rs
@@ -0,0 +1,36 @@
+//@ revisions: default unchk_pass chk_pass chk_fail_ensures chk_fail_requires
+//
+//@ [default] run-pass
+//@ [unchk_pass] run-pass
+//@ [chk_pass] run-pass
+//@ [chk_fail_requires] run-fail
+//@ [chk_fail_ensures] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_requires] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_ensures] compile-flags: -Zcontract-checks=yes
+#![feature(cfg_contract_checks, contracts_internals, core_intrinsics)]
+
+fn main() {
+    #[cfg(any(default, unchk_pass))] // default: disabled
+    assert_eq!(core::intrinsics::contract_checks(), false);
+
+    #[cfg(chk_pass)] // explicitly enabled
+    assert_eq!(core::intrinsics::contract_checks(), true);
+
+    // always pass
+    core::intrinsics::contract_check_requires(|| true);
+
+    // fail if enabled
+    #[cfg(any(default, unchk_pass, chk_fail_requires))]
+    core::intrinsics::contract_check_requires(|| false);
+
+    let doubles_to_two = { let old = 2; move |ret| ret + ret == old };
+    // Always pass
+    core::intrinsics::contract_check_ensures(&1, doubles_to_two);
+
+    // Fail if enabled
+    #[cfg(any(default, unchk_pass, chk_fail_ensures))]
+    core::intrinsics::contract_check_ensures(&2, doubles_to_two);
+}
diff --git a/tests/ui/contracts/internal_machinery/contract-lang-items.chk_fail_post.stderr b/tests/ui/contracts/internal_machinery/contract-lang-items.chk_fail_post.stderr
new file mode 100644
index 00000000000..a60ce160265
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-lang-items.chk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-lang-items.rs:15:12
+   |
+LL | #![feature(contracts)] // to access core::contracts
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/internal_machinery/contract-lang-items.chk_pass.stderr b/tests/ui/contracts/internal_machinery/contract-lang-items.chk_pass.stderr
new file mode 100644
index 00000000000..a60ce160265
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-lang-items.chk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-lang-items.rs:15:12
+   |
+LL | #![feature(contracts)] // to access core::contracts
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/internal_machinery/contract-lang-items.rs b/tests/ui/contracts/internal_machinery/contract-lang-items.rs
new file mode 100644
index 00000000000..e91bbed294d
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-lang-items.rs
@@ -0,0 +1,39 @@
+//@ revisions: unchk_pass unchk_fail_post chk_pass chk_fail_post
+//
+//@ [unchk_pass] run-pass
+//@ [unchk_fail_post] run-pass
+//@ [chk_pass] run-pass
+//
+//@ [chk_fail_post] run-fail
+//
+//@ [unchk_pass] compile-flags: -Zcontract-checks=no
+//@ [unchk_fail_post] compile-flags: -Zcontract-checks=no
+//
+//@ [chk_pass] compile-flags: -Zcontract-checks=yes
+//@ [chk_fail_post] compile-flags: -Zcontract-checks=yes
+
+#![feature(contracts)] // to access core::contracts
+//~^ WARN the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes [incomplete_features]
+#![feature(contracts_internals)] // to access check_requires lang item
+
+fn foo(x: Baz) -> i32 {
+    let injected_checker = {
+        core::contracts::build_check_ensures(|ret| *ret > 100)
+    };
+
+    let ret = x.baz + 50;
+    injected_checker(ret)
+}
+
+struct Baz { baz: i32 }
+
+
+const BAZ_PASS_PRE_POST: Baz = Baz { baz: 100 };
+#[cfg(any(unchk_fail_post, chk_fail_post))]
+const BAZ_FAIL_POST: Baz = Baz { baz: 10 };
+
+fn main() {
+    assert_eq!(foo(BAZ_PASS_PRE_POST), 150);
+    #[cfg(any(unchk_fail_post, chk_fail_post))]
+    foo(BAZ_FAIL_POST);
+}
diff --git a/tests/ui/contracts/internal_machinery/contract-lang-items.unchk_fail_post.stderr b/tests/ui/contracts/internal_machinery/contract-lang-items.unchk_fail_post.stderr
new file mode 100644
index 00000000000..a60ce160265
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-lang-items.unchk_fail_post.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-lang-items.rs:15:12
+   |
+LL | #![feature(contracts)] // to access core::contracts
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/internal_machinery/contract-lang-items.unchk_pass.stderr b/tests/ui/contracts/internal_machinery/contract-lang-items.unchk_pass.stderr
new file mode 100644
index 00000000000..a60ce160265
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contract-lang-items.unchk_pass.stderr
@@ -0,0 +1,11 @@
+warning: the feature `contracts` is incomplete and may not be safe to use and/or cause compiler crashes
+  --> $DIR/contract-lang-items.rs:15:12
+   |
+LL | #![feature(contracts)] // to access core::contracts
+   |            ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = note: `#[warn(incomplete_features)]` on by default
+
+warning: 1 warning emitted
+
diff --git a/tests/ui/contracts/internal_machinery/contracts-lowering-ensures-is-not-inherited-when-nesting.rs b/tests/ui/contracts/internal_machinery/contracts-lowering-ensures-is-not-inherited-when-nesting.rs
new file mode 100644
index 00000000000..960ccaed358
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contracts-lowering-ensures-is-not-inherited-when-nesting.rs
@@ -0,0 +1,15 @@
+//@ run-pass
+//@ compile-flags: -Zcontract-checks=yes
+#![feature(contracts_internals)]
+
+fn outer() -> i32
+    contract_ensures(|ret| *ret > 0)
+{
+    let inner_closure = || -> i32 { 0 };
+    inner_closure();
+    10
+}
+
+fn main() {
+    outer();
+}
diff --git a/tests/ui/contracts/internal_machinery/contracts-lowering-requires-is-not-inherited-when-nesting.rs b/tests/ui/contracts/internal_machinery/contracts-lowering-requires-is-not-inherited-when-nesting.rs
new file mode 100644
index 00000000000..bee703de16a
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/contracts-lowering-requires-is-not-inherited-when-nesting.rs
@@ -0,0 +1,17 @@
+//@ run-pass
+//@ compile-flags: -Zcontract-checks=yes
+#![feature(contracts_internals)]
+
+struct Outer { outer: std::cell::Cell<i32> }
+
+fn outer(x: Outer)
+    contract_requires(|| x.outer.get() > 0)
+{
+    let inner_closure = || { };
+    x.outer.set(0);
+    inner_closure();
+}
+
+fn main() {
+    outer(Outer { outer: 1.into() });
+}
diff --git a/tests/ui/contracts/internal_machinery/internal-feature-gating.rs b/tests/ui/contracts/internal_machinery/internal-feature-gating.rs
new file mode 100644
index 00000000000..1b76eef6780
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/internal-feature-gating.rs
@@ -0,0 +1,20 @@
+// gate-test-contracts_internals
+
+fn main() {
+    // intrinsics are guarded by contracts_internals feature gate.
+    core::intrinsics::contract_checks();
+    //~^ ERROR use of unstable library feature `contracts_internals`
+    core::intrinsics::contract_check_requires(|| true);
+    //~^ ERROR use of unstable library feature `contracts_internals`
+    core::intrinsics::contract_check_ensures(&1, |_|true);
+    //~^ ERROR use of unstable library feature `contracts_internals`
+
+    core::contracts::build_check_ensures(|_: &()| true);
+    //~^ ERROR use of unstable library feature `contracts_internals`
+
+    // ast extensions are guarded by contracts_internals feature gate
+    fn identity_1() -> i32 contract_requires(|| true) { 10 }
+    //~^ ERROR contract internal machinery is for internal use only
+    fn identity_2() -> i32 contract_ensures(|_| true) { 10 }
+    //~^ ERROR contract internal machinery is for internal use only
+}
diff --git a/tests/ui/contracts/internal_machinery/internal-feature-gating.stderr b/tests/ui/contracts/internal_machinery/internal-feature-gating.stderr
new file mode 100644
index 00000000000..c0e1522f54c
--- /dev/null
+++ b/tests/ui/contracts/internal_machinery/internal-feature-gating.stderr
@@ -0,0 +1,63 @@
+error[E0658]: contract internal machinery is for internal use only
+  --> $DIR/internal-feature-gating.rs:16:45
+   |
+LL |     fn identity_1() -> i32 contract_requires(|| true) { 10 }
+   |                                             ^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts_internals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: contract internal machinery is for internal use only
+  --> $DIR/internal-feature-gating.rs:18:44
+   |
+LL |     fn identity_2() -> i32 contract_ensures(|_| true) { 10 }
+   |                                            ^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts_internals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: use of unstable library feature `contracts_internals`
+  --> $DIR/internal-feature-gating.rs:5:5
+   |
+LL |     core::intrinsics::contract_checks();
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts_internals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: use of unstable library feature `contracts_internals`
+  --> $DIR/internal-feature-gating.rs:7:5
+   |
+LL |     core::intrinsics::contract_check_requires(|| true);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts_internals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: use of unstable library feature `contracts_internals`
+  --> $DIR/internal-feature-gating.rs:9:5
+   |
+LL |     core::intrinsics::contract_check_ensures(&1, |_|true);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts_internals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: use of unstable library feature `contracts_internals`
+  --> $DIR/internal-feature-gating.rs:12:5
+   |
+LL |     core::contracts::build_check_ensures(|_: &()| true);
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts_internals)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error: aborting due to 6 previous errors
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/crate-loading/crateresolve1.rs b/tests/ui/crate-loading/crateresolve1.rs
index 9200b6a6231..91c34c82558 100644
--- a/tests/ui/crate-loading/crateresolve1.rs
+++ b/tests/ui/crate-loading/crateresolve1.rs
@@ -2,11 +2,11 @@
 //@ aux-build:crateresolve1-2.rs
 //@ aux-build:crateresolve1-3.rs
 
-//@ normalize-stderr: "\.nll/" -> "/"
+//@ normalize-stderr: "crateresolve1\..+/auxiliary/" -> "crateresolve1/auxiliary/"
 //@ normalize-stderr: "\\\?\\" -> ""
 //@ normalize-stderr: "(lib)?crateresolve1-([123])\.[a-z]+" -> "libcrateresolve1-$2.somelib"
 
-// NOTE: This test is duplicated at `tests/ui/error-codes/E0464.rs`.
+// NOTE: This test is duplicated at `tests/ui/error-codes/E0464.rs` and `E0523.rs`.
 
 extern crate crateresolve1;
 //~^ ERROR multiple candidates for `rlib` dependency `crateresolve1` found
diff --git a/tests/ui/crate-loading/crateresolve2.rs b/tests/ui/crate-loading/crateresolve2.rs
index bec692eb8d2..6446740a321 100644
--- a/tests/ui/crate-loading/crateresolve2.rs
+++ b/tests/ui/crate-loading/crateresolve2.rs
@@ -4,7 +4,7 @@
 //@ aux-build:crateresolve2-2.rs
 //@ aux-build:crateresolve2-3.rs
 
-//@ normalize-stderr: "\.nll/" -> "/"
+//@ normalize-stderr: "crateresolve2\..+/auxiliary/" -> "crateresolve2/auxiliary/"
 //@ normalize-stderr: "\\\?\\" -> ""
 
 extern crate crateresolve2;
diff --git a/tests/ui/diagnostic-width/E0271.ascii.stderr b/tests/ui/diagnostic-width/E0271.ascii.stderr
index 93555b336a6..9a9c12a938f 100644
--- a/tests/ui/diagnostic-width/E0271.ascii.stderr
+++ b/tests/ui/diagnostic-width/E0271.ascii.stderr
@@ -15,7 +15,7 @@ note: expected this to be `Foo`
 LL |     type Error = E;
    |                  ^
    = note: required for the cast from `Box<Result<..., ()>>` to `Box<...>`
-   = note: the full name for the type has been written to '$TEST_BUILD_DIR/diagnostic-width/E0271.ascii/E0271.long-type-hash.txt'
+   = note: the full name for the type has been written to '$TEST_BUILD_DIR/$FILE.long-type-hash.txt'
    = note: consider using `--verbose` to print the full type name to the console
 
 error: aborting due to 1 previous error
diff --git a/tests/ui/diagnostic-width/E0271.rs b/tests/ui/diagnostic-width/E0271.rs
index 2faf09d46c6..06187721041 100644
--- a/tests/ui/diagnostic-width/E0271.rs
+++ b/tests/ui/diagnostic-width/E0271.rs
@@ -1,7 +1,7 @@
 //@ revisions: ascii unicode
 //@[ascii] compile-flags: --diagnostic-width=40 -Zwrite-long-types-to-disk=yes
 //@[unicode] compile-flags: -Zunstable-options --error-format=human-unicode --diagnostic-width=40 -Zwrite-long-types-to-disk=yes
-//@ normalize-stderr: "long-type-\d+" -> "long-type-hash"
+//@ normalize-stderr: "'\$TEST_BUILD_DIR/.*\.long-type-\d+.txt'" -> "'$$TEST_BUILD_DIR/$$FILE.long-type-hash.txt'"
 trait Future {
     type Error;
 }
diff --git a/tests/ui/diagnostic-width/E0271.unicode.stderr b/tests/ui/diagnostic-width/E0271.unicode.stderr
index 1e9acf603b2..9c3deae6660 100644
--- a/tests/ui/diagnostic-width/E0271.unicode.stderr
+++ b/tests/ui/diagnostic-width/E0271.unicode.stderr
@@ -15,7 +15,7 @@ note: expected this to be `Foo`
 LL │     type Error = E;
    │                  ━
    ├ note: required for the cast from `Box<Result<..., ()>>` to `Box<...>`
-   ├ note: the full name for the type has been written to '$TEST_BUILD_DIR/diagnostic-width/E0271.unicode/E0271.long-type-hash.txt'
+   ├ note: the full name for the type has been written to '$TEST_BUILD_DIR/$FILE.long-type-hash.txt'
    ╰ note: consider using `--verbose` to print the full type name to the console
 
 error: aborting due to 1 previous error
diff --git a/tests/ui/editions/auxiliary/nested_macro_rules_dep_2021.rs b/tests/ui/editions/auxiliary/nested_macro_rules_dep_2021.rs
new file mode 100644
index 00000000000..36d3e712dc0
--- /dev/null
+++ b/tests/ui/editions/auxiliary/nested_macro_rules_dep_2021.rs
@@ -0,0 +1,23 @@
+//@ edition: 2021
+
+#[macro_export]
+macro_rules! make_macro_with_input {
+    ($i:ident) => {
+        macro_rules! macro_inner_input {
+            () => {
+                pub fn $i() {}
+            };
+        }
+    };
+}
+
+#[macro_export]
+macro_rules! make_macro {
+    () => {
+        macro_rules! macro_inner {
+            () => {
+                pub fn gen() {}
+            };
+        }
+    };
+}
diff --git a/tests/ui/editions/auxiliary/nested_macro_rules_dep_2024.rs b/tests/ui/editions/auxiliary/nested_macro_rules_dep_2024.rs
new file mode 100644
index 00000000000..4012398fe66
--- /dev/null
+++ b/tests/ui/editions/auxiliary/nested_macro_rules_dep_2024.rs
@@ -0,0 +1,23 @@
+//@ edition: 2024
+
+#[macro_export]
+macro_rules! make_macro_with_input {
+    ($i:ident) => {
+        macro_rules! macro_inner_input {
+            () => {
+                pub fn $i() {}
+            };
+        }
+    };
+}
+
+#[macro_export]
+macro_rules! make_macro {
+    () => {
+        macro_rules! macro_inner {
+            () => {
+                pub fn gen() {}
+            };
+        }
+    };
+}
diff --git a/tests/ui/editions/nested-macro-rules-edition.e2021.stderr b/tests/ui/editions/nested-macro-rules-edition.e2021.stderr
new file mode 100644
index 00000000000..eac80262364
--- /dev/null
+++ b/tests/ui/editions/nested-macro-rules-edition.e2021.stderr
@@ -0,0 +1,27 @@
+error: expected identifier, found reserved keyword `gen`
+  --> $DIR/nested-macro-rules-edition.rs:30:5
+   |
+LL |     macro_inner_input!{}
+   |     ^^^^^^^^^^^^^^^^^^^^ expected identifier, found reserved keyword
+   |
+   = note: this error originates in the macro `macro_inner_input` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: escape `gen` to use it as an identifier
+   |
+LL |     nested_macro_rules_dep::make_macro_with_input!{r#gen}
+   |                                                    ++
+
+error: expected identifier, found reserved keyword `gen`
+  --> $DIR/nested-macro-rules-edition.rs:35:5
+   |
+LL |     macro_inner!{}
+   |     ^^^^^^^^^^^^^^ expected identifier, found reserved keyword
+   |
+   = note: this error originates in the macro `macro_inner` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: escape `gen` to use it as an identifier
+  --> $DIR/auxiliary/nested_macro_rules_dep_2024.rs:19:24
+   |
+LL |                 pub fn r#gen() {}
+   |                        ++
+
+error: aborting due to 2 previous errors
+
diff --git a/tests/ui/editions/nested-macro-rules-edition.rs b/tests/ui/editions/nested-macro-rules-edition.rs
new file mode 100644
index 00000000000..28d568f7750
--- /dev/null
+++ b/tests/ui/editions/nested-macro-rules-edition.rs
@@ -0,0 +1,39 @@
+// This checks the behavior of how nested macro_rules definitions are handled
+// with regards to edition spans. Prior to https://github.com/rust-lang/rust/pull/133274,
+// the compiler would compile the inner macro with the edition of the local crate.
+// Afterwards, it uses the edition where the macro was *defined*.
+//
+// Unfortunately macro_rules compiler discards the edition of any *input* that
+// was used to generate the macro. This is possibly not the behavior that we
+// want. If we want to keep with the philosophy that code should follow the
+// edition rules of the crate where it is written, then presumably we would
+// want the input tokens to retain the edition of where they were written.
+//
+// See https://github.com/rust-lang/rust/issues/135669 for more.
+//
+// This has two revisions, one where local=2021 and the dep=2024. The other
+// revision is vice-versa.
+
+//@ revisions: e2021 e2024
+//@[e2021] edition:2021
+//@[e2024] edition:2024
+//@[e2021] aux-crate: nested_macro_rules_dep=nested_macro_rules_dep_2024.rs
+//@[e2024] aux-crate: nested_macro_rules_dep=nested_macro_rules_dep_2021.rs
+//@[e2024] check-pass
+
+mod with_input {
+    // If we change the macro_rules input behavior, then this should pass when
+    // local edition is 2021 because `gen` is written in a context with 2021
+    // behavior. For local edition 2024, the reverse would be true and this
+    // should fail.
+    nested_macro_rules_dep::make_macro_with_input!{gen}
+    macro_inner_input!{}
+    //[e2021]~^ ERROR found reserved keyword
+}
+mod no_input {
+    nested_macro_rules_dep::make_macro!{}
+    macro_inner!{}
+    //[e2021]~^ ERROR found reserved keyword
+}
+
+fn main() {}
diff --git a/tests/ui/issues/issue-48838.rs b/tests/ui/enum/closure-in-enum-issue-48838.rs
index 057a424dfef..057a424dfef 100644
--- a/tests/ui/issues/issue-48838.rs
+++ b/tests/ui/enum/closure-in-enum-issue-48838.rs
diff --git a/tests/ui/issues/issue-48838.stderr b/tests/ui/enum/closure-in-enum-issue-48838.stderr
index 504ea3e8010..17e6c343334 100644
--- a/tests/ui/issues/issue-48838.stderr
+++ b/tests/ui/enum/closure-in-enum-issue-48838.stderr
@@ -1,11 +1,11 @@
 error[E0308]: mismatched types
-  --> $DIR/issue-48838.rs:2:14
+  --> $DIR/closure-in-enum-issue-48838.rs:2:14
    |
 LL |     Square = |x| x,
    |              ^^^^^ expected `isize`, found closure
    |
    = note: expected type `isize`
-           found closure `{closure@$DIR/issue-48838.rs:2:14: 2:17}`
+           found closure `{closure@$DIR/closure-in-enum-issue-48838.rs:2:14: 2:17}`
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/issues/issue-40350.rs b/tests/ui/enum/enum-inside-enum-issue-40350.rs
index 50d74f27b63..50d74f27b63 100644
--- a/tests/ui/issues/issue-40350.rs
+++ b/tests/ui/enum/enum-inside-enum-issue-40350.rs
diff --git a/tests/ui/error-codes/E0462.rs b/tests/ui/error-codes/E0462.rs
index 12214331445..45d35c345cb 100644
--- a/tests/ui/error-codes/E0462.rs
+++ b/tests/ui/error-codes/E0462.rs
@@ -1,6 +1,6 @@
 //@ aux-build:found-staticlib.rs
 
-//@ normalize-stderr: "\.nll/" -> "/"
+//@ normalize-stderr: "E0462\..+/auxiliary/" -> "E0462/auxiliary/"
 //@ normalize-stderr: "\\\?\\" -> ""
 //@ normalize-stderr: "(lib)?found_staticlib\.[a-z]+" -> "libfound_staticlib.somelib"
 
diff --git a/tests/ui/error-codes/E0464.rs b/tests/ui/error-codes/E0464.rs
index aaf4d3a8f50..d1303ae91b1 100644
--- a/tests/ui/error-codes/E0464.rs
+++ b/tests/ui/error-codes/E0464.rs
@@ -2,7 +2,7 @@
 //@ aux-build:crateresolve1-2.rs
 //@ aux-build:crateresolve1-3.rs
 
-//@ normalize-stderr: "\.nll/" -> "/"
+//@ normalize-stderr: "E0464\..+/auxiliary/" -> "E0464/auxiliary/"
 //@ normalize-stderr: "\\\?\\" -> ""
 //@ normalize-stderr: "(lib)?crateresolve1-([123])\.[a-z]+" -> "libcrateresolve1-$2.somelib"
 
diff --git a/tests/ui/error-codes/E0523.rs b/tests/ui/error-codes/E0523.rs
index aaf4d3a8f50..7c1869c055b 100644
--- a/tests/ui/error-codes/E0523.rs
+++ b/tests/ui/error-codes/E0523.rs
@@ -2,7 +2,7 @@
 //@ aux-build:crateresolve1-2.rs
 //@ aux-build:crateresolve1-3.rs
 
-//@ normalize-stderr: "\.nll/" -> "/"
+//@ normalize-stderr: "E0523\..+/auxiliary/" -> "E0523/auxiliary/"
 //@ normalize-stderr: "\\\?\\" -> ""
 //@ normalize-stderr: "(lib)?crateresolve1-([123])\.[a-z]+" -> "libcrateresolve1-$2.somelib"
 
diff --git a/tests/ui/error-codes/E0746.stderr b/tests/ui/error-codes/E0746.stderr
index ce3e9736969..ec785561415 100644
--- a/tests/ui/error-codes/E0746.stderr
+++ b/tests/ui/error-codes/E0746.stderr
@@ -1,4 +1,4 @@
-error[E0746]: return type cannot have an unboxed trait object
+error[E0746]: return type cannot be a trait object without pointer indirection
   --> $DIR/E0746.rs:8:13
    |
 LL | fn foo() -> dyn Trait { Struct }
@@ -13,7 +13,7 @@ help: alternatively, box the return type, and wrap all of the returned values in
 LL | fn foo() -> Box<dyn Trait> { Box::new(Struct) }
    |             ++++         +   +++++++++      +
 
-error[E0746]: return type cannot have an unboxed trait object
+error[E0746]: return type cannot be a trait object without pointer indirection
   --> $DIR/E0746.rs:11:13
    |
 LL | fn bar() -> dyn Trait {
diff --git a/tests/ui/issues/issue-41272.rs b/tests/ui/expr/if/if-let-no-match-guards-issue-41272.rs
index 255bbfe90a1..255bbfe90a1 100644
--- a/tests/ui/issues/issue-41272.rs
+++ b/tests/ui/expr/if/if-let-no-match-guards-issue-41272.rs
diff --git a/tests/ui/extern-flag/empty-extern-arg.stderr b/tests/ui/extern-flag/empty-extern-arg.stderr
index 2785b12a0ae..b9a128e02e1 100644
--- a/tests/ui/extern-flag/empty-extern-arg.stderr
+++ b/tests/ui/extern-flag/empty-extern-arg.stderr
@@ -8,6 +8,10 @@ error: unwinding panics are not supported without std
    = note: since the core library is usually precompiled with panic="unwind", rebuilding your crate with panic="abort" may not be enough to fix the problem
 
 error: requires `sized` lang_item
+  --> $DIR/empty-extern-arg.rs:6:11
+   |
+LL | fn main() {}
+   |           ^^
 
 error: aborting due to 4 previous errors
 
diff --git a/tests/ui/feature-gates/feature-gate-cfg-contract-checks.rs b/tests/ui/feature-gates/feature-gate-cfg-contract-checks.rs
new file mode 100644
index 00000000000..cd9bf12b5e7
--- /dev/null
+++ b/tests/ui/feature-gates/feature-gate-cfg-contract-checks.rs
@@ -0,0 +1,5 @@
+#![crate_type = "lib"]
+
+pub fn contract_checks_are_enabled() -> bool {
+    cfg!(contract_checks) //~ ERROR `cfg(contract_checks)` is experimental
+}
diff --git a/tests/ui/feature-gates/feature-gate-cfg-contract-checks.stderr b/tests/ui/feature-gates/feature-gate-cfg-contract-checks.stderr
new file mode 100644
index 00000000000..89c6d077f97
--- /dev/null
+++ b/tests/ui/feature-gates/feature-gate-cfg-contract-checks.stderr
@@ -0,0 +1,13 @@
+error[E0658]: `cfg(contract_checks)` is experimental and subject to change
+  --> $DIR/feature-gate-cfg-contract-checks.rs:4:10
+   |
+LL |     cfg!(contract_checks)
+   |          ^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(cfg_contract_checks)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/feature-gates/feature-gate-contracts.rs b/tests/ui/feature-gates/feature-gate-contracts.rs
new file mode 100644
index 00000000000..5544f1d82ee
--- /dev/null
+++ b/tests/ui/feature-gates/feature-gate-contracts.rs
@@ -0,0 +1,11 @@
+#![crate_type = "lib"]
+
+#[core::contracts::requires(x > 0)]
+pub fn requires_needs_it(x: i32) { }
+//~^^  ERROR use of unstable library feature `contracts`
+//~^^^ ERROR contracts are incomplete
+
+#[core::contracts::ensures(|ret| *ret > 0)]
+pub fn ensures_needs_it() -> i32 { 10 }
+//~^^  ERROR use of unstable library feature `contracts`
+//~^^^ ERROR contracts are incomplete
diff --git a/tests/ui/feature-gates/feature-gate-contracts.stderr b/tests/ui/feature-gates/feature-gate-contracts.stderr
new file mode 100644
index 00000000000..4403e7df50b
--- /dev/null
+++ b/tests/ui/feature-gates/feature-gate-contracts.stderr
@@ -0,0 +1,43 @@
+error[E0658]: use of unstable library feature `contracts`
+  --> $DIR/feature-gate-contracts.rs:3:3
+   |
+LL | #[core::contracts::requires(x > 0)]
+   |   ^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: use of unstable library feature `contracts`
+  --> $DIR/feature-gate-contracts.rs:8:3
+   |
+LL | #[core::contracts::ensures(|ret| *ret > 0)]
+   |   ^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: contracts are incomplete
+  --> $DIR/feature-gate-contracts.rs:3:1
+   |
+LL | #[core::contracts::requires(x > 0)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error[E0658]: contracts are incomplete
+  --> $DIR/feature-gate-contracts.rs:8:1
+   |
+LL | #[core::contracts::ensures(|ret| *ret > 0)]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: see issue #128044 <https://github.com/rust-lang/rust/issues/128044> for more information
+   = help: add `#![feature(contracts)]` to the crate attributes to enable
+   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+
+error: aborting due to 4 previous errors
+
+For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/fn/error-recovery-mismatch.rs b/tests/ui/fn/error-recovery-mismatch.rs
new file mode 100644
index 00000000000..a50a30c8c78
--- /dev/null
+++ b/tests/ui/fn/error-recovery-mismatch.rs
@@ -0,0 +1,20 @@
+// Used to ICE due to a size mismatch between the actual fake signature of `fold` and the
+// generated signature used reporting the parameter mismatch at the call site.
+// See issue #135124
+
+trait A  {
+    fn y(&self)
+    {
+        fn call() -> impl Sized {}
+        self.fold(call(), call());
+    }
+    fn fold<T>(&self, _: T, &self._) {}
+    //~^ ERROR unexpected `self` parameter in function
+    //~| ERROR expected one of `)` or `,`, found `.`
+    //~| ERROR identifier `self` is bound more than once in this parameter list
+    //~| WARNING anonymous parameters are deprecated
+    //~| WARNING this is accepted in the current edition
+    //~| ERROR the placeholder `_` is not allowed within types
+}
+
+fn main() {}
diff --git a/tests/ui/fn/error-recovery-mismatch.stderr b/tests/ui/fn/error-recovery-mismatch.stderr
new file mode 100644
index 00000000000..ad4652c11c1
--- /dev/null
+++ b/tests/ui/fn/error-recovery-mismatch.stderr
@@ -0,0 +1,46 @@
+error: unexpected `self` parameter in function
+  --> $DIR/error-recovery-mismatch.rs:11:29
+   |
+LL |     fn fold<T>(&self, _: T, &self._) {}
+   |                             ^^^^^ must be the first parameter of an associated function
+
+error: expected one of `)` or `,`, found `.`
+  --> $DIR/error-recovery-mismatch.rs:11:34
+   |
+LL |     fn fold<T>(&self, _: T, &self._) {}
+   |                                  ^
+   |                                  |
+   |                                  expected one of `)` or `,`
+   |                                  help: missing `,`
+
+error[E0415]: identifier `self` is bound more than once in this parameter list
+  --> $DIR/error-recovery-mismatch.rs:11:30
+   |
+LL |     fn fold<T>(&self, _: T, &self._) {}
+   |                              ^^^^ used as parameter more than once
+
+warning: anonymous parameters are deprecated and will be removed in the next edition
+  --> $DIR/error-recovery-mismatch.rs:11:35
+   |
+LL |     fn fold<T>(&self, _: T, &self._) {}
+   |                                   ^ help: try naming the parameter or explicitly ignoring it: `_: _`
+   |
+   = warning: this is accepted in the current edition (Rust 2015) but is a hard error in Rust 2018!
+   = note: for more information, see issue #41686 <https://github.com/rust-lang/rust/issues/41686>
+   = note: `#[warn(anonymous_parameters)]` on by default
+
+error[E0121]: the placeholder `_` is not allowed within types on item signatures for functions
+  --> $DIR/error-recovery-mismatch.rs:11:35
+   |
+LL |     fn fold<T>(&self, _: T, &self._) {}
+   |                                   ^ not allowed in type signatures
+   |
+help: use type parameters instead
+   |
+LL |     fn fold<T, U>(&self, _: T, &self.U) {}
+   |              +++                     ~
+
+error: aborting due to 4 previous errors; 1 warning emitted
+
+Some errors have detailed explanations: E0121, E0415.
+For more information about an error, try `rustc --explain E0121`.
diff --git a/tests/ui/fn/param-mismatch-trait-fn.rs b/tests/ui/fn/param-mismatch-trait-fn.rs
new file mode 100644
index 00000000000..69ded6a9068
--- /dev/null
+++ b/tests/ui/fn/param-mismatch-trait-fn.rs
@@ -0,0 +1,10 @@
+trait Foo {
+    fn same_type<T>(_: T, _: T);
+}
+
+fn f<T: Foo, X, Y>(x: X, y: Y) {
+    T::same_type([x], Some(y));
+    //~^ ERROR mismatched types
+}
+
+fn main() {}
diff --git a/tests/ui/fn/param-mismatch-trait-fn.stderr b/tests/ui/fn/param-mismatch-trait-fn.stderr
new file mode 100644
index 00000000000..28e1bcaaf49
--- /dev/null
+++ b/tests/ui/fn/param-mismatch-trait-fn.stderr
@@ -0,0 +1,23 @@
+error[E0308]: mismatched types
+  --> $DIR/param-mismatch-trait-fn.rs:6:23
+   |
+LL |     T::same_type([x], Some(y));
+   |     ------------ ---  ^^^^^^^ expected `[X; 1]`, found `Option<Y>`
+   |     |            |
+   |     |            expected all arguments to be this `[X; 1]` type because they need to match the type of this parameter
+   |     arguments to this function are incorrect
+   |
+   = note: expected array `[X; 1]`
+               found enum `Option<Y>`
+note: associated function defined here
+  --> $DIR/param-mismatch-trait-fn.rs:2:8
+   |
+LL |     fn same_type<T>(_: T, _: T);
+   |        ^^^^^^^^^ -  -     - this parameter needs to match the `[X; 1]` type of parameter #1
+   |                  |  |
+   |                  |  parameter #2 needs to match the `[X; 1]` type of this parameter
+   |                  parameter #1 and parameter #2 both reference this parameter `T`
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.rs b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.rs
index 046ced072ba..901d4b39cf3 100644
--- a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.rs
+++ b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.rs
@@ -20,7 +20,7 @@ impl DynIncompatible for B {
 }
 
 fn car() -> dyn DynIncompatible { //~ ERROR the trait `DynIncompatible` is not dyn compatible
-//~^ ERROR return type cannot have an unboxed trait object
+//~^ ERROR return type cannot be a trait object without pointer indirection
     if true {
         return A;
     }
diff --git a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.stderr b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.stderr
index 2869702d7fc..c2fd11fe23d 100644
--- a/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.stderr
+++ b/tests/ui/impl-trait/dyn-incompatible-trait-in-return-position-dyn-trait.stderr
@@ -26,6 +26,26 @@ help: alternatively, consider constraining `foo` so it does not apply to trait o
 LL |     fn foo() -> Self where Self: Sized;
    |                      +++++++++++++++++
 
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-incompatible-trait-in-return-position-dyn-trait.rs:22:13
+   |
+LL | fn car() -> dyn DynIncompatible {
+   |             ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn car() -> impl DynIncompatible {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+   |
+LL ~ fn car() -> Box<dyn DynIncompatible> {
+LL |
+LL |     if true {
+LL ~         return Box::new(A);
+LL |     }
+LL ~     Box::new(B)
+   |
+
 error[E0038]: the trait `DynIncompatible` is not dyn compatible
   --> $DIR/dyn-incompatible-trait-in-return-position-dyn-trait.rs:30:17
    |
@@ -54,23 +74,6 @@ help: alternatively, consider constraining `foo` so it does not apply to trait o
 LL |     fn foo() -> Self where Self: Sized;
    |                      +++++++++++++++++
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-incompatible-trait-in-return-position-dyn-trait.rs:22:13
-   |
-LL | fn car() -> dyn DynIncompatible {
-   |             ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: if there were a single returned type, you could use `impl Trait` instead
-help: box the return type, and wrap all of the returned values in `Box::new`
-   |
-LL ~ fn car() -> Box<dyn DynIncompatible> {
-LL |
-LL |     if true {
-LL ~         return Box::new(A);
-LL |     }
-LL ~     Box::new(B)
-   |
-
 error[E0038]: the trait `DynIncompatible` is not dyn compatible
   --> $DIR/dyn-incompatible-trait-in-return-position-dyn-trait.rs:32:16
    |
diff --git a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs
index af368203de0..ccf0a1ad3d4 100644
--- a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs
+++ b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.rs
@@ -6,9 +6,11 @@ impl Trait for u32 {}
 
 fn fuz() -> (usize, Trait) { (42, Struct) }
 //~^ ERROR E0277
+//~| ERROR E0277
 //~| ERROR E0308
 fn bar() -> (usize, dyn Trait) { (42, Struct) }
 //~^ ERROR E0277
+//~| ERROR E0277
 //~| ERROR E0308
 fn bap() -> Trait { Struct }
 //~^ ERROR E0746
diff --git a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr
index 9ed3d21c13c..11491a55738 100644
--- a/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr
+++ b/tests/ui/impl-trait/dyn-trait-return-should-be-impl-trait.stderr
@@ -1,49 +1,25 @@
-error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:35
-   |
-LL | fn fuz() -> (usize, Trait) { (42, Struct) }
-   |                                   ^^^^^^ expected `dyn Trait`, found `Struct`
-   |
-   = note: expected trait object `(dyn Trait + 'static)`
-                    found struct `Struct`
-   = help: `Struct` implements `Trait` so you could box the found value and coerce it to the trait object `Box<dyn Trait>`, you will have to change the expected type as well
-
 error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time
   --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:13
    |
 LL | fn fuz() -> (usize, Trait) { (42, Struct) }
-   |             ^^^^^^^^^^^^^^   ------------ this returned value is of type `(usize, (dyn Trait + 'static))`
-   |             |
-   |             doesn't have a size known at compile-time
+   |             ^^^^^^^^^^^^^^ doesn't have a size known at compile-time
    |
    = help: within `(usize, (dyn Trait + 'static))`, the trait `Sized` is not implemented for `(dyn Trait + 'static)`
    = note: required because it appears within the type `(usize, (dyn Trait + 'static))`
    = note: the return type of a function must have a statically known size
 
-error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:10:39
-   |
-LL | fn bar() -> (usize, dyn Trait) { (42, Struct) }
-   |                                       ^^^^^^ expected `dyn Trait`, found `Struct`
-   |
-   = note: expected trait object `(dyn Trait + 'static)`
-                    found struct `Struct`
-   = help: `Struct` implements `Trait` so you could box the found value and coerce it to the trait object `Box<dyn Trait>`, you will have to change the expected type as well
-
 error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:10:13
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:11:13
    |
 LL | fn bar() -> (usize, dyn Trait) { (42, Struct) }
-   |             ^^^^^^^^^^^^^^^^^^   ------------ this returned value is of type `(usize, (dyn Trait + 'static))`
-   |             |
-   |             doesn't have a size known at compile-time
+   |             ^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
    |
    = help: within `(usize, (dyn Trait + 'static))`, the trait `Sized` is not implemented for `(dyn Trait + 'static)`
    = note: required because it appears within the type `(usize, (dyn Trait + 'static))`
    = note: the return type of a function must have a statically known size
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:13:13
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:15:13
    |
 LL | fn bap() -> Trait { Struct }
    |             ^^^^^ doesn't have a size known at compile-time
@@ -57,8 +33,8 @@ help: alternatively, box the return type, and wrap all of the returned values in
 LL | fn bap() -> Box<dyn Trait> { Box::new(Struct) }
    |             +++++++      +   +++++++++      +
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:15:13
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:17:13
    |
 LL | fn ban() -> dyn Trait { Struct }
    |             ^^^^^^^^^ doesn't have a size known at compile-time
@@ -72,8 +48,8 @@ help: alternatively, box the return type, and wrap all of the returned values in
 LL | fn ban() -> Box<dyn Trait> { Box::new(Struct) }
    |             ++++         +   +++++++++      +
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:17:13
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:19:13
    |
 LL | fn bak() -> dyn Trait { unimplemented!() }
    |             ^^^^^^^^^ doesn't have a size known at compile-time
@@ -87,14 +63,17 @@ help: alternatively, box the return type, and wrap all of the returned values in
 LL | fn bak() -> Box<dyn Trait> { Box::new(unimplemented!()) }
    |             ++++         +   +++++++++                +
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:19:13
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:21:13
    |
 LL | fn bal() -> dyn Trait {
    |             ^^^^^^^^^ doesn't have a size known at compile-time
    |
-   = help: if there were a single returned type, you could use `impl Trait` instead
-help: box the return type, and wrap all of the returned values in `Box::new`
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn bal() -> impl Trait {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
    |
 LL ~ fn bal() -> Box<dyn Trait> {
 LL |     if true {
@@ -103,14 +82,17 @@ LL |     }
 LL ~     Box::new(42)
    |
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:25:13
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:27:13
    |
 LL | fn bax() -> dyn Trait {
    |             ^^^^^^^^^ doesn't have a size known at compile-time
    |
-   = help: if there were a single returned type, you could use `impl Trait` instead
-help: box the return type, and wrap all of the returned values in `Box::new`
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn bax() -> impl Trait {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
    |
 LL ~ fn bax() -> Box<dyn Trait> {
 LL |     if true {
@@ -119,8 +101,86 @@ LL |     } else {
 LL ~         Box::new(42)
    |
 
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:62:13
+   |
+LL | fn bat() -> dyn Trait {
+   |             ^^^^^^^^^ doesn't have a size known at compile-time
+   |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn bat() -> impl Trait {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+   |
+LL ~ fn bat() -> Box<dyn Trait> {
+LL |     if true {
+LL ~         return Box::new(0);
+LL |     }
+LL ~     Box::new(42)
+   |
+
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:68:13
+   |
+LL | fn bay() -> dyn Trait {
+   |             ^^^^^^^^^ doesn't have a size known at compile-time
+   |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn bay() -> impl Trait {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+   |
+LL ~ fn bay() -> Box<dyn Trait> {
+LL |     if true {
+LL ~         Box::new(0)
+LL |     } else {
+LL ~         Box::new(42)
+   |
+
+error[E0308]: mismatched types
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:35
+   |
+LL | fn fuz() -> (usize, Trait) { (42, Struct) }
+   |                                   ^^^^^^ expected `dyn Trait`, found `Struct`
+   |
+   = note: expected trait object `(dyn Trait + 'static)`
+                    found struct `Struct`
+   = help: `Struct` implements `Trait` so you could box the found value and coerce it to the trait object `Box<dyn Trait>`, you will have to change the expected type as well
+
+error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:7:30
+   |
+LL | fn fuz() -> (usize, Trait) { (42, Struct) }
+   |                              ^^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+   = help: within `(usize, (dyn Trait + 'static))`, the trait `Sized` is not implemented for `(dyn Trait + 'static)`
+   = note: required because it appears within the type `(usize, (dyn Trait + 'static))`
+   = note: tuples must have a statically known size to be initialized
+
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:34:16
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:11:39
+   |
+LL | fn bar() -> (usize, dyn Trait) { (42, Struct) }
+   |                                       ^^^^^^ expected `dyn Trait`, found `Struct`
+   |
+   = note: expected trait object `(dyn Trait + 'static)`
+                    found struct `Struct`
+   = help: `Struct` implements `Trait` so you could box the found value and coerce it to the trait object `Box<dyn Trait>`, you will have to change the expected type as well
+
+error[E0277]: the size for values of type `(dyn Trait + 'static)` cannot be known at compilation time
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:11:34
+   |
+LL | fn bar() -> (usize, dyn Trait) { (42, Struct) }
+   |                                  ^^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+   = help: within `(usize, (dyn Trait + 'static))`, the trait `Sized` is not implemented for `(dyn Trait + 'static)`
+   = note: required because it appears within the type `(usize, (dyn Trait + 'static))`
+   = note: tuples must have a statically known size to be initialized
+
+error[E0308]: mismatched types
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:36:16
    |
 LL | fn bam() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -137,7 +197,7 @@ LL |         return Box::new(Struct);
    |                +++++++++      +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:36:5
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:38:5
    |
 LL | fn bam() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -154,7 +214,7 @@ LL |     Box::new(42)
    |     +++++++++  +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:40:16
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:42:16
    |
 LL | fn baq() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -171,7 +231,7 @@ LL |         return Box::new(0);
    |                +++++++++ +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:42:5
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:44:5
    |
 LL | fn baq() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -188,7 +248,7 @@ LL |     Box::new(42)
    |     +++++++++  +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:46:9
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:48:9
    |
 LL | fn baz() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -205,7 +265,7 @@ LL |         Box::new(Struct)
    |         +++++++++      +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:48:9
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:50:9
    |
 LL | fn baz() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -222,7 +282,7 @@ LL |         Box::new(42)
    |         +++++++++  +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:53:9
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:55:9
    |
 LL | fn baw() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -239,7 +299,7 @@ LL |         Box::new(0)
    |         +++++++++ +
 
 error[E0308]: mismatched types
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:55:9
+  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:57:9
    |
 LL | fn baw() -> Box<dyn Trait> {
    |             -------------- expected `Box<(dyn Trait + 'static)>` because of return type
@@ -255,45 +315,7 @@ help: store this in the heap by calling `Box::new`
 LL |         Box::new(42)
    |         +++++++++  +
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:60:13
-   |
-LL | fn bat() -> dyn Trait {
-   |             ^^^^^^^^^ doesn't have a size known at compile-time
-   |
-help: consider returning an `impl Trait` instead of a `dyn Trait`
-   |
-LL | fn bat() -> impl Trait {
-   |             ~~~~
-help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
-   |
-LL ~ fn bat() -> Box<dyn Trait> {
-LL |     if true {
-LL ~         return Box::new(0);
-LL |     }
-LL ~     Box::new(42)
-   |
-
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/dyn-trait-return-should-be-impl-trait.rs:66:13
-   |
-LL | fn bay() -> dyn Trait {
-   |             ^^^^^^^^^ doesn't have a size known at compile-time
-   |
-help: consider returning an `impl Trait` instead of a `dyn Trait`
-   |
-LL | fn bay() -> impl Trait {
-   |             ~~~~
-help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
-   |
-LL ~ fn bay() -> Box<dyn Trait> {
-LL |     if true {
-LL ~         Box::new(0)
-LL |     } else {
-LL ~         Box::new(42)
-   |
-
-error: aborting due to 19 previous errors
+error: aborting due to 21 previous errors
 
 Some errors have detailed explanations: E0277, E0308, E0746.
 For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.rs b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.rs
index a8a6288eb56..719edd525de 100644
--- a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.rs
+++ b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.rs
@@ -63,7 +63,7 @@ fn dog() -> impl std::fmt::Display {
     }
 }
 
-fn hat() -> dyn std::fmt::Display { //~ ERROR return type cannot have an unboxed trait object
+fn hat() -> dyn std::fmt::Display { //~ ERROR return type cannot be a trait object without pointer indirection
     match 13 {
         0 => {
             return 0i32;
@@ -74,7 +74,7 @@ fn hat() -> dyn std::fmt::Display { //~ ERROR return type cannot have an unboxed
     }
 }
 
-fn pug() -> dyn std::fmt::Display { //~ ERROR return type cannot have an unboxed trait object
+fn pug() -> dyn std::fmt::Display { //~ ERROR return type cannot be a trait object without pointer indirection
     match 13 {
         0 => 0i32,
         1 => 1u32,
@@ -82,7 +82,7 @@ fn pug() -> dyn std::fmt::Display { //~ ERROR return type cannot have an unboxed
     }
 }
 
-fn man() -> dyn std::fmt::Display { //~ ERROR return type cannot have an unboxed trait object
+fn man() -> dyn std::fmt::Display { //~ ERROR return type cannot be a trait object without pointer indirection
     if false {
         0i32
     } else {
diff --git a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr
index 54849c112f5..17eaed436df 100644
--- a/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr
+++ b/tests/ui/impl-trait/point-to-type-err-cause-on-impl-trait-return.stderr
@@ -1,3 +1,62 @@
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:66:13
+   |
+LL | fn hat() -> dyn std::fmt::Display {
+   |             ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn hat() -> impl std::fmt::Display {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+   |
+LL ~ fn hat() -> Box<dyn std::fmt::Display> {
+LL |     match 13 {
+LL |         0 => {
+LL ~             return Box::new(0i32);
+LL |         }
+LL |         _ => {
+LL ~             Box::new(1u32)
+   |
+
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:77:13
+   |
+LL | fn pug() -> dyn std::fmt::Display {
+   |             ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn pug() -> impl std::fmt::Display {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+   |
+LL ~ fn pug() -> Box<dyn std::fmt::Display> {
+LL |     match 13 {
+LL ~         0 => Box::new(0i32),
+LL ~         1 => Box::new(1u32),
+LL ~         _ => Box::new(2u32),
+   |
+
+error[E0746]: return type cannot be a trait object without pointer indirection
+  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:85:13
+   |
+LL | fn man() -> dyn std::fmt::Display {
+   |             ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+help: consider returning an `impl Trait` instead of a `dyn Trait`
+   |
+LL | fn man() -> impl std::fmt::Display {
+   |             ~~~~
+help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
+   |
+LL ~ fn man() -> Box<dyn std::fmt::Display> {
+LL |     if false {
+LL ~         Box::new(0i32)
+LL |     } else {
+LL ~         Box::new(1u32)
+   |
+
 error[E0308]: mismatched types
   --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:5:5
    |
@@ -165,62 +224,6 @@ help: change the type of the numeric literal from `u32` to `i32`
 LL |         1i32
    |          ~~~
 
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:66:13
-   |
-LL | fn hat() -> dyn std::fmt::Display {
-   |             ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-help: consider returning an `impl Trait` instead of a `dyn Trait`
-   |
-LL | fn hat() -> impl std::fmt::Display {
-   |             ~~~~
-help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
-   |
-LL ~ fn hat() -> Box<dyn std::fmt::Display> {
-LL |     match 13 {
-LL |         0 => {
-LL ~             return Box::new(0i32);
-LL |         }
-LL |         _ => {
-LL ~             Box::new(1u32)
-   |
-
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:77:13
-   |
-LL | fn pug() -> dyn std::fmt::Display {
-   |             ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-help: consider returning an `impl Trait` instead of a `dyn Trait`
-   |
-LL | fn pug() -> impl std::fmt::Display {
-   |             ~~~~
-help: alternatively, box the return type, and wrap all of the returned values in `Box::new`
-   |
-LL ~ fn pug() -> Box<dyn std::fmt::Display> {
-LL |     match 13 {
-LL ~         0 => Box::new(0i32),
-LL ~         1 => Box::new(1u32),
-LL ~         _ => Box::new(2u32),
-   |
-
-error[E0746]: return type cannot have an unboxed trait object
-  --> $DIR/point-to-type-err-cause-on-impl-trait-return.rs:85:13
-   |
-LL | fn man() -> dyn std::fmt::Display {
-   |             ^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: if there were a single returned type, you could use `impl Trait` instead
-help: box the return type, and wrap all of the returned values in `Box::new`
-   |
-LL ~ fn man() -> Box<dyn std::fmt::Display> {
-LL |     if false {
-LL ~         Box::new(0i32)
-LL |     } else {
-LL ~         Box::new(1u32)
-   |
-
 error: aborting due to 12 previous errors
 
 Some errors have detailed explanations: E0308, E0746.
diff --git a/tests/ui/inference/issue-72616.stderr b/tests/ui/inference/issue-72616.stderr
index a26f9a1ff56..3848fcf61d9 100644
--- a/tests/ui/inference/issue-72616.stderr
+++ b/tests/ui/inference/issue-72616.stderr
@@ -26,7 +26,7 @@ LL |         if String::from("a") == "a".try_into().unwrap() {}
    |                                     ^^^^^^^^
    |
    = note: multiple `impl`s satisfying `_: TryFrom<&str>` found in the following crates: `core`, `std`:
-           - impl TryFrom<&str> for std::sys_common::net::LookupHost;
+           - impl TryFrom<&str> for std::sys::net::connection::socket::LookupHost;
            - impl<T, U> TryFrom<U> for T
              where U: Into<T>;
    = note: required for `&str` to implement `TryInto<_>`
diff --git a/tests/ui/issues/issue-17954.stderr b/tests/ui/issues/issue-17954.stderr
index bba7e725b12..0dddea83364 100644
--- a/tests/ui/issues/issue-17954.stderr
+++ b/tests/ui/issues/issue-17954.stderr
@@ -5,7 +5,7 @@ LL |     let a = &FOO;
    |             ^^^^ thread-local variables cannot be borrowed beyond the end of the function
 ...
 LL | }
-   |  - end of enclosing function is here
+   | - end of enclosing function is here
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/issues/issue-18107.rs b/tests/ui/issues/issue-18107.rs
index 4bf5b6c0f30..b1b6ff4f7ad 100644
--- a/tests/ui/issues/issue-18107.rs
+++ b/tests/ui/issues/issue-18107.rs
@@ -2,7 +2,7 @@ pub trait AbstractRenderer {}
 
 fn _create_render(_: &()) ->
     dyn AbstractRenderer
-//~^ ERROR return type cannot have an unboxed trait object
+//~^ ERROR return type cannot be a trait object without pointer indirection
 {
     match 0 {
         _ => unimplemented!()
diff --git a/tests/ui/issues/issue-18107.stderr b/tests/ui/issues/issue-18107.stderr
index 705f7d0df12..6956d6a34aa 100644
--- a/tests/ui/issues/issue-18107.stderr
+++ b/tests/ui/issues/issue-18107.stderr
@@ -1,4 +1,4 @@
-error[E0746]: return type cannot have an unboxed trait object
+error[E0746]: return type cannot be a trait object without pointer indirection
   --> $DIR/issue-18107.rs:4:5
    |
 LL |     dyn AbstractRenderer
diff --git a/tests/ui/issues/issue-5883.rs b/tests/ui/issues/issue-5883.rs
index f9dd2c54d99..dd4753e0344 100644
--- a/tests/ui/issues/issue-5883.rs
+++ b/tests/ui/issues/issue-5883.rs
@@ -6,7 +6,7 @@ struct Struct {
 
 fn new_struct(
     r: dyn A + 'static //~ ERROR the size for values of type
-) -> Struct {
+) -> Struct { //~ ERROR the size for values of type
     Struct { r: r }
 }
 
diff --git a/tests/ui/issues/issue-5883.stderr b/tests/ui/issues/issue-5883.stderr
index d481d0ef94e..d7278ec32f5 100644
--- a/tests/ui/issues/issue-5883.stderr
+++ b/tests/ui/issues/issue-5883.stderr
@@ -1,4 +1,18 @@
 error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
+  --> $DIR/issue-5883.rs:9:6
+   |
+LL | ) -> Struct {
+   |      ^^^^^^ doesn't have a size known at compile-time
+   |
+   = help: within `Struct`, the trait `Sized` is not implemented for `(dyn A + 'static)`
+note: required because it appears within the type `Struct`
+  --> $DIR/issue-5883.rs:3:8
+   |
+LL | struct Struct {
+   |        ^^^^^^
+   = note: the return type of a function must have a statically known size
+
+error[E0277]: the size for values of type `(dyn A + 'static)` cannot be known at compilation time
   --> $DIR/issue-5883.rs:8:8
    |
 LL |     r: dyn A + 'static
@@ -15,6 +29,6 @@ help: function arguments must have a statically known size, borrowed types alway
 LL |     r: &dyn A + 'static
    |        +
 
-error: aborting due to 1 previous error
+error: aborting due to 2 previous errors
 
 For more information about this error, try `rustc --explain E0277`.
diff --git a/tests/ui/json/json-multiple.rs b/tests/ui/json/json-multiple.rs
index 296a60d2453..8ad57939d5d 100644
--- a/tests/ui/json/json-multiple.rs
+++ b/tests/ui/json/json-multiple.rs
@@ -1,5 +1,6 @@
 //@ build-pass
 //@ ignore-pass (different metadata emitted in different modes)
 //@ compile-flags: --json=diagnostic-short --json artifacts --error-format=json
+//@ normalize-stderr: "json-multiple\..+/libjson_multiple.rlib" -> "json-multiple/libjson_multiple.rlib"
 
 #![crate_type = "lib"]
diff --git a/tests/ui/json/json-options.rs b/tests/ui/json/json-options.rs
index 33df25e27b6..a6654bfcac6 100644
--- a/tests/ui/json/json-options.rs
+++ b/tests/ui/json/json-options.rs
@@ -1,5 +1,6 @@
 //@ build-pass
 //@ ignore-pass (different metadata emitted in different modes)
 //@ compile-flags: --json=diagnostic-short,artifacts --error-format=json
+//@ normalize-stderr: "json-options\..+/libjson_options.rlib" -> "json-options/libjson_options.rlib"
 
 #![crate_type = "lib"]
diff --git a/tests/ui/lang-items/lang-item-missing.stderr b/tests/ui/lang-items/lang-item-missing.stderr
index 08e679a7c55..63bca95adf7 100644
--- a/tests/ui/lang-items/lang-item-missing.stderr
+++ b/tests/ui/lang-items/lang-item-missing.stderr
@@ -1,4 +1,8 @@
 error: requires `sized` lang_item
+  --> $DIR/lang-item-missing.rs:11:60
+   |
+LL | extern "C" fn main(_argc: i32, _argv: *const *const u8) -> i32 {
+   |                                                            ^^^
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/issues/issue-40408.rs b/tests/ui/lexer/floating-point-0e10-issue-40408.rs
index a1c1c582181..a1c1c582181 100644
--- a/tests/ui/issues/issue-40408.rs
+++ b/tests/ui/lexer/floating-point-0e10-issue-40408.rs
diff --git a/tests/ui/issues/issue-40136.rs b/tests/ui/macros/const-expr-invocations-issue-40136.rs
index d5ccebdc85d..d5ccebdc85d 100644
--- a/tests/ui/issues/issue-40136.rs
+++ b/tests/ui/macros/const-expr-invocations-issue-40136.rs
diff --git a/tests/ui/issues/issue-40845.rs b/tests/ui/macros/macros-in-trait-positions-issue-40845.rs
index a4ede6adfa3..a4ede6adfa3 100644
--- a/tests/ui/issues/issue-40845.rs
+++ b/tests/ui/macros/macros-in-trait-positions-issue-40845.rs
diff --git a/tests/ui/issues/issue-40845.stderr b/tests/ui/macros/macros-in-trait-positions-issue-40845.stderr
index 66bf053204c..5c1b5f51e44 100644
--- a/tests/ui/issues/issue-40845.stderr
+++ b/tests/ui/macros/macros-in-trait-positions-issue-40845.stderr
@@ -1,11 +1,11 @@
 error: cannot find macro `m` in this scope
-  --> $DIR/issue-40845.rs:1:11
+  --> $DIR/macros-in-trait-positions-issue-40845.rs:1:11
    |
 LL | trait T { m!(); }
    |           ^
 
 error: cannot find macro `m` in this scope
-  --> $DIR/issue-40845.rs:4:10
+  --> $DIR/macros-in-trait-positions-issue-40845.rs:4:10
    |
 LL | impl S { m!(); }
    |          ^
diff --git a/tests/ui/issues/issue-41213.rs b/tests/ui/match/enum-and-break-in-match-issue-41213.rs
index 97f80a99a83..7c42a3629c9 100644
--- a/tests/ui/issues/issue-41213.rs
+++ b/tests/ui/match/enum-and-break-in-match-issue-41213.rs
@@ -1,4 +1,4 @@
-//@ run-pass
+//@ check-pass
 #![allow(dead_code)]
 enum A {
     A1,
diff --git a/tests/ui/methods/issues/issue-61525.stderr b/tests/ui/methods/issues/issue-61525.stderr
index 35001ae22a6..7ac3d3dc0cf 100644
--- a/tests/ui/methods/issues/issue-61525.stderr
+++ b/tests/ui/methods/issues/issue-61525.stderr
@@ -32,7 +32,7 @@ note: method defined here
   --> $DIR/issue-61525.rs:2:8
    |
 LL |     fn query<Q>(self, q: Q);
-   |        ^^^^^
+   |        ^^^^^          -
 
 error: aborting due to 2 previous errors
 
diff --git a/tests/ui/privacy/privacy2.rs b/tests/ui/privacy/privacy2.rs
index ab6d805544e..c82cd442559 100644
--- a/tests/ui/privacy/privacy2.rs
+++ b/tests/ui/privacy/privacy2.rs
@@ -14,16 +14,20 @@ mod bar {
 }
 
 pub fn foo() {}
+//~^ ERROR requires `sized` lang_item
 
 fn test1() {
+    //~^ ERROR requires `sized` lang_item
     use bar::foo;
     //~^ ERROR unresolved import `bar::foo` [E0432]
     //~| no `foo` in `bar`
 }
 
 fn test2() {
+    //~^ ERROR requires `sized` lang_item
     use bar::glob::foo;
     //~^ ERROR `foo` is private
 }
 
 fn main() {}
+//~^ ERROR requires `sized` lang_item
diff --git a/tests/ui/privacy/privacy2.stderr b/tests/ui/privacy/privacy2.stderr
index 46bb9823dbf..39bab67a660 100644
--- a/tests/ui/privacy/privacy2.stderr
+++ b/tests/ui/privacy/privacy2.stderr
@@ -1,11 +1,11 @@
 error[E0432]: unresolved import `bar::foo`
-  --> $DIR/privacy2.rs:19:9
+  --> $DIR/privacy2.rs:21:9
    |
 LL |     use bar::foo;
    |         ^^^^^^^^ no `foo` in `bar`
 
 error[E0603]: function import `foo` is private
-  --> $DIR/privacy2.rs:25:20
+  --> $DIR/privacy2.rs:28:20
    |
 LL |     use bar::glob::foo;
    |                    ^^^ private function import
@@ -22,8 +22,40 @@ LL | pub fn foo() {}
    | ^^^^^^^^^^^^ you could import this directly
 
 error: requires `sized` lang_item
+  --> $DIR/privacy2.rs:16:14
+   |
+LL | pub fn foo() {}
+   |              ^^
+
+error: requires `sized` lang_item
+  --> $DIR/privacy2.rs:19:12
+   |
+LL |   fn test1() {
+   |  ____________^
+LL | |
+LL | |     use bar::foo;
+...  |
+LL | | }
+   | |_^
+
+error: requires `sized` lang_item
+  --> $DIR/privacy2.rs:26:12
+   |
+LL |   fn test2() {
+   |  ____________^
+LL | |
+LL | |     use bar::glob::foo;
+LL | |
+LL | | }
+   | |_^
+
+error: requires `sized` lang_item
+  --> $DIR/privacy2.rs:32:11
+   |
+LL | fn main() {}
+   |           ^^
 
-error: aborting due to 3 previous errors
+error: aborting due to 6 previous errors
 
 Some errors have detailed explanations: E0432, E0603.
 For more information about an error, try `rustc --explain E0432`.
diff --git a/tests/ui/privacy/privacy3.rs b/tests/ui/privacy/privacy3.rs
index 6298a6bc8cf..2bb3c1b3c61 100644
--- a/tests/ui/privacy/privacy3.rs
+++ b/tests/ui/privacy/privacy3.rs
@@ -11,12 +11,15 @@ mod bar {
 
     mod glob {
         fn gpriv() {}
+    //~^ ERROR requires `sized` lang_item
     }
 }
 
 pub fn foo() {}
+//~^ ERROR requires `sized` lang_item
 
 fn test1() {
+    //~^ ERROR requires `sized` lang_item
     use bar::gpriv;
     //~^ ERROR unresolved import `bar::gpriv` [E0432]
     //~| no `gpriv` in `bar`
@@ -27,3 +30,4 @@ fn test1() {
 }
 
 fn main() {}
+//~^ ERROR requires `sized` lang_item
diff --git a/tests/ui/privacy/privacy3.stderr b/tests/ui/privacy/privacy3.stderr
index df66c84751b..06a287d35ea 100644
--- a/tests/ui/privacy/privacy3.stderr
+++ b/tests/ui/privacy/privacy3.stderr
@@ -1,11 +1,39 @@
 error[E0432]: unresolved import `bar::gpriv`
-  --> $DIR/privacy3.rs:20:9
+  --> $DIR/privacy3.rs:23:9
    |
 LL |     use bar::gpriv;
    |         ^^^^^^^^^^ no `gpriv` in `bar`
 
 error: requires `sized` lang_item
+  --> $DIR/privacy3.rs:18:14
+   |
+LL | pub fn foo() {}
+   |              ^^
+
+error: requires `sized` lang_item
+  --> $DIR/privacy3.rs:21:12
+   |
+LL |   fn test1() {
+   |  ____________^
+LL | |
+LL | |     use bar::gpriv;
+...  |
+LL | |     gpriv();
+LL | | }
+   | |_^
+
+error: requires `sized` lang_item
+  --> $DIR/privacy3.rs:32:11
+   |
+LL | fn main() {}
+   |           ^^
+
+error: requires `sized` lang_item
+  --> $DIR/privacy3.rs:13:20
+   |
+LL |         fn gpriv() {}
+   |                    ^^
 
-error: aborting due to 2 previous errors
+error: aborting due to 5 previous errors
 
 For more information about this error, try `rustc --explain E0432`.
diff --git a/tests/ui/proc-macro/issue-59191-replace-root-with-fn.stderr b/tests/ui/proc-macro/issue-59191-replace-root-with-fn.stderr
index 08e679a7c55..2d0c92ff297 100644
--- a/tests/ui/proc-macro/issue-59191-replace-root-with-fn.stderr
+++ b/tests/ui/proc-macro/issue-59191-replace-root-with-fn.stderr
@@ -1,4 +1,10 @@
 error: requires `sized` lang_item
+  --> $DIR/issue-59191-replace-root-with-fn.rs:9:1
+   |
+LL | #![issue_59191::no_main]
+   | ^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this error originates in the attribute macro `issue_59191::no_main` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/self/arbitrary_self_type_infinite_recursion.rs b/tests/ui/self/arbitrary_self_type_infinite_recursion.rs
new file mode 100644
index 00000000000..6fbf35c0b86
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_type_infinite_recursion.rs
@@ -0,0 +1,24 @@
+#![feature(arbitrary_self_types)]
+
+struct MySmartPtr<T>(T);
+
+impl<T> core::ops::Receiver for MySmartPtr<T> {
+  type Target = MySmartPtr<T>;
+}
+
+struct Content;
+
+impl Content {
+  fn method(self: MySmartPtr<Self>) { // note self type
+     //~^ reached the recursion limit
+     //~| reached the recursion limit
+     //~| invalid `self` parameter type
+  }
+}
+
+fn main() {
+  let p = MySmartPtr(Content);
+  p.method();
+  //~^ reached the recursion limit
+  //~| no method named `method`
+}
diff --git a/tests/ui/self/arbitrary_self_type_infinite_recursion.stderr b/tests/ui/self/arbitrary_self_type_infinite_recursion.stderr
new file mode 100644
index 00000000000..5e652efb364
--- /dev/null
+++ b/tests/ui/self/arbitrary_self_type_infinite_recursion.stderr
@@ -0,0 +1,47 @@
+error[E0055]: reached the recursion limit while auto-dereferencing `MySmartPtr<Content>`
+  --> $DIR/arbitrary_self_type_infinite_recursion.rs:12:19
+   |
+LL |   fn method(self: MySmartPtr<Self>) { // note self type
+   |                   ^^^^^^^^^^^^^^^^ deref recursion limit reached
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`arbitrary_self_type_infinite_recursion`)
+
+error[E0055]: reached the recursion limit while auto-dereferencing `MySmartPtr<Content>`
+  --> $DIR/arbitrary_self_type_infinite_recursion.rs:12:19
+   |
+LL |   fn method(self: MySmartPtr<Self>) { // note self type
+   |                   ^^^^^^^^^^^^^^^^ deref recursion limit reached
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`arbitrary_self_type_infinite_recursion`)
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+
+error[E0307]: invalid `self` parameter type: `MySmartPtr<Content>`
+  --> $DIR/arbitrary_self_type_infinite_recursion.rs:12:19
+   |
+LL |   fn method(self: MySmartPtr<Self>) { // note self type
+   |                   ^^^^^^^^^^^^^^^^
+   |
+   = note: type of `self` must be `Self` or some type implementing `Receiver`
+   = help: consider changing to `self`, `&self`, `&mut self`, or a type implementing `Receiver` such as `self: Box<Self>`, `self: Rc<Self>`, or `self: Arc<Self>`
+
+error[E0055]: reached the recursion limit while auto-dereferencing `MySmartPtr<Content>`
+  --> $DIR/arbitrary_self_type_infinite_recursion.rs:21:5
+   |
+LL |   p.method();
+   |     ^^^^^^ deref recursion limit reached
+   |
+   = help: consider increasing the recursion limit by adding a `#![recursion_limit = "256"]` attribute to your crate (`arbitrary_self_type_infinite_recursion`)
+
+error[E0599]: no method named `method` found for struct `MySmartPtr` in the current scope
+  --> $DIR/arbitrary_self_type_infinite_recursion.rs:21:5
+   |
+LL | struct MySmartPtr<T>(T);
+   | -------------------- method `method` not found for this struct
+...
+LL |   p.method();
+   |     ^^^^^^ method not found in `MySmartPtr<Content>`
+
+error: aborting due to 5 previous errors
+
+Some errors have detailed explanations: E0055, E0307, E0599.
+For more information about an error, try `rustc --explain E0055`.
diff --git a/tests/ui/self/dispatch-from-dyn-layout-2.rs b/tests/ui/self/dispatch-from-dyn-layout-2.rs
new file mode 100644
index 00000000000..cd52f060dc8
--- /dev/null
+++ b/tests/ui/self/dispatch-from-dyn-layout-2.rs
@@ -0,0 +1,16 @@
+//@ check-pass
+// Regression test for #90110.
+
+// Make sure that object safety checking doesn't freak out when
+// we have impossible-to-satisfy `Sized` predicates.
+
+trait Parser
+where
+    for<'a> (dyn Parser + 'a): Sized,
+{
+    fn parse_line(&self);
+}
+
+fn foo(_: &dyn Parser) {}
+
+fn main() {}
diff --git a/tests/ui/self/dispatch-from-dyn-layout-3.rs b/tests/ui/self/dispatch-from-dyn-layout-3.rs
new file mode 100644
index 00000000000..6878a4f4ac2
--- /dev/null
+++ b/tests/ui/self/dispatch-from-dyn-layout-3.rs
@@ -0,0 +1,19 @@
+//@ check-pass
+
+// Make sure that object safety checking doesn't freak out when
+// we have impossible-to-satisfy `DispatchFromDyn` predicates.
+
+#![feature(dispatch_from_dyn)]
+#![feature(arbitrary_self_types)]
+
+use std::ops::Deref;
+use std::ops::DispatchFromDyn;
+
+trait Trait<T: Deref<Target = Self>>
+where
+    for<'a> &'a T: DispatchFromDyn<&'a T>,
+{
+    fn foo(self: &T) -> Box<dyn Trait<T>>;
+}
+
+fn main() {}
diff --git a/tests/crashes/57276.rs b/tests/ui/self/dispatch-from-dyn-layout.rs
index f70be4fba6d..468dc89a73e 100644
--- a/tests/crashes/57276.rs
+++ b/tests/ui/self/dispatch-from-dyn-layout.rs
@@ -1,4 +1,8 @@
-//@ known-bug: #57276
+//@ check-pass
+// Regression test for #57276.
+
+// Make sure that object safety checking doesn't freak out when
+// we have impossible-to-satisfy `DispatchFromDyn` predicates.
 
 #![feature(arbitrary_self_types, dispatch_from_dyn)]
 
diff --git a/tests/ui/static/issue-24446.rs b/tests/ui/static/issue-24446.rs
index 6cf8846506d..830e373c189 100644
--- a/tests/ui/static/issue-24446.rs
+++ b/tests/ui/static/issue-24446.rs
@@ -2,7 +2,6 @@ fn main() {
     static foo: dyn Fn() -> u32 = || -> u32 {
         //~^ ERROR the size for values of type
         //~| ERROR cannot be shared between threads safely
-        //~| ERROR the size for values of type
         //~| ERROR mismatched types
         0
     };
diff --git a/tests/ui/static/issue-24446.stderr b/tests/ui/static/issue-24446.stderr
index 8cb034000be..033caf07d8e 100644
--- a/tests/ui/static/issue-24446.stderr
+++ b/tests/ui/static/issue-24446.stderr
@@ -15,33 +15,19 @@ LL |     static foo: dyn Fn() -> u32 = || -> u32 {
    |
    = help: the trait `Sized` is not implemented for `(dyn Fn() -> u32 + 'static)`
 
-error[E0277]: the size for values of type `(dyn Fn() -> u32 + 'static)` cannot be known at compilation time
-  --> $DIR/issue-24446.rs:2:35
-   |
-LL |       static foo: dyn Fn() -> u32 = || -> u32 {
-   |  ___________________________________^
-...  |
-LL | |         0
-LL | |     };
-   | |_____^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `(dyn Fn() -> u32 + 'static)`
-   = note: constant expressions must have a statically known size
-
 error[E0308]: mismatched types
   --> $DIR/issue-24446.rs:2:35
    |
 LL |       static foo: dyn Fn() -> u32 = || -> u32 {
    |  ___________________________________^
 ...  |
-LL | |         0
 LL | |     };
    | |_____^ expected `dyn Fn`, found closure
    |
    = note: expected trait object `(dyn Fn() -> u32 + 'static)`
                    found closure `{closure@$DIR/issue-24446.rs:2:35: 2:44}`
 
-error: aborting due to 4 previous errors
+error: aborting due to 3 previous errors
 
 Some errors have detailed explanations: E0277, E0308.
 For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/statics/unsized_type2.stderr b/tests/ui/statics/unsized_type2.stderr
index b18a99fab72..ffbbe218c87 100644
--- a/tests/ui/statics/unsized_type2.stderr
+++ b/tests/ui/statics/unsized_type2.stderr
@@ -11,6 +11,12 @@ note: required because it appears within the type `Foo`
 LL | pub struct Foo {
    |            ^^^
 
+error[E0308]: mismatched types
+  --> $DIR/unsized_type2.rs:14:45
+   |
+LL | pub static WITH_ERROR: Foo = Foo { version: 0 };
+   |                                             ^ expected `str`, found integer
+
 error[E0277]: the size for values of type `str` cannot be known at compilation time
   --> $DIR/unsized_type2.rs:14:30
    |
@@ -23,13 +29,7 @@ note: required because it appears within the type `Foo`
    |
 LL | pub struct Foo {
    |            ^^^
-   = note: constant expressions must have a statically known size
-
-error[E0308]: mismatched types
-  --> $DIR/unsized_type2.rs:14:45
-   |
-LL | pub static WITH_ERROR: Foo = Foo { version: 0 };
-   |                                             ^ expected `str`, found integer
+   = note: structs must have a statically known size to be initialized
 
 error: aborting due to 3 previous errors
 
diff --git a/tests/ui/suggestions/dyn-incompatible-trait-references-self.stderr b/tests/ui/suggestions/dyn-incompatible-trait-references-self.stderr
index ae009d26029..4576017abaf 100644
--- a/tests/ui/suggestions/dyn-incompatible-trait-references-self.stderr
+++ b/tests/ui/suggestions/dyn-incompatible-trait-references-self.stderr
@@ -34,6 +34,18 @@ LL | trait Other: Sized {}
    |       this trait is not dyn compatible...
 
 error[E0277]: the size for values of type `Self` cannot be known at compilation time
+  --> $DIR/dyn-incompatible-trait-references-self.rs:4:22
+   |
+LL |     fn bat(&self) -> Self {}
+   |                      ^^^^ doesn't have a size known at compile-time
+   |
+   = note: the return type of a function must have a statically known size
+help: consider further restricting `Self`
+   |
+LL |     fn bat(&self) -> Self where Self: Sized {}
+   |                           +++++++++++++++++
+
+error[E0277]: the size for values of type `Self` cannot be known at compilation time
   --> $DIR/dyn-incompatible-trait-references-self.rs:2:22
    |
 LL |     fn baz(&self, _: Self) {}
@@ -61,18 +73,6 @@ LL |     fn bat(&self) -> Self {}
    = note: expected type parameter `Self`
                    found unit type `()`
 
-error[E0277]: the size for values of type `Self` cannot be known at compilation time
-  --> $DIR/dyn-incompatible-trait-references-self.rs:4:22
-   |
-LL |     fn bat(&self) -> Self {}
-   |                      ^^^^ doesn't have a size known at compile-time
-   |
-   = note: the return type of a function must have a statically known size
-help: consider further restricting `Self`
-   |
-LL |     fn bat(&self) -> Self where Self: Sized {}
-   |                           +++++++++++++++++
-
 error: aborting due to 5 previous errors
 
 Some errors have detailed explanations: E0038, E0277, E0308.
diff --git a/tests/ui/issues/issue-40782.fixed b/tests/ui/suggestions/for-loop-missing-in.fixed
index ff376b5a52c..ff376b5a52c 100644
--- a/tests/ui/issues/issue-40782.fixed
+++ b/tests/ui/suggestions/for-loop-missing-in.fixed
diff --git a/tests/ui/issues/issue-40782.rs b/tests/ui/suggestions/for-loop-missing-in.rs
index 28c12aec665..28c12aec665 100644
--- a/tests/ui/issues/issue-40782.rs
+++ b/tests/ui/suggestions/for-loop-missing-in.rs
diff --git a/tests/ui/issues/issue-40782.stderr b/tests/ui/suggestions/for-loop-missing-in.stderr
index 61498020238..61830b800a6 100644
--- a/tests/ui/issues/issue-40782.stderr
+++ b/tests/ui/suggestions/for-loop-missing-in.stderr
@@ -1,5 +1,5 @@
 error: missing `in` in `for` loop
-  --> $DIR/issue-40782.rs:4:11
+  --> $DIR/for-loop-missing-in.rs:4:11
    |
 LL |     for _i 0..2 {
    |           ^
@@ -10,7 +10,7 @@ LL |     for _i in 0..2 {
    |            ++
 
 error: missing `in` in `for` loop
-  --> $DIR/issue-40782.rs:6:12
+  --> $DIR/for-loop-missing-in.rs:6:12
    |
 LL |     for _i of 0..2 {
    |            ^^
diff --git a/tests/ui/suggestions/suggest-std-when-using-type.fixed b/tests/ui/suggestions/suggest-std-when-using-type.fixed
index ebbb854175b..0547940f94d 100644
--- a/tests/ui/suggestions/suggest-std-when-using-type.fixed
+++ b/tests/ui/suggestions/suggest-std-when-using-type.fixed
@@ -1,8 +1,5 @@
 //@ run-rustfix
 fn main() {
     let pi = std::f32::consts::PI; //~ ERROR ambiguous associated type
-    let bytes = "hello world".as_bytes();
-    let string = std::str::from_utf8(bytes).unwrap();
-    //~^ ERROR no function or associated item named `from_utf8` found
-    println!("{pi} {bytes:?} {string}");
+    println!("{pi}");
 }
diff --git a/tests/ui/suggestions/suggest-std-when-using-type.rs b/tests/ui/suggestions/suggest-std-when-using-type.rs
index 06aab63d688..cd55c5d13bd 100644
--- a/tests/ui/suggestions/suggest-std-when-using-type.rs
+++ b/tests/ui/suggestions/suggest-std-when-using-type.rs
@@ -1,8 +1,5 @@
 //@ run-rustfix
 fn main() {
     let pi = f32::consts::PI; //~ ERROR ambiguous associated type
-    let bytes = "hello world".as_bytes();
-    let string = str::from_utf8(bytes).unwrap();
-    //~^ ERROR no function or associated item named `from_utf8` found
-    println!("{pi} {bytes:?} {string}");
+    println!("{pi}");
 }
diff --git a/tests/ui/suggestions/suggest-std-when-using-type.stderr b/tests/ui/suggestions/suggest-std-when-using-type.stderr
index 6f890b87b24..7f8545f461d 100644
--- a/tests/ui/suggestions/suggest-std-when-using-type.stderr
+++ b/tests/ui/suggestions/suggest-std-when-using-type.stderr
@@ -9,18 +9,6 @@ help: you are looking for the module in `std`, not the primitive type
 LL |     let pi = std::f32::consts::PI;
    |              +++++
 
-error[E0599]: no function or associated item named `from_utf8` found for type `str` in the current scope
-  --> $DIR/suggest-std-when-using-type.rs:5:23
-   |
-LL |     let string = str::from_utf8(bytes).unwrap();
-   |                       ^^^^^^^^^ function or associated item not found in `str`
-   |
-help: you are looking for the module in `std`, not the primitive type
-   |
-LL |     let string = std::str::from_utf8(bytes).unwrap();
-   |                  +++++
-
-error: aborting due to 2 previous errors
+error: aborting due to 1 previous error
 
-Some errors have detailed explanations: E0223, E0599.
-For more information about an error, try `rustc --explain E0223`.
+For more information about this error, try `rustc --explain E0223`.
diff --git a/tests/ui/suggestions/trait-with-missing-associated-type-restriction.stderr b/tests/ui/suggestions/trait-with-missing-associated-type-restriction.stderr
index 980c2455c8e..df59a28c4b9 100644
--- a/tests/ui/suggestions/trait-with-missing-associated-type-restriction.stderr
+++ b/tests/ui/suggestions/trait-with-missing-associated-type-restriction.stderr
@@ -94,7 +94,7 @@ note: method defined here
   --> $DIR/trait-with-missing-associated-type-restriction.rs:9:8
    |
 LL |     fn funk(&self, _: Self::A);
-   |        ^^^^
+   |        ^^^^        -
 help: consider constraining the associated type `<T as Trait<i32>>::A` to `{integer}`
    |
 LL | fn bar2<T: Trait<i32, A = {integer}>>(x: T) {
diff --git a/tests/ui/issues/issue-40827.rs b/tests/ui/trait-bounds/deep-level-Send-bound-check-issue-40827.rs
index 6e42c506169..6e42c506169 100644
--- a/tests/ui/issues/issue-40827.rs
+++ b/tests/ui/trait-bounds/deep-level-Send-bound-check-issue-40827.rs
diff --git a/tests/ui/issues/issue-40827.stderr b/tests/ui/trait-bounds/deep-level-Send-bound-check-issue-40827.stderr
index 7f5c578ae4f..7b59fe72f43 100644
--- a/tests/ui/issues/issue-40827.stderr
+++ b/tests/ui/trait-bounds/deep-level-Send-bound-check-issue-40827.stderr
@@ -1,5 +1,5 @@
 error[E0277]: `Rc<Foo>` cannot be shared between threads safely
-  --> $DIR/issue-40827.rs:14:7
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:14:7
    |
 LL |     f(Foo(Arc::new(Bar::B(None))));
    |     - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Rc<Foo>` cannot be shared between threads safely
@@ -8,24 +8,24 @@ LL |     f(Foo(Arc::new(Bar::B(None))));
    |
    = help: within `Bar`, the trait `Sync` is not implemented for `Rc<Foo>`
 note: required because it appears within the type `Bar`
-  --> $DIR/issue-40827.rs:6:6
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:6:6
    |
 LL | enum Bar {
    |      ^^^
    = note: required for `Arc<Bar>` to implement `Send`
 note: required because it appears within the type `Foo`
-  --> $DIR/issue-40827.rs:4:8
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:4:8
    |
 LL | struct Foo(Arc<Bar>);
    |        ^^^
 note: required by a bound in `f`
-  --> $DIR/issue-40827.rs:11:9
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:11:9
    |
 LL | fn f<T: Send>(_: T) {}
    |         ^^^^ required by this bound in `f`
 
 error[E0277]: `Rc<Foo>` cannot be sent between threads safely
-  --> $DIR/issue-40827.rs:14:7
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:14:7
    |
 LL |     f(Foo(Arc::new(Bar::B(None))));
    |     - ^^^^^^^^^^^^^^^^^^^^^^^^^^^ `Rc<Foo>` cannot be sent between threads safely
@@ -34,18 +34,18 @@ LL |     f(Foo(Arc::new(Bar::B(None))));
    |
    = help: within `Bar`, the trait `Send` is not implemented for `Rc<Foo>`
 note: required because it appears within the type `Bar`
-  --> $DIR/issue-40827.rs:6:6
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:6:6
    |
 LL | enum Bar {
    |      ^^^
    = note: required for `Arc<Bar>` to implement `Send`
 note: required because it appears within the type `Foo`
-  --> $DIR/issue-40827.rs:4:8
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:4:8
    |
 LL | struct Foo(Arc<Bar>);
    |        ^^^
 note: required by a bound in `f`
-  --> $DIR/issue-40827.rs:11:9
+  --> $DIR/deep-level-Send-bound-check-issue-40827.rs:11:9
    |
 LL | fn f<T: Send>(_: T) {}
    |         ^^^^ required by this bound in `f`
diff --git a/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs
index c3a2ab82adc..5277de29464 100644
--- a/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs
+++ b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.rs
@@ -8,7 +8,6 @@ type Fn = dyn FnOnce() -> u8;
 const TEST: Fn = some_fn;
 //~^ ERROR cannot find value `some_fn` in this scope
 //~| ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
-//~| ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
 const TEST2: (Fn, u8) = (TEST, 0);
 //~^ ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
 //~| ERROR the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
diff --git a/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr
index 0e92979ccd5..76e015a7238 100644
--- a/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr
+++ b/tests/ui/trait-bounds/ice-unsized-tuple-const-issue-121443.stderr
@@ -13,16 +13,7 @@ LL | const TEST: Fn = some_fn;
    = help: the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)`
 
 error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
-  --> $DIR/ice-unsized-tuple-const-issue-121443.rs:8:18
-   |
-LL | const TEST: Fn = some_fn;
-   |                  ^^^^^^^ doesn't have a size known at compile-time
-   |
-   = help: the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)`
-   = note: constant expressions must have a statically known size
-
-error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
-  --> $DIR/ice-unsized-tuple-const-issue-121443.rs:12:14
+  --> $DIR/ice-unsized-tuple-const-issue-121443.rs:11:14
    |
 LL | const TEST2: (Fn, u8) = (TEST, 0);
    |              ^^^^^^^^ doesn't have a size known at compile-time
@@ -31,7 +22,7 @@ LL | const TEST2: (Fn, u8) = (TEST, 0);
    = note: only the last element of a tuple may have a dynamically sized type
 
 error[E0277]: the size for values of type `(dyn FnOnce() -> u8 + 'static)` cannot be known at compilation time
-  --> $DIR/ice-unsized-tuple-const-issue-121443.rs:12:25
+  --> $DIR/ice-unsized-tuple-const-issue-121443.rs:11:25
    |
 LL | const TEST2: (Fn, u8) = (TEST, 0);
    |                         ^^^^^^^^^ doesn't have a size known at compile-time
@@ -39,7 +30,7 @@ LL | const TEST2: (Fn, u8) = (TEST, 0);
    = help: the trait `Sized` is not implemented for `(dyn FnOnce() -> u8 + 'static)`
    = note: only the last element of a tuple may have a dynamically sized type
 
-error: aborting due to 5 previous errors
+error: aborting due to 4 previous errors
 
 Some errors have detailed explanations: E0277, E0425.
 For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/traits/const-traits/span-bug-issue-121418.stderr b/tests/ui/traits/const-traits/span-bug-issue-121418.stderr
index f41c19b4573..92cfecd0540 100644
--- a/tests/ui/traits/const-traits/span-bug-issue-121418.stderr
+++ b/tests/ui/traits/const-traits/span-bug-issue-121418.stderr
@@ -8,17 +8,6 @@ LL | impl const dyn T {
    |
    = note: only trait implementations may be annotated with `const`
 
-error[E0308]: mismatched types
-  --> $DIR/span-bug-issue-121418.rs:8:27
-   |
-LL |     pub const fn new() -> std::sync::Mutex<dyn T> {}
-   |                  ---      ^^^^^^^^^^^^^^^^^^^^^^^ expected `Mutex<dyn T>`, found `()`
-   |                  |
-   |                  implicitly returns `()` as its body has no tail or `return` expression
-   |
-   = note: expected struct `Mutex<(dyn T + 'static)>`
-           found unit type `()`
-
 error[E0277]: the size for values of type `(dyn T + 'static)` cannot be known at compilation time
   --> $DIR/span-bug-issue-121418.rs:8:27
    |
@@ -30,6 +19,17 @@ note: required because it appears within the type `Mutex<(dyn T + 'static)>`
   --> $SRC_DIR/std/src/sync/poison/mutex.rs:LL:COL
    = note: the return type of a function must have a statically known size
 
+error[E0308]: mismatched types
+  --> $DIR/span-bug-issue-121418.rs:8:27
+   |
+LL |     pub const fn new() -> std::sync::Mutex<dyn T> {}
+   |                  ---      ^^^^^^^^^^^^^^^^^^^^^^^ expected `Mutex<dyn T>`, found `()`
+   |                  |
+   |                  implicitly returns `()` as its body has no tail or `return` expression
+   |
+   = note: expected struct `Mutex<(dyn T + 'static)>`
+           found unit type `()`
+
 error: aborting due to 3 previous errors
 
 Some errors have detailed explanations: E0277, E0308.
diff --git a/tests/ui/traits/issue-52893.stderr b/tests/ui/traits/issue-52893.stderr
index c37dde90e33..3c5df82fcdc 100644
--- a/tests/ui/traits/issue-52893.stderr
+++ b/tests/ui/traits/issue-52893.stderr
@@ -22,7 +22,7 @@ note: method defined here
   --> $DIR/issue-52893.rs:11:8
    |
 LL |     fn push(self, other: T) -> Self::PushRes;
-   |        ^^^^
+   |        ^^^^       -----
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.rs b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.rs
index cbd591eec96..ea6df938704 100644
--- a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.rs
+++ b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.rs
@@ -13,8 +13,9 @@ fn main() {
 }
 
 fn weird0() -> impl Sized + !Sized {}
-//~^ ERROR the trait bound `(): !Sized` is not satisfied
+//~^ ERROR type mismatch resolving
 fn weird1() -> impl !Sized + Sized {}
-//~^ ERROR the trait bound `(): !Sized` is not satisfied
+//~^ ERROR type mismatch resolving
 fn weird2() -> impl !Sized {}
-//~^ ERROR the trait bound `(): !Sized` is not satisfied
+//~^ ERROR type mismatch resolving
+//~| ERROR the size for values of type
diff --git a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.stderr b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.stderr
index 3dad6d534fd..41d9e74f807 100644
--- a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.stderr
+++ b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-bound.stderr
@@ -1,20 +1,29 @@
-error[E0277]: the trait bound `(): !Sized` is not satisfied
+error[E0277]: the size for values of type `impl !Sized` cannot be known at compilation time
+  --> $DIR/opaque-type-unsatisfied-bound.rs:19:16
+   |
+LL | fn weird2() -> impl !Sized {}
+   |                ^^^^^^^^^^^ doesn't have a size known at compile-time
+   |
+   = help: the trait `Sized` is not implemented for `impl !Sized`
+   = note: the return type of a function must have a statically known size
+
+error[E0271]: type mismatch resolving `impl !Sized + Sized == ()`
   --> $DIR/opaque-type-unsatisfied-bound.rs:15:16
    |
 LL | fn weird0() -> impl Sized + !Sized {}
-   |                ^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
+   |                ^^^^^^^^^^^^^^^^^^^ types differ
 
-error[E0277]: the trait bound `(): !Sized` is not satisfied
+error[E0271]: type mismatch resolving `impl !Sized + Sized == ()`
   --> $DIR/opaque-type-unsatisfied-bound.rs:17:16
    |
 LL | fn weird1() -> impl !Sized + Sized {}
-   |                ^^^^^^^^^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
+   |                ^^^^^^^^^^^^^^^^^^^ types differ
 
-error[E0277]: the trait bound `(): !Sized` is not satisfied
+error[E0271]: type mismatch resolving `impl !Sized == ()`
   --> $DIR/opaque-type-unsatisfied-bound.rs:19:16
    |
 LL | fn weird2() -> impl !Sized {}
-   |                ^^^^^^^^^^^ the trait bound `(): !Sized` is not satisfied
+   |                ^^^^^^^^^^^ types differ
 
 error[E0277]: the trait bound `impl !Trait: Trait` is not satisfied
   --> $DIR/opaque-type-unsatisfied-bound.rs:12:13
@@ -30,6 +39,7 @@ note: required by a bound in `consume`
 LL | fn consume(_: impl Trait) {}
    |                    ^^^^^ required by this bound in `consume`
 
-error: aborting due to 4 previous errors
+error: aborting due to 5 previous errors
 
-For more information about this error, try `rustc --explain E0277`.
+Some errors have detailed explanations: E0271, E0277.
+For more information about an error, try `rustc --explain E0271`.
diff --git a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.rs b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.rs
index 39422914afc..ce42bce0ad4 100644
--- a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.rs
+++ b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.rs
@@ -3,6 +3,6 @@
 #![feature(negative_bounds, unboxed_closures)]
 
 fn produce() -> impl !Fn<(u32,)> {}
-//~^ ERROR the trait bound `(): !Fn(u32)` is not satisfied
+//~^ ERROR type mismatch resolving
 
 fn main() {}
diff --git a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.stderr b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.stderr
index 760e5aa62f2..e1b84e0df7a 100644
--- a/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.stderr
+++ b/tests/ui/traits/negative-bounds/opaque-type-unsatisfied-fn-bound.stderr
@@ -1,9 +1,9 @@
-error[E0277]: the trait bound `(): !Fn(u32)` is not satisfied
+error[E0271]: type mismatch resolving `impl !Fn<(u32,)> == ()`
   --> $DIR/opaque-type-unsatisfied-fn-bound.rs:5:17
    |
 LL | fn produce() -> impl !Fn<(u32,)> {}
-   |                 ^^^^^^^^^^^^^^^^ the trait bound `(): !Fn(u32)` is not satisfied
+   |                 ^^^^^^^^^^^^^^^^ types differ
 
 error: aborting due to 1 previous error
 
-For more information about this error, try `rustc --explain E0277`.
+For more information about this error, try `rustc --explain E0271`.
diff --git a/tests/ui/traits/next-solver/specialization-transmute.rs b/tests/ui/traits/next-solver/specialization-transmute.rs
index 9e31fed9b18..376fa22ae19 100644
--- a/tests/ui/traits/next-solver/specialization-transmute.rs
+++ b/tests/ui/traits/next-solver/specialization-transmute.rs
@@ -1,5 +1,4 @@
 //@ compile-flags: -Znext-solver
-//~^ ERROR cannot normalize `<T as Default>::Id: '_`
 #![feature(specialization)]
 //~^ WARN the feature `specialization` is incomplete
 
@@ -14,6 +13,7 @@ impl<T> Default for T {
     // This will be fixed by #111994
     fn intu(&self) -> &Self::Id {
         //~^ ERROR type annotations needed
+        //~| ERROR cannot normalize `<T as Default>::Id: '_`
         self //~ ERROR cannot satisfy
     }
 }
diff --git a/tests/ui/traits/next-solver/specialization-transmute.stderr b/tests/ui/traits/next-solver/specialization-transmute.stderr
index 2d0c503bc95..eeb101911c4 100644
--- a/tests/ui/traits/next-solver/specialization-transmute.stderr
+++ b/tests/ui/traits/next-solver/specialization-transmute.stderr
@@ -1,5 +1,5 @@
 warning: the feature `specialization` is incomplete and may not be safe to use and/or cause compiler crashes
-  --> $DIR/specialization-transmute.rs:3:12
+  --> $DIR/specialization-transmute.rs:2:12
    |
 LL | #![feature(specialization)]
    |            ^^^^^^^^^^^^^^
@@ -9,9 +9,13 @@ LL | #![feature(specialization)]
    = note: `#[warn(incomplete_features)]` on by default
 
 error: cannot normalize `<T as Default>::Id: '_`
+  --> $DIR/specialization-transmute.rs:14:5
+   |
+LL |     fn intu(&self) -> &Self::Id {
+   |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
 error[E0282]: type annotations needed
-  --> $DIR/specialization-transmute.rs:15:23
+  --> $DIR/specialization-transmute.rs:14:23
    |
 LL |     fn intu(&self) -> &Self::Id {
    |                       ^^^^^^^^^ cannot infer type for reference `&<T as Default>::Id`
diff --git a/tests/ui/traits/next-solver/unsound-region-obligation.rs b/tests/ui/traits/next-solver/unsound-region-obligation.rs
index 733be204354..e7fa60a2e3f 100644
--- a/tests/ui/traits/next-solver/unsound-region-obligation.rs
+++ b/tests/ui/traits/next-solver/unsound-region-obligation.rs
@@ -1,4 +1,3 @@
-//~ ERROR the type `&'a ()` does not fulfill the required lifetime
 //@ compile-flags: -Znext-solver
 // Regression test for rust-lang/trait-system-refactor-initiative#59
 
@@ -8,6 +7,7 @@ trait StaticTy {
 
 impl StaticTy for () {
     type Item<'a> = &'a ();
+    //~^ ERROR the type `&'a ()` does not fulfill the required lifetime
 }
 
 fn main() {}
diff --git a/tests/ui/traits/next-solver/unsound-region-obligation.stderr b/tests/ui/traits/next-solver/unsound-region-obligation.stderr
index fe96a184f43..dea3b62334c 100644
--- a/tests/ui/traits/next-solver/unsound-region-obligation.stderr
+++ b/tests/ui/traits/next-solver/unsound-region-obligation.stderr
@@ -1,4 +1,8 @@
 error[E0477]: the type `&'a ()` does not fulfill the required lifetime
+  --> $DIR/unsound-region-obligation.rs:9:21
+   |
+LL |     type Item<'a> = &'a ();
+   |                     ^^^^^^
    |
    = note: type must satisfy the static lifetime
 
diff --git a/tests/ui/type/pattern_types/assoc_const.default.stderr b/tests/ui/type/pattern_types/assoc_const.default.stderr
new file mode 100644
index 00000000000..abda40e4681
--- /dev/null
+++ b/tests/ui/type/pattern_types/assoc_const.default.stderr
@@ -0,0 +1,36 @@
+error: constant expression depends on a generic parameter
+  --> $DIR/assoc_const.rs:17:19
+   |
+LL | fn foo<T: Foo>(_: pattern_type!(u32 is <T as Foo>::START..=<T as Foo>::END)) {}
+   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this may fail depending on what value the parameter takes
+
+error: constant expression depends on a generic parameter
+  --> $DIR/assoc_const.rs:17:19
+   |
+LL | fn foo<T: Foo>(_: pattern_type!(u32 is <T as Foo>::START..=<T as Foo>::END)) {}
+   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this may fail depending on what value the parameter takes
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+
+error: constant expression depends on a generic parameter
+  --> $DIR/assoc_const.rs:20:19
+   |
+LL | fn bar<T: Foo>(_: pattern_type!(u32 is T::START..=T::END)) {}
+   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this may fail depending on what value the parameter takes
+
+error: constant expression depends on a generic parameter
+  --> $DIR/assoc_const.rs:20:19
+   |
+LL | fn bar<T: Foo>(_: pattern_type!(u32 is T::START..=T::END)) {}
+   |                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |
+   = note: this may fail depending on what value the parameter takes
+   = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
+
+error: aborting due to 4 previous errors
+
diff --git a/tests/ui/type/pattern_types/assoc_const.rs b/tests/ui/type/pattern_types/assoc_const.rs
new file mode 100644
index 00000000000..af0f7e4cbf3
--- /dev/null
+++ b/tests/ui/type/pattern_types/assoc_const.rs
@@ -0,0 +1,24 @@
+#![feature(pattern_types)]
+#![feature(pattern_type_macro)]
+#![cfg_attr(const_arg, feature(generic_const_exprs))]
+#![expect(incomplete_features)]
+
+//@ revisions: default const_arg
+
+//@[const_arg] check-pass
+
+use std::pat::pattern_type;
+
+trait Foo {
+    const START: u32;
+    const END: u32;
+}
+
+fn foo<T: Foo>(_: pattern_type!(u32 is <T as Foo>::START..=<T as Foo>::END)) {}
+//[default]~^ ERROR: constant expression depends on a generic parameter
+//[default]~| ERROR: constant expression depends on a generic parameter
+fn bar<T: Foo>(_: pattern_type!(u32 is T::START..=T::END)) {}
+//[default]~^ ERROR: constant expression depends on a generic parameter
+//[default]~| ERROR: constant expression depends on a generic parameter
+
+fn main() {}
diff --git a/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.rs b/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.rs
index c5f8b2764ec..0f10bf8ce62 100644
--- a/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.rs
+++ b/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.rs
@@ -1,10 +1,14 @@
+//@known-bug: #127972
+//@ failure-status: 101
+//@ normalize-stderr: "note: .*\n\n" -> ""
+//@ normalize-stderr: "thread 'rustc' panicked.*\n" -> ""
+//@ normalize-stderr: "(error: internal compiler error: [^:]+):\d+:\d+: " -> "$1:LL:CC: "
+//@ rustc-env:RUST_BACKTRACE=0
+
 #![feature(pattern_types, pattern_type_macro)]
 #![allow(internal_features)]
 
 type Pat<const START: u32, const END: u32> =
     std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
-//~^ ERROR type and const arguments are not allowed on const parameter `START`
-//~| ERROR generic arguments are not allowed on const parameter `END`
-//~| ERROR associated item constraints are not allowed here
 
 fn main() {}
diff --git a/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.stderr b/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.stderr
index f31809bf397..fbe80a19863 100644
--- a/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.stderr
+++ b/tests/ui/type/pattern_types/bad_const_generics_args_on_const_param.stderr
@@ -1,38 +1,14 @@
-error[E0109]: type and const arguments are not allowed on const parameter `START`
-  --> $DIR/bad_const_generics_args_on_const_param.rs:5:44
+error: internal compiler error: compiler/rustc_hir_analysis/src/hir_ty_lowering/mod.rs:LL:CC: try_lower_anon_const_lit: received const param which shouldn't be possible
+  --> $DIR/bad_const_generics_args_on_const_param.rs:12:36
    |
 LL |     std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
-   |                                    -----   ^^  ^^^  ^ type and const arguments not allowed
-   |                                    |
-   |                                    not allowed on const parameter `START`
-   |
-note: const parameter `START` defined here
-  --> $DIR/bad_const_generics_args_on_const_param.rs:4:16
-   |
-LL | type Pat<const START: u32, const END: u32> =
-   |                ^^^^^
+   |                                    ^^^^^^^^^^^^^^^^^^^
 
-error[E0109]: generic arguments are not allowed on const parameter `END`
-  --> $DIR/bad_const_generics_args_on_const_param.rs:5:64
-   |
-LL |     std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
-   |                                                          ---   ^ generic argument not allowed
-   |                                                          |
-   |                                                          not allowed on const parameter `END`
-   |
-note: const parameter `END` defined here
-  --> $DIR/bad_const_generics_args_on_const_param.rs:4:34
-   |
-LL | type Pat<const START: u32, const END: u32> =
-   |                                  ^^^
-
-error[E0229]: associated item constraints are not allowed here
-  --> $DIR/bad_const_generics_args_on_const_param.rs:5:67
-   |
-LL |     std::pat::pattern_type!(u32 is START::<(), i32, 2>..=END::<_, Assoc = ()>);
-   |                                                                   ^^^^^^^^^^ associated item constraint not allowed here
 
-error: aborting due to 3 previous errors
+Box<dyn Any>
+query stack during panic:
+#0 [type_of] expanding type alias `Pat`
+#1 [check_well_formed] checking that `Pat` is well-formed
+... and 2 other queries... use `env RUST_BACKTRACE=1` to see the full query stack
+error: aborting due to 1 previous error
 
-Some errors have detailed explanations: E0109, E0229.
-For more information about an error, try `rustc --explain E0109`.
diff --git a/tests/ui/type/pattern_types/bad_pat.rs b/tests/ui/type/pattern_types/bad_pat.rs
index 6cb2a0f1f8e..549b0d11dd1 100644
--- a/tests/ui/type/pattern_types/bad_pat.rs
+++ b/tests/ui/type/pattern_types/bad_pat.rs
@@ -8,6 +8,6 @@ type NonNullU32_2 = pattern_type!(u32 is 1..=);
 type Positive2 = pattern_type!(i32 is 0..=);
 //~^ ERROR: inclusive range with no end
 type Wild = pattern_type!(() is _);
-//~^ ERROR: wildcard patterns are not permitted for pattern types
+//~^ ERROR: pattern not supported in pattern types
 
 fn main() {}
diff --git a/tests/ui/type/pattern_types/bad_pat.stderr b/tests/ui/type/pattern_types/bad_pat.stderr
index c857cc3c3ad..d2a5a20bf89 100644
--- a/tests/ui/type/pattern_types/bad_pat.stderr
+++ b/tests/ui/type/pattern_types/bad_pat.stderr
@@ -24,7 +24,7 @@ LL - type Positive2 = pattern_type!(i32 is 0..=);
 LL + type Positive2 = pattern_type!(i32 is 0..);
    |
 
-error: wildcard patterns are not permitted for pattern types
+error: pattern not supported in pattern types
   --> $DIR/bad_pat.rs:10:33
    |
 LL | type Wild = pattern_type!(() is _);
diff --git a/tests/ui/type/pattern_types/const_block.rs b/tests/ui/type/pattern_types/const_block.rs
new file mode 100644
index 00000000000..49c87f4fa0d
--- /dev/null
+++ b/tests/ui/type/pattern_types/const_block.rs
@@ -0,0 +1,10 @@
+#![feature(pattern_types)]
+#![feature(pattern_type_macro)]
+#![feature(inline_const_pat)]
+
+use std::pat::pattern_type;
+
+fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+//~^ ERROR: cycle
+
+fn main() {}
diff --git a/tests/ui/type/pattern_types/const_block.stderr b/tests/ui/type/pattern_types/const_block.stderr
new file mode 100644
index 00000000000..82b616105af
--- /dev/null
+++ b/tests/ui/type/pattern_types/const_block.stderr
@@ -0,0 +1,72 @@
+error[E0391]: cycle detected when evaluating type-level constant
+  --> $DIR/const_block.rs:7:36
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                    ^^^^^^^^^^^^^^
+   |
+note: ...which requires const-evaluating + checking `bar::{constant#2}`...
+  --> $DIR/const_block.rs:7:36
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                    ^^^^^^^^^^^^^^
+note: ...which requires caching mir of `bar::{constant#2}` for CTFE...
+  --> $DIR/const_block.rs:7:36
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                    ^^^^^^^^^^^^^^
+note: ...which requires elaborating drops for `bar::{constant#2}`...
+  --> $DIR/const_block.rs:7:36
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                    ^^^^^^^^^^^^^^
+note: ...which requires borrow-checking `bar::{constant#2}`...
+  --> $DIR/const_block.rs:7:36
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                    ^^^^^^^^^^^^^^
+note: ...which requires borrow-checking `bar::{constant#0}`...
+  --> $DIR/const_block.rs:7:41
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                         ^^^^^^^^^
+note: ...which requires promoting constants in MIR for `bar::{constant#0}`...
+  --> $DIR/const_block.rs:7:41
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                         ^^^^^^^^^
+note: ...which requires const checking `bar::{constant#0}`...
+  --> $DIR/const_block.rs:7:41
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                         ^^^^^^^^^
+note: ...which requires building MIR for `bar::{constant#0}`...
+  --> $DIR/const_block.rs:7:41
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                         ^^^^^^^^^
+note: ...which requires match-checking `bar::{constant#0}`...
+  --> $DIR/const_block.rs:7:41
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                         ^^^^^^^^^
+note: ...which requires type-checking `bar::{constant#0}`...
+  --> $DIR/const_block.rs:7:41
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   |                                         ^^^^^^^^^
+note: ...which requires type-checking `bar`...
+  --> $DIR/const_block.rs:7:1
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = note: ...which again requires evaluating type-level constant, completing the cycle
+note: cycle used when checking that `bar` is well-formed
+  --> $DIR/const_block.rs:7:1
+   |
+LL | fn bar(x: pattern_type!(u32 is 0..=const{ 5 + 5 })) {}
+   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   = note: see https://rustc-dev-guide.rust-lang.org/overview.html#queries and https://rustc-dev-guide.rust-lang.org/query.html for more information
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0391`.
diff --git a/tests/ui/type/pattern_types/free_const.rs b/tests/ui/type/pattern_types/free_const.rs
new file mode 100644
index 00000000000..2e29fce2379
--- /dev/null
+++ b/tests/ui/type/pattern_types/free_const.rs
@@ -0,0 +1,13 @@
+//@ check-pass
+
+#![feature(pattern_types)]
+#![feature(pattern_type_macro)]
+
+use std::pat::pattern_type;
+
+const START: u32 = 0;
+const END: u32 = 10;
+
+fn foo(_: pattern_type!(u32 is START..=END)) {}
+
+fn main() {}
diff --git a/tests/ui/type/pattern_types/nested.rs b/tests/ui/type/pattern_types/nested.rs
index 519fb3f05b4..9ca9c7923de 100644
--- a/tests/ui/type/pattern_types/nested.rs
+++ b/tests/ui/type/pattern_types/nested.rs
@@ -9,16 +9,20 @@ use std::pat::pattern_type;
 // or still validate correctly.
 const BAD_NESTING: pattern_type!(pattern_type!(u32 is 1..) is 0..) = todo!();
 //~^ ERROR: not a valid base type for range patterns
+//~| ERROR: mismatched types
 
 // We want to get the most narrowest version that a pattern could be
 const BAD_NESTING2: pattern_type!(pattern_type!(i32 is 1..) is ..=-1) = todo!();
 //~^ ERROR: not a valid base type for range patterns
+//~| ERROR: mismatched types
 
 const BAD_NESTING3: pattern_type!(pattern_type!(i32 is 1..) is ..0) = todo!();
 //~^ ERROR: not a valid base type for range patterns
+//~| ERROR: mismatched types
 
 const BAD_NESTING4: pattern_type!(() is ..0) = todo!();
 //~^ ERROR: not a valid base type for range patterns
+//~| ERROR: mismatched types
 
 const BAD_NESTING5: pattern_type!(f32 is 1.0 .. 2.0) = todo!();
 //~^ ERROR: not a valid base type for range patterns
diff --git a/tests/ui/type/pattern_types/nested.stderr b/tests/ui/type/pattern_types/nested.stderr
index 99d3979e98c..b753b0a9c9b 100644
--- a/tests/ui/type/pattern_types/nested.stderr
+++ b/tests/ui/type/pattern_types/nested.stderr
@@ -11,52 +11,86 @@ LL | const BAD_NESTING: pattern_type!(pattern_type!(u32 is 1..) is 0..) = todo!(
    |                                                               ^^^
 
 error: `(i32) is 1..=` is not a valid base type for range patterns
-  --> $DIR/nested.rs:14:35
+  --> $DIR/nested.rs:15:35
    |
 LL | const BAD_NESTING2: pattern_type!(pattern_type!(i32 is 1..) is ..=-1) = todo!();
    |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: range patterns only support integers
-  --> $DIR/nested.rs:14:64
+  --> $DIR/nested.rs:15:64
    |
 LL | const BAD_NESTING2: pattern_type!(pattern_type!(i32 is 1..) is ..=-1) = todo!();
    |                                                                ^^^^^
 
 error: `(i32) is 1..=` is not a valid base type for range patterns
-  --> $DIR/nested.rs:17:35
+  --> $DIR/nested.rs:19:35
    |
 LL | const BAD_NESTING3: pattern_type!(pattern_type!(i32 is 1..) is ..0) = todo!();
    |                                   ^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: range patterns only support integers
-  --> $DIR/nested.rs:17:64
+  --> $DIR/nested.rs:19:64
    |
 LL | const BAD_NESTING3: pattern_type!(pattern_type!(i32 is 1..) is ..0) = todo!();
    |                                                                ^^^
 
 error: `()` is not a valid base type for range patterns
-  --> $DIR/nested.rs:20:35
+  --> $DIR/nested.rs:23:35
    |
 LL | const BAD_NESTING4: pattern_type!(() is ..0) = todo!();
    |                                   ^^
    |
 note: range patterns only support integers
-  --> $DIR/nested.rs:20:41
+  --> $DIR/nested.rs:23:41
    |
 LL | const BAD_NESTING4: pattern_type!(() is ..0) = todo!();
    |                                         ^^^
 
 error: `f32` is not a valid base type for range patterns
-  --> $DIR/nested.rs:23:35
+  --> $DIR/nested.rs:27:35
    |
 LL | const BAD_NESTING5: pattern_type!(f32 is 1.0 .. 2.0) = todo!();
    |                                   ^^^
    |
 note: range patterns only support integers
-  --> $DIR/nested.rs:23:42
+  --> $DIR/nested.rs:27:42
    |
 LL | const BAD_NESTING5: pattern_type!(f32 is 1.0 .. 2.0) = todo!();
    |                                          ^^^^^^^^^^
 
-error: aborting due to 5 previous errors
+error[E0308]: mismatched types
+  --> $DIR/nested.rs:10:63
+   |
+LL | const BAD_NESTING: pattern_type!(pattern_type!(u32 is 1..) is 0..) = todo!();
+   |                                                               ^ expected `(u32) is 1..=`, found integer
+   |
+   = note: expected pattern type `(u32) is 1..=`
+                      found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/nested.rs:15:67
+   |
+LL | const BAD_NESTING2: pattern_type!(pattern_type!(i32 is 1..) is ..=-1) = todo!();
+   |                                                                   ^^ expected `(i32) is 1..=`, found integer
+   |
+   = note: expected pattern type `(i32) is 1..=`
+                      found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/nested.rs:19:66
+   |
+LL | const BAD_NESTING3: pattern_type!(pattern_type!(i32 is 1..) is ..0) = todo!();
+   |                                                                  ^ expected `(i32) is 1..=`, found integer
+   |
+   = note: expected pattern type `(i32) is 1..=`
+                      found type `{integer}`
+
+error[E0308]: mismatched types
+  --> $DIR/nested.rs:23:43
+   |
+LL | const BAD_NESTING4: pattern_type!(() is ..0) = todo!();
+   |                                           ^ expected `()`, found integer
+
+error: aborting due to 9 previous errors
 
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/type/pattern_types/pattern_type_mismatch.rs b/tests/ui/type/pattern_types/pattern_type_mismatch.rs
index 8d375d7932b..0c88f27d836 100644
--- a/tests/ui/type/pattern_types/pattern_type_mismatch.rs
+++ b/tests/ui/type/pattern_types/pattern_type_mismatch.rs
@@ -1,20 +1,16 @@
 //! Check that pattern types patterns must be of the type of the base type
 
-//@ known-bug: unknown
-//@ failure-status: 101
-//@ normalize-stderr: "note: .*\n\n" -> ""
-//@ normalize-stderr: "thread 'rustc' panicked.*\n" -> ""
-//@ normalize-stderr: "(error: internal compiler error: [^:]+):\d+:\d+: " -> "$1:LL:CC: "
-//@ normalize-stderr: "(delayed at compiler/rustc_mir_transform/src/lib.rs:)\d+:\d+" -> "$1:LL:CC"
-//@ rustc-env:RUST_BACKTRACE=0
-
 #![feature(pattern_types)]
 #![feature(pattern_type_macro)]
 
 use std::pat::pattern_type;
 
 const BAD_NESTING4: pattern_type!(u8 is 'a'..='a') = todo!();
+//~^ ERROR: mismatched types
+//~| ERROR: mismatched types
 
 const BAD_NESTING5: pattern_type!(char is 1..=1) = todo!();
+//~^ ERROR: mismatched types
+//~| ERROR: mismatched types
 
 fn main() {}
diff --git a/tests/ui/type/pattern_types/pattern_type_mismatch.stderr b/tests/ui/type/pattern_types/pattern_type_mismatch.stderr
index ee413133ab3..19b0c1059c8 100644
--- a/tests/ui/type/pattern_types/pattern_type_mismatch.stderr
+++ b/tests/ui/type/pattern_types/pattern_type_mismatch.stderr
@@ -1,31 +1,37 @@
-error: internal compiler error: ty::ConstKind::Error constructed but no error reported
+error[E0308]: mismatched types
+  --> $DIR/pattern_type_mismatch.rs:8:41
    |
-   = error: internal compiler error: ty::ConstKind::Error constructed but no error reported
+LL | const BAD_NESTING4: pattern_type!(u8 is 'a'..='a') = todo!();
+   |                                         ^^^ expected `u8`, found `char`
+   |
+help: if you meant to write a byte literal, prefix with `b`
    |
-   = note: delayed at compiler/rustc_mir_build/src/thir/constant.rs:72:21 - disabled backtrace
-   = error: internal compiler error: mir_const_qualif: MIR had errors
-  --> $DIR/pattern_type_mismatch.rs:16:1
+LL | const BAD_NESTING4: pattern_type!(u8 is b'a'..='a') = todo!();
+   |                                         ~~~~
+
+error[E0308]: mismatched types
+  --> $DIR/pattern_type_mismatch.rs:8:47
    |
 LL | const BAD_NESTING4: pattern_type!(u8 is 'a'..='a') = todo!();
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                                               ^^^ expected `u8`, found `char`
    |
-note: delayed at compiler/rustc_mir_transform/src/lib.rs::LL:CC - disabled backtrace
-  --> $DIR/pattern_type_mismatch.rs:16:1
+help: if you meant to write a byte literal, prefix with `b`
    |
-LL | const BAD_NESTING4: pattern_type!(u8 is 'a'..='a') = todo!();
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+LL | const BAD_NESTING4: pattern_type!(u8 is 'a'..=b'a') = todo!();
+   |                                               ~~~~
 
-error: internal compiler error: mir_const_qualif: MIR had errors
-  --> $DIR/pattern_type_mismatch.rs:18:1
+error[E0308]: mismatched types
+  --> $DIR/pattern_type_mismatch.rs:12:43
    |
 LL | const BAD_NESTING5: pattern_type!(char is 1..=1) = todo!();
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-note: delayed at compiler/rustc_mir_transform/src/lib.rs::LL:CC - disabled backtrace
-  --> $DIR/pattern_type_mismatch.rs:18:1
+   |                                           ^ expected `char`, found `u8`
+
+error[E0308]: mismatched types
+  --> $DIR/pattern_type_mismatch.rs:12:47
    |
 LL | const BAD_NESTING5: pattern_type!(char is 1..=1) = todo!();
-   | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                                               ^ expected `char`, found `u8`
+
+error: aborting due to 4 previous errors
 
-query stack during panic:
-end of query stack
+For more information about this error, try `rustc --explain E0308`.
diff --git a/tests/ui/type/pattern_types/signed_ranges.rs b/tests/ui/type/pattern_types/signed_ranges.rs
new file mode 100644
index 00000000000..3725fbda729
--- /dev/null
+++ b/tests/ui/type/pattern_types/signed_ranges.rs
@@ -0,0 +1,24 @@
+#![feature(pattern_types)]
+#![feature(pattern_type_macro)]
+
+use std::pat::pattern_type;
+
+type Sign = pattern_type!(u32 is -10..);
+//~^ ERROR: cannot apply unary operator `-`
+
+type SignedChar = pattern_type!(char is -'A'..);
+//~^ ERROR: cannot apply unary operator `-`
+
+fn main() {
+    match 42_u8 {
+        -10..253 => {}
+        //~^ ERROR `u8: Neg` is not satisfied
+        _ => {}
+    }
+
+    match 'A' {
+        -'\0'..'a' => {}
+        //~^ ERROR `char: Neg` is not satisfied
+        _ => {}
+    }
+}
diff --git a/tests/ui/type/pattern_types/signed_ranges.stderr b/tests/ui/type/pattern_types/signed_ranges.stderr
new file mode 100644
index 00000000000..79bf8501b63
--- /dev/null
+++ b/tests/ui/type/pattern_types/signed_ranges.stderr
@@ -0,0 +1,41 @@
+error[E0277]: the trait bound `u8: Neg` is not satisfied
+  --> $DIR/signed_ranges.rs:14:9
+   |
+LL |         -10..253 => {}
+   |         ^^^ the trait `Neg` is not implemented for `u8`
+   |
+   = help: the following other types implement trait `Neg`:
+             &f128
+             &f16
+             &f32
+             &f64
+             &i128
+             &i16
+             &i32
+             &i64
+           and 12 others
+
+error[E0277]: the trait bound `char: Neg` is not satisfied
+  --> $DIR/signed_ranges.rs:20:9
+   |
+LL |         -'\0'..'a' => {}
+   |         ^^^^^ the trait `Neg` is not implemented for `char`
+
+error[E0600]: cannot apply unary operator `-` to type `u32`
+  --> $DIR/signed_ranges.rs:6:34
+   |
+LL | type Sign = pattern_type!(u32 is -10..);
+   |                                  ^^^ cannot apply unary operator `-`
+   |
+   = note: unsigned values cannot be negated
+
+error[E0600]: cannot apply unary operator `-` to type `char`
+  --> $DIR/signed_ranges.rs:9:41
+   |
+LL | type SignedChar = pattern_type!(char is -'A'..);
+   |                                         ^^^^ cannot apply unary operator `-`
+
+error: aborting due to 4 previous errors
+
+Some errors have detailed explanations: E0277, E0600.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/type/pattern_types/unimplemented_pat.rs b/tests/ui/type/pattern_types/unimplemented_pat.rs
index b2398cec7c9..44851ec1a10 100644
--- a/tests/ui/type/pattern_types/unimplemented_pat.rs
+++ b/tests/ui/type/pattern_types/unimplemented_pat.rs
@@ -1,14 +1,14 @@
 //! This test ensures we do not ICE for unimplemented
-//! patterns unless the feature gate is enabled.
+//! patterns even if the feature gate is enabled.
 
-#![feature(pattern_type_macro)]
+#![feature(pattern_type_macro, pattern_types)]
 
 use std::pat::pattern_type;
 
 type Always = pattern_type!(Option<u32> is Some(_));
-//~^ ERROR: pattern types are unstable
+//~^ ERROR: pattern not supported
 
 type Binding = pattern_type!(Option<u32> is x);
-//~^ ERROR: pattern types are unstable
+//~^ ERROR: pattern not supported
 
 fn main() {}
diff --git a/tests/ui/type/pattern_types/unimplemented_pat.stderr b/tests/ui/type/pattern_types/unimplemented_pat.stderr
index 7b0f9cbaa6a..a1e55ed02c4 100644
--- a/tests/ui/type/pattern_types/unimplemented_pat.stderr
+++ b/tests/ui/type/pattern_types/unimplemented_pat.stderr
@@ -1,23 +1,14 @@
-error[E0658]: pattern types are unstable
-  --> $DIR/unimplemented_pat.rs:8:15
+error: pattern not supported in pattern types
+  --> $DIR/unimplemented_pat.rs:8:44
    |
 LL | type Always = pattern_type!(Option<u32> is Some(_));
-   |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: see issue #123646 <https://github.com/rust-lang/rust/issues/123646> for more information
-   = help: add `#![feature(pattern_types)]` to the crate attributes to enable
-   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+   |                                            ^^^^^^^
 
-error[E0658]: pattern types are unstable
-  --> $DIR/unimplemented_pat.rs:11:16
+error: pattern not supported in pattern types
+  --> $DIR/unimplemented_pat.rs:11:45
    |
 LL | type Binding = pattern_type!(Option<u32> is x);
-   |                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-   |
-   = note: see issue #123646 <https://github.com/rust-lang/rust/issues/123646> for more information
-   = help: add `#![feature(pattern_types)]` to the crate attributes to enable
-   = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
+   |                                             ^
 
 error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0658`.
diff --git a/tests/ui/issues/issue-40610.rs b/tests/ui/typeck/coercion-check-for-addition-issue-40610.rs
index c01233605b5..c01233605b5 100644
--- a/tests/ui/issues/issue-40610.rs
+++ b/tests/ui/typeck/coercion-check-for-addition-issue-40610.rs
diff --git a/tests/ui/issues/issue-40610.stderr b/tests/ui/typeck/coercion-check-for-addition-issue-40610.stderr
index 1bd1c4dd57d..5e424862d97 100644
--- a/tests/ui/issues/issue-40610.stderr
+++ b/tests/ui/typeck/coercion-check-for-addition-issue-40610.stderr
@@ -1,5 +1,5 @@
 error[E0369]: cannot add `()` to `()`
-  --> $DIR/issue-40610.rs:4:8
+  --> $DIR/coercion-check-for-addition-issue-40610.rs:4:8
    |
 LL |     () + f(&[1.0]);
    |     -- ^ --------- ()
diff --git a/tests/ui/issues/issue-40861.rs b/tests/ui/typeck/coercion-check-for-indexing-expression-issue-40861.rs
index d8a8384a544..d8a8384a544 100644
--- a/tests/ui/issues/issue-40861.rs
+++ b/tests/ui/typeck/coercion-check-for-indexing-expression-issue-40861.rs
diff --git a/tests/ui/issues/issue-40861.stderr b/tests/ui/typeck/coercion-check-for-indexing-expression-issue-40861.stderr
index dec9af4b6d1..13bc0cd94f3 100644
--- a/tests/ui/issues/issue-40861.stderr
+++ b/tests/ui/typeck/coercion-check-for-indexing-expression-issue-40861.stderr
@@ -1,5 +1,5 @@
 error[E0608]: cannot index into a value of type `()`
-  --> $DIR/issue-40861.rs:4:7
+  --> $DIR/coercion-check-for-indexing-expression-issue-40861.rs:4:7
    |
 LL |     ()[f(&[1.0])];
    |       ^^^^^^^^^^^
diff --git a/tests/ui/typeck/issue-105946.rs b/tests/ui/typeck/issue-105946.rs
index f53f31138f8..0ee70f9346c 100644
--- a/tests/ui/typeck/issue-105946.rs
+++ b/tests/ui/typeck/issue-105946.rs
@@ -1,4 +1,5 @@
 fn digit() -> str {
+    //~^ ERROR the size for values of type
     return {};
     //~^ ERROR: mismatched types [E0308]
 }
diff --git a/tests/ui/typeck/issue-105946.stderr b/tests/ui/typeck/issue-105946.stderr
index 33d4e0b141a..30fe2000a46 100644
--- a/tests/ui/typeck/issue-105946.stderr
+++ b/tests/ui/typeck/issue-105946.stderr
@@ -1,5 +1,5 @@
 error[E0425]: cannot find value `_y` in this scope
-  --> $DIR/issue-105946.rs:6:10
+  --> $DIR/issue-105946.rs:7:10
    |
 LL |     let [_y..] = [Box::new(1), Box::new(2)];
    |          ^^ not found in this scope
@@ -10,7 +10,7 @@ LL |     let [_y @ ..] = [Box::new(1), Box::new(2)];
    |             +
 
 error[E0658]: `X..` patterns in slices are experimental
-  --> $DIR/issue-105946.rs:6:10
+  --> $DIR/issue-105946.rs:7:10
    |
 LL |     let [_y..] = [Box::new(1), Box::new(2)];
    |          ^^^^
@@ -19,19 +19,28 @@ LL |     let [_y..] = [Box::new(1), Box::new(2)];
    = help: add `#![feature(half_open_range_patterns_in_slices)]` to the crate attributes to enable
    = note: this compiler was built on YYYY-MM-DD; consider upgrading it if it is out of date
 
+error[E0277]: the size for values of type `str` cannot be known at compilation time
+  --> $DIR/issue-105946.rs:1:15
+   |
+LL | fn digit() -> str {
+   |               ^^^ doesn't have a size known at compile-time
+   |
+   = help: the trait `Sized` is not implemented for `str`
+   = note: the return type of a function must have a statically known size
+
 error[E0308]: mismatched types
-  --> $DIR/issue-105946.rs:2:12
+  --> $DIR/issue-105946.rs:3:12
    |
 LL |     return {};
    |            ^^ expected `str`, found `()`
 
 error[E0527]: pattern requires 1 element but array has 2
-  --> $DIR/issue-105946.rs:6:9
+  --> $DIR/issue-105946.rs:7:9
    |
 LL |     let [_y..] = [Box::new(1), Box::new(2)];
    |         ^^^^^^ expected 2 elements
 
-error: aborting due to 4 previous errors
+error: aborting due to 5 previous errors
 
-Some errors have detailed explanations: E0308, E0425, E0527, E0658.
-For more information about an error, try `rustc --explain E0308`.
+Some errors have detailed explanations: E0277, E0308, E0425, E0527, E0658.
+For more information about an error, try `rustc --explain E0277`.
diff --git a/tests/ui/issues/issue-41139.rs b/tests/ui/typeck/unsized-rvalue-issue-41139.rs
index 94c53216f50..94c53216f50 100644
--- a/tests/ui/issues/issue-41139.rs
+++ b/tests/ui/typeck/unsized-rvalue-issue-41139.rs
diff --git a/tests/ui/issues/issue-41139.stderr b/tests/ui/typeck/unsized-rvalue-issue-41139.stderr
index d7b35245d8f..aba0423eeb3 100644
--- a/tests/ui/issues/issue-41139.stderr
+++ b/tests/ui/typeck/unsized-rvalue-issue-41139.stderr
@@ -1,5 +1,5 @@
 error[E0618]: expected function, found `&dyn Fn() -> (dyn Trait + 'static)`
-  --> $DIR/issue-41139.rs:10:26
+  --> $DIR/unsized-rvalue-issue-41139.rs:10:26
    |
 LL | fn get_function<'a>() -> &'a dyn Fn() -> dyn Trait {
    | -------------------------------------------------- `get_function` defined here returns `&dyn Fn() -> (dyn Trait + 'static)`
diff --git a/tests/ui/unsized/box-instead-of-dyn-fn.rs b/tests/ui/unsized/box-instead-of-dyn-fn.rs
index 321c2ebf5a1..720176081d6 100644
--- a/tests/ui/unsized/box-instead-of-dyn-fn.rs
+++ b/tests/ui/unsized/box-instead-of-dyn-fn.rs
@@ -3,7 +3,7 @@ use std::fmt::Debug;
 // Test to suggest boxing the return type, and the closure branch of the `if`
 
 fn print_on_or_the_other<'a>(a: i32, b: &'a String) -> dyn Fn() + 'a {
-    //~^ ERROR return type cannot have an unboxed trait object
+    //~^ ERROR return type cannot be a trait object without pointer indirection
     if a % 2 == 0 {
         move || println!("{a}")
     } else {
diff --git a/tests/ui/unsized/box-instead-of-dyn-fn.stderr b/tests/ui/unsized/box-instead-of-dyn-fn.stderr
index 1f1845569ef..1836d5dfffe 100644
--- a/tests/ui/unsized/box-instead-of-dyn-fn.stderr
+++ b/tests/ui/unsized/box-instead-of-dyn-fn.stderr
@@ -1,4 +1,4 @@
-error[E0746]: return type cannot have an unboxed trait object
+error[E0746]: return type cannot be a trait object without pointer indirection
   --> $DIR/box-instead-of-dyn-fn.rs:5:56
    |
 LL | fn print_on_or_the_other<'a>(a: i32, b: &'a String) -> dyn Fn() + 'a {
diff --git a/tests/ui/unsized/issue-91801.rs b/tests/ui/unsized/issue-91801.rs
index 096b1a93574..d906a08a55a 100644
--- a/tests/ui/unsized/issue-91801.rs
+++ b/tests/ui/unsized/issue-91801.rs
@@ -6,7 +6,7 @@ pub static ALL_VALIDATORS: &[(&'static str, &'static Validator)] =
     &[("validate that credits and debits balance", &validate_something)];
 
 fn or<'a>(first: &'static Validator<'a>, second: &'static Validator<'a>) -> Validator<'a> {
-    //~^ ERROR return type cannot have an unboxed trait object
+    //~^ ERROR return type cannot be a trait object without pointer indirection
     return Box::new(move |something: &'_ Something| -> Result<(), ()> {
         first(something).or_else(|_| second(something))
     });
diff --git a/tests/ui/unsized/issue-91801.stderr b/tests/ui/unsized/issue-91801.stderr
index e13cabbb81d..28e10f9caa4 100644
--- a/tests/ui/unsized/issue-91801.stderr
+++ b/tests/ui/unsized/issue-91801.stderr
@@ -1,4 +1,4 @@
-error[E0746]: return type cannot have an unboxed trait object
+error[E0746]: return type cannot be a trait object without pointer indirection
   --> $DIR/issue-91801.rs:8:77
    |
 LL | fn or<'a>(first: &'static Validator<'a>, second: &'static Validator<'a>) -> Validator<'a> {
diff --git a/tests/ui/unsized/issue-91803.rs b/tests/ui/unsized/issue-91803.rs
index c74897cc4bc..8d35c7582b8 100644
--- a/tests/ui/unsized/issue-91803.rs
+++ b/tests/ui/unsized/issue-91803.rs
@@ -1,7 +1,7 @@
 trait Foo<'a> {}
 
 fn or<'a>(first: &'static dyn Foo<'a>) -> dyn Foo<'a> {
-    //~^ ERROR return type cannot have an unboxed trait object
+    //~^ ERROR return type cannot be a trait object without pointer indirection
     return Box::new(panic!());
 }
 
diff --git a/tests/ui/unsized/issue-91803.stderr b/tests/ui/unsized/issue-91803.stderr
index 3b89066499d..e0fde4b1c1b 100644
--- a/tests/ui/unsized/issue-91803.stderr
+++ b/tests/ui/unsized/issue-91803.stderr
@@ -1,4 +1,4 @@
-error[E0746]: return type cannot have an unboxed trait object
+error[E0746]: return type cannot be a trait object without pointer indirection
   --> $DIR/issue-91803.rs:3:43
    |
 LL | fn or<'a>(first: &'static dyn Foo<'a>) -> dyn Foo<'a> {
diff --git a/tests/ui/issues/issue-40749.rs b/tests/ui/wf/range-expr-root-of-constant-issue-40749.rs
index 0a847853b12..0a847853b12 100644
--- a/tests/ui/issues/issue-40749.rs
+++ b/tests/ui/wf/range-expr-root-of-constant-issue-40749.rs
diff --git a/tests/ui/issues/issue-40749.stderr b/tests/ui/wf/range-expr-root-of-constant-issue-40749.stderr
index f7770e00013..482773a3944 100644
--- a/tests/ui/issues/issue-40749.stderr
+++ b/tests/ui/wf/range-expr-root-of-constant-issue-40749.stderr
@@ -1,5 +1,5 @@
 error[E0308]: mismatched types
-  --> $DIR/issue-40749.rs:2:9
+  --> $DIR/range-expr-root-of-constant-issue-40749.rs:2:9
    |
 LL |     [0; ..10];
    |         ^^^^ expected `usize`, found `RangeTo<{integer}>`
diff --git a/tests/ui/where-clauses/ignore-err-clauses.rs b/tests/ui/where-clauses/ignore-err-clauses.rs
index c76f0e1a8b2..428ebf4b408 100644
--- a/tests/ui/where-clauses/ignore-err-clauses.rs
+++ b/tests/ui/where-clauses/ignore-err-clauses.rs
@@ -1,6 +1,7 @@
 use std::ops::Add;
 
 fn dbl<T>(x: T) -> <T as Add>::Output
+//~^ ERROR type annotations needed
 where
     T: Copy + Add,
     UUU: Copy,
diff --git a/tests/ui/where-clauses/ignore-err-clauses.stderr b/tests/ui/where-clauses/ignore-err-clauses.stderr
index 4cf553da4c5..fbf1b99334f 100644
--- a/tests/ui/where-clauses/ignore-err-clauses.stderr
+++ b/tests/ui/where-clauses/ignore-err-clauses.stderr
@@ -1,9 +1,16 @@
 error[E0412]: cannot find type `UUU` in this scope
-  --> $DIR/ignore-err-clauses.rs:6:5
+  --> $DIR/ignore-err-clauses.rs:7:5
    |
 LL |     UUU: Copy,
    |     ^^^ not found in this scope
 
-error: aborting due to 1 previous error
+error[E0282]: type annotations needed
+  --> $DIR/ignore-err-clauses.rs:3:14
+   |
+LL | fn dbl<T>(x: T) -> <T as Add>::Output
+   |              ^ cannot infer type for type parameter `T`
+
+error: aborting due to 2 previous errors
 
-For more information about this error, try `rustc --explain E0412`.
+Some errors have detailed explanations: E0282, E0412.
+For more information about an error, try `rustc --explain E0282`.
diff --git a/tests/ui/issues/issue-40235.rs b/tests/ui/while/while-let-scope-issue-40235.rs
index 2bdbb2f229e..7d5dfc64a90 100644
--- a/tests/ui/issues/issue-40235.rs
+++ b/tests/ui/while/while-let-scope-issue-40235.rs
@@ -1,4 +1,4 @@
-//@ run-pass
+//@ check-pass
 #![allow(unused_variables)]
 fn foo() {}