about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs52
-rw-r--r--compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp2
-rw-r--r--compiler/rustc_pattern_analysis/src/constructor.rs4
-rw-r--r--compiler/rustc_pattern_analysis/src/lib.rs7
-rw-r--r--compiler/rustc_pattern_analysis/src/usefulness.rs7
-rw-r--r--compiler/rustc_pattern_analysis/tests/common/mod.rs48
-rw-r--r--compiler/rustc_pattern_analysis/tests/complexity.rs2
-rw-r--r--compiler/rustc_pattern_analysis/tests/exhaustiveness.rs112
-rw-r--r--compiler/rustc_pattern_analysis/tests/intersection.rs2
-rw-r--r--library/Cargo.lock4
-rw-r--r--library/std/Cargo.toml2
-rw-r--r--src/bootstrap/src/core/sanity.rs6
-rw-r--r--src/bootstrap/src/lib.rs26
-rw-r--r--src/tools/compiletest/src/directives/cfg.rs5
-rw-r--r--tests/assembly-llvm/dwarf-mixed-versions-lto.rs7
-rw-r--r--tests/codegen-llvm/const-vector.rs2
-rw-r--r--tests/ui/allocator/no_std-alloc-error-handler-custom.rs1
-rw-r--r--tests/ui/allocator/no_std-alloc-error-handler-default.rs1
-rw-r--r--tests/ui/asm/may_unwind.rs1
-rw-r--r--tests/ui/asm/x86_64/may_unwind.rs1
-rw-r--r--tests/ui/async-await/deep-futures-are-freeze.rs1
-rw-r--r--tests/ui/async-await/in-trait/dont-project-to-specializable-projection.rs1
-rw-r--r--tests/ui/async-await/in-trait/dont-project-to-specializable-projection.stderr8
-rw-r--r--tests/ui/backtrace/dylib-dep.rs1
-rw-r--r--tests/ui/borrowck/borrowck-partial-reinit-1.stderr18
-rw-r--r--tests/ui/borrowck/borrowck-partial-reinit-2.stderr9
-rw-r--r--tests/ui/borrowck/borrowck-union-move-assign.stderr9
-rw-r--r--tests/ui/borrowck/borrowck-union-move.stderr54
-rw-r--r--tests/ui/borrowck/issue-54499-field-mutation-of-moved-out-with-mut.stderr18
-rw-r--r--tests/ui/borrowck/issue-54499-field-mutation-of-moved-out.stderr18
-rw-r--r--tests/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr8
-rw-r--r--tests/ui/cast/trait-object-cast-segfault-4333.rs (renamed from tests/ui/issues/issue-4333.rs)2
-rw-r--r--tests/ui/cfg/cfg-panic-abort.rs1
-rw-r--r--tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2018.stderr9
-rw-r--r--tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2021.stderr9
-rw-r--r--tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs2
-rw-r--r--tests/ui/codegen/dynamic-size-of-prefix-correctly-36278.rs (renamed from tests/ui/issues/issue-36278-prefix-nesting.rs)2
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/as-cast/inline1.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/as-cast/inline2.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/as-cast/segfault.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/as-cast/zero.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline1.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline2.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/exposed-provenance/segfault.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/exposed-provenance/zero.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline1.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline2.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/strict-provenance/segfault.rs1
-rw-r--r--tests/ui/codegen/equal-pointers-unequal/strict-provenance/zero.rs1
-rw-r--r--tests/ui/const-generics/generic-parameter-in-const-expression-39211.rs (renamed from tests/ui/issues/issue-39211.rs)2
-rw-r--r--tests/ui/const-generics/generic-parameter-in-const-expression-39211.stderr (renamed from tests/ui/issues/issue-39211.stderr)4
-rw-r--r--tests/ui/consts/const-eval/parse_ints.rs2
-rw-r--r--tests/ui/consts/const-eval/parse_ints.stderr4
-rw-r--r--tests/ui/consts/const_cmp_type_id.rs1
-rw-r--r--tests/ui/consts/const_cmp_type_id.stderr2
-rw-r--r--tests/ui/consts/issue-73976-monomorphic.rs1
-rw-r--r--tests/ui/consts/issue-94675.rs2
-rw-r--r--tests/ui/consts/issue-94675.stderr6
-rw-r--r--tests/ui/consts/issue-miri-1910.rs1
-rw-r--r--tests/ui/consts/issue-miri-1910.stderr2
-rw-r--r--tests/ui/consts/missing_span_in_backtrace.rs1
-rw-r--r--tests/ui/consts/missing_span_in_backtrace.stderr12
-rw-r--r--tests/ui/consts/try-operator.rs1
-rw-r--r--tests/ui/coroutine/panic-drops-resume.rs1
-rw-r--r--tests/ui/coroutine/panic-drops.rs1
-rw-r--r--tests/ui/coroutine/panic-safe.rs2
-rw-r--r--tests/ui/coroutine/resume-after-return.rs1
-rw-r--r--tests/ui/coroutine/unwind-abort-mix.rs1
-rw-r--r--tests/ui/cross-crate/auxiliary/exporting-impl-from-root-causes-ice-2472-b.rs (renamed from tests/ui/issues/auxiliary/issue-2472-b.rs)0
-rw-r--r--tests/ui/cross-crate/exporting-impl-from-root-causes-ice-2472.rs15
-rw-r--r--tests/ui/delegation/fn-header.rs1
-rw-r--r--tests/ui/derives/invalid-derive-comparison-34229.rs (renamed from tests/ui/issues/issue-34229.rs)2
-rw-r--r--tests/ui/derives/invalid-derive-comparison-34229.stderr (renamed from tests/ui/issues/issue-34229.stderr)2
-rw-r--r--tests/ui/drop/drop-immediate-non-box-ty-9446.rs (renamed from tests/ui/issues/issue-9446.rs)2
-rw-r--r--tests/ui/drop/dynamic-drop-async.rs1
-rw-r--r--tests/ui/drop/dynamic-drop.rs1
-rw-r--r--tests/ui/enum/recursive-enum-memory-32326.rs (renamed from tests/ui/issues/issue-32326.rs)2
-rw-r--r--tests/ui/enum/recursive-enum-memory-32326.stderr (renamed from tests/ui/issues/issue-32326.stderr)2
-rw-r--r--tests/ui/generics/auxiliary/generic-impl-method-match-autoderef-18514.rs (renamed from tests/ui/issues/auxiliary/issue-18514.rs)0
-rw-r--r--tests/ui/generics/generic-impl-method-match-autoderef-18514.rs (renamed from tests/ui/issues/issue-18514.rs)6
-rw-r--r--tests/ui/intrinsics/panic-uninitialized-zeroed.rs1
-rw-r--r--tests/ui/issues/issue-14875.rs1
-rw-r--r--tests/ui/issues/issue-2472.rs13
-rw-r--r--tests/ui/issues/issue-29948.rs1
-rw-r--r--tests/ui/issues/issue-49544.rs9
-rw-r--r--tests/ui/iterators/auxiliary/iterator-adapter-undeclared-type-49544.rs (renamed from tests/ui/issues/auxiliary/issue-49544.rs)0
-rw-r--r--tests/ui/iterators/iter-sum-overflow-debug.rs1
-rw-r--r--tests/ui/iterators/iter-sum-overflow-overflow-checks.rs1
-rw-r--r--tests/ui/iterators/iterator-adapter-undeclared-type-49544.rs11
-rw-r--r--tests/ui/lto/all-crates.rs1
-rw-r--r--tests/ui/lto/lto-thin-rustc-loads-linker-plugin.rs1
-rw-r--r--tests/ui/lto/thin-lto-inlines2.rs1
-rw-r--r--tests/ui/macros/macro-invocation-with-curly-braces-34418.rs (renamed from tests/ui/issues/issue-34418.rs)2
-rw-r--r--tests/ui/marker_trait_attr/conflicting-send-impls-for-marker-trait-106755.rs (renamed from tests/ui/issues/issue-106755.rs)2
-rw-r--r--tests/ui/marker_trait_attr/conflicting-send-impls-for-marker-trait-106755.stderr (renamed from tests/ui/issues/issue-106755.stderr)12
-rw-r--r--tests/ui/match/innocent-looking-match-crash-46964.rs (renamed from tests/ui/issues/issue-46964.rs)2
-rw-r--r--tests/ui/methods/inherent-method-resolution-on-deref-type-53843.rs (renamed from tests/ui/issues/issue-53843.rs)2
-rw-r--r--tests/ui/mir/mir_drop_order.rs1
-rw-r--r--tests/ui/mir/mir_let_chains_drop_order.rs1
-rw-r--r--tests/ui/mir/mir_match_guard_let_chains_drop_order.rs1
-rw-r--r--tests/ui/moves/suggest-clone-when-some-obligation-is-unmet.stderr8
-rw-r--r--tests/ui/nll/issue-21232-partial-init-and-erroneous-use.stderr18
-rw-r--r--tests/ui/numbers-arithmetic/u128-as-f32.rs1
-rw-r--r--tests/ui/panic-runtime/abort-link-to-unwinding-crates.rs1
-rw-r--r--tests/ui/panic-runtime/abort.rs1
-rw-r--r--tests/ui/panic-runtime/link-to-abort.rs1
-rw-r--r--tests/ui/panic-runtime/lto-abort.rs1
-rw-r--r--tests/ui/parser/unclosed-delimiter-in-dep.rs2
-rw-r--r--tests/ui/pattern/move-ref-patterns/move-ref-patterns-closure-captures-inside.stderr81
-rw-r--r--tests/ui/privacy/private-field-access-in-mutex-54062.rs (renamed from tests/ui/issues/issue-54062.rs)2
-rw-r--r--tests/ui/privacy/private-field-access-in-mutex-54062.stderr (renamed from tests/ui/issues/issue-54062.stderr)2
-rw-r--r--tests/ui/process/nofile-limit.rs2
-rw-r--r--tests/ui/process/println-with-broken-pipe.rs1
-rw-r--r--tests/ui/recursion/recursive-impl-trait-iterator-by-ref-67552.rs (renamed from tests/ui/issues/issue-67552.rs)2
-rw-r--r--tests/ui/recursion/recursive-impl-trait-iterator-by-ref-67552.stderr (renamed from tests/ui/issues/issue-67552.stderr)6
-rw-r--r--tests/ui/return/early-return-with-unreachable-code-24353.rs (renamed from tests/ui/issues/issue-24353.rs)2
-rw-r--r--tests/ui/rfcs/rfc-2091-track-caller/std-panic-locations.rs1
-rw-r--r--tests/ui/runtime/on-broken-pipe/child-processes.rs1
-rw-r--r--tests/ui/runtime/rt-explody-panic-payloads.rs1
-rw-r--r--tests/ui/sanitizer/cfi/assoc-ty-lifetime-issue-123053.rs1
-rw-r--r--tests/ui/sanitizer/cfi/async-closures.rs1
-rw-r--r--tests/ui/sanitizer/cfi/can-reveal-opaques.rs1
-rw-r--r--tests/ui/sanitizer/cfi/closures.rs1
-rw-r--r--tests/ui/sanitizer/cfi/complex-receiver.rs1
-rw-r--r--tests/ui/sanitizer/cfi/coroutine.rs1
-rw-r--r--tests/ui/sanitizer/cfi/drop-in-place.rs1
-rw-r--r--tests/ui/sanitizer/cfi/drop-no-principal.rs1
-rw-r--r--tests/ui/sanitizer/cfi/fn-ptr.rs1
-rw-r--r--tests/ui/sanitizer/cfi/self-ref.rs1
-rw-r--r--tests/ui/sanitizer/cfi/sized-associated-ty.rs1
-rw-r--r--tests/ui/sanitizer/cfi/supertraits.rs1
-rw-r--r--tests/ui/sanitizer/cfi/virtual-auto.rs1
-rw-r--r--tests/ui/sanitizer/kcfi-mangling.rs1
-rw-r--r--tests/ui/simd/intrinsic/generic-arithmetic-pass.rs2
-rw-r--r--tests/ui/simd/intrinsic/generic-as.rs1
-rw-r--r--tests/ui/simd/issue-17170.rs2
-rw-r--r--tests/ui/simd/issue-39720.rs1
-rw-r--r--tests/ui/simd/masked-load-store.rs1
-rw-r--r--tests/ui/simd/repr_packed.rs1
-rw-r--r--tests/ui/simd/simd-bitmask-notpow2.rs2
-rw-r--r--tests/ui/sized/relaxing-default-bound-error-37534.rs (renamed from tests/ui/issues/issue-37534.rs)2
-rw-r--r--tests/ui/sized/relaxing-default-bound-error-37534.stderr (renamed from tests/ui/issues/issue-37534.stderr)4
-rw-r--r--tests/ui/static/static-items-cant-move.stderr9
-rw-r--r--tests/ui/statics/const_generics.rs1
-rw-r--r--tests/ui/structs/trie-node-structure-usage-3389.rs (renamed from tests/ui/issues/issue-3389.rs)2
-rw-r--r--tests/ui/suggestions/option-content-move2.stderr9
-rw-r--r--tests/ui/trait-bounds/for-binder-placement-error-39089.rs (renamed from tests/ui/issues/issue-39089.rs)2
-rw-r--r--tests/ui/trait-bounds/for-binder-placement-error-39089.stderr (renamed from tests/ui/issues/issue-39089.stderr)2
-rw-r--r--tests/ui/traits/const-traits/const-drop-fail.new_precise.stderr8
-rw-r--r--tests/ui/traits/const-traits/const-drop-fail.new_stock.stderr8
-rw-r--r--tests/ui/traits/const-traits/const-drop-fail.old_precise.stderr8
-rw-r--r--tests/ui/traits/const-traits/const-drop-fail.old_stock.stderr8
-rw-r--r--tests/ui/traits/const-traits/const-drop-fail.rs1
-rw-r--r--tests/ui/traits/dyn-trait-size-error-23281.rs (renamed from tests/ui/issues/issue-23281.rs)2
-rw-r--r--tests/ui/traits/dyn-trait-size-error-23281.stderr (renamed from tests/ui/issues/issue-23281.stderr)6
-rw-r--r--tests/ui/traits/trait-associated-type-bounds-36839.rs (renamed from tests/ui/issues/issue-36839.rs)2
-rw-r--r--tests/ui/traits/trait-implementation-for-primitive-type-5280.rs (renamed from tests/ui/issues/issue-5280.rs)2
-rw-r--r--tests/ui/traits/trait-implementation-for-usize-5321.rs (renamed from tests/ui/issues/issue-5321-immediates-with-bare-self.rs)2
-rw-r--r--tests/ui/transmutability/transmute-between-associated-types-with-lifetimers-21174.rs (renamed from tests/ui/issues/issue-21174.rs)2
-rw-r--r--tests/ui/transmutability/transmute-between-associated-types-with-lifetimers-21174.stderr (renamed from tests/ui/issues/issue-21174.stderr)2
-rw-r--r--tests/ui/type-inference/float-type-inference-unification-14382.rs (renamed from tests/ui/issues/issue-14382.rs)2
-rw-r--r--tests/ui/unboxed-closures/fn-traits-overloading-arity-18952.rs (renamed from tests/ui/issues/issue-18952.rs)2
-rw-r--r--tests/ui/unboxed-closures/unboxed-closure-call-22789.rs (renamed from tests/ui/issues/issue-22789.rs)2
-rw-r--r--tests/ui/uninhabited/uninhabited-transparent-return-abi.rs1
-rw-r--r--tests/ui/union/union-borrow-move-parent-sibling.stderr18
-rw-r--r--tests/ui/unreachable-code/unreachable-bool-read-7246.rs (renamed from tests/ui/issues/issue-7246.rs)2
-rw-r--r--tests/ui/unreachable-code/unreachable-bool-read-7246.stderr (renamed from tests/ui/issues/issue-7246.stderr)6
-rw-r--r--tests/ui/unsafe-binders/moves.stderr9
-rw-r--r--tests/ui/unsized/unsized-function-argument-41229.rs (renamed from tests/ui/issues/issue-41229-ref-str.rs)2
-rw-r--r--tests/ui/unsized/unsized-function-argument-41229.stderr (renamed from tests/ui/issues/issue-41229-ref-str.stderr)2
-rw-r--r--tests/ui/use/use-after-move-implicity-coerced-object.stderr8
171 files changed, 788 insertions, 125 deletions
diff --git a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
index 040a0607db5..7031a9bb3d4 100644
--- a/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
+++ b/compiler/rustc_borrowck/src/diagnostics/conflict_errors.rs
@@ -1290,6 +1290,58 @@ impl<'infcx, 'tcx> MirBorrowckCtxt<'_, 'infcx, 'tcx> {
                 span,
                 format!("if `{ty}` implemented `Clone`, you could clone the value"),
             );
+        } else if let ty::Adt(_, _) = ty.kind()
+            && let Some(clone_trait) = self.infcx.tcx.lang_items().clone_trait()
+        {
+            // For cases like `Option<NonClone>`, where `Option<T>: Clone` if `T: Clone`, we point
+            // at the types that should be `Clone`.
+            let ocx = ObligationCtxt::new_with_diagnostics(self.infcx);
+            let cause = ObligationCause::misc(expr.span, self.mir_def_id());
+            ocx.register_bound(cause, self.infcx.param_env, ty, clone_trait);
+            let errors = ocx.select_all_or_error();
+            if errors.iter().all(|error| {
+                match error.obligation.predicate.as_clause().and_then(|c| c.as_trait_clause()) {
+                    Some(clause) => match clause.self_ty().skip_binder().kind() {
+                        ty::Adt(def, _) => def.did().is_local() && clause.def_id() == clone_trait,
+                        _ => false,
+                    },
+                    None => false,
+                }
+            }) {
+                let mut type_spans = vec![];
+                let mut types = FxIndexSet::default();
+                for clause in errors
+                    .iter()
+                    .filter_map(|e| e.obligation.predicate.as_clause())
+                    .filter_map(|c| c.as_trait_clause())
+                {
+                    let ty::Adt(def, _) = clause.self_ty().skip_binder().kind() else { continue };
+                    type_spans.push(self.infcx.tcx.def_span(def.did()));
+                    types.insert(
+                        self.infcx
+                            .tcx
+                            .short_string(clause.self_ty().skip_binder(), &mut err.long_ty_path()),
+                    );
+                }
+                let mut span: MultiSpan = type_spans.clone().into();
+                for sp in type_spans {
+                    span.push_span_label(sp, "consider implementing `Clone` for this type");
+                }
+                span.push_span_label(expr.span, "you could clone this value");
+                let types: Vec<_> = types.into_iter().collect();
+                let msg = match &types[..] {
+                    [only] => format!("`{only}`"),
+                    [head @ .., last] => format!(
+                        "{} and `{last}`",
+                        head.iter().map(|t| format!("`{t}`")).collect::<Vec<_>>().join(", ")
+                    ),
+                    [] => unreachable!(),
+                };
+                err.span_note(
+                    span,
+                    format!("if {msg} implemented `Clone`, you could clone the value"),
+                );
+            }
         }
     }
 
diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
index 82568ed4ae1..c9814beedd6 100644
--- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
+++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp
@@ -1610,7 +1610,7 @@ extern "C" void LLVMRustPositionBefore(LLVMBuilderRef B, LLVMValueRef Instr) {
 
 extern "C" void LLVMRustPositionAfter(LLVMBuilderRef B, LLVMValueRef Instr) {
   if (auto I = dyn_cast<Instruction>(unwrap<Value>(Instr))) {
-    auto J = I->getNextNonDebugInstruction();
+    auto J = I->getNextNode();
     unwrap(B)->SetInsertPoint(J);
   }
 }
diff --git a/compiler/rustc_pattern_analysis/src/constructor.rs b/compiler/rustc_pattern_analysis/src/constructor.rs
index 09685640e50..9a9e0db964c 100644
--- a/compiler/rustc_pattern_analysis/src/constructor.rs
+++ b/compiler/rustc_pattern_analysis/src/constructor.rs
@@ -950,9 +950,7 @@ impl<Cx: PatCx> Constructor<Cx> {
                 }
             }
             Never => write!(f, "!")?,
-            Wildcard | Missing | NonExhaustive | Hidden | PrivateUninhabited => {
-                write!(f, "_ : {:?}", ty)?
-            }
+            Wildcard | Missing | NonExhaustive | Hidden | PrivateUninhabited => write!(f, "_")?,
         }
         Ok(())
     }
diff --git a/compiler/rustc_pattern_analysis/src/lib.rs b/compiler/rustc_pattern_analysis/src/lib.rs
index 66df35f9ee4..d9bb93a829b 100644
--- a/compiler/rustc_pattern_analysis/src/lib.rs
+++ b/compiler/rustc_pattern_analysis/src/lib.rs
@@ -57,6 +57,13 @@ pub trait PatCx: Sized + fmt::Debug {
 
     fn is_exhaustive_patterns_feature_on(&self) -> bool;
 
+    /// Whether to ensure the non-exhaustiveness witnesses we report for a complete set. This is
+    /// `false` by default to avoid some exponential blowup cases such as
+    /// <https://github.com/rust-lang/rust/issues/118437>.
+    fn exhaustive_witnesses(&self) -> bool {
+        false
+    }
+
     /// The number of fields for this constructor.
     fn ctor_arity(&self, ctor: &Constructor<Self>, ty: &Self::Ty) -> usize;
 
diff --git a/compiler/rustc_pattern_analysis/src/usefulness.rs b/compiler/rustc_pattern_analysis/src/usefulness.rs
index b1c646e9884..19446a1efe9 100644
--- a/compiler/rustc_pattern_analysis/src/usefulness.rs
+++ b/compiler/rustc_pattern_analysis/src/usefulness.rs
@@ -994,7 +994,8 @@ impl<Cx: PatCx> PlaceInfo<Cx> {
         if !missing_ctors.is_empty() && !report_individual_missing_ctors {
             // Report `_` as missing.
             missing_ctors = vec![Constructor::Wildcard];
-        } else if missing_ctors.iter().any(|c| c.is_non_exhaustive()) {
+        } else if missing_ctors.iter().any(|c| c.is_non_exhaustive()) && !cx.exhaustive_witnesses()
+        {
             // We need to report a `_` anyway, so listing other constructors would be redundant.
             // `NonExhaustive` is displayed as `_` just like `Wildcard`, but it will be picked
             // up by diagnostics to add a note about why `_` is required here.
@@ -1747,7 +1748,9 @@ fn compute_exhaustiveness_and_usefulness<'a, 'p, Cx: PatCx>(
         // `ctor` is *irrelevant* if there's another constructor in `split_ctors` that matches
         // strictly fewer rows. In that case we can sometimes skip it. See the top of the file for
         // details.
-        let ctor_is_relevant = matches!(ctor, Constructor::Missing) || missing_ctors.is_empty();
+        let ctor_is_relevant = matches!(ctor, Constructor::Missing)
+            || missing_ctors.is_empty()
+            || mcx.tycx.exhaustive_witnesses();
         let mut spec_matrix = matrix.specialize_constructor(pcx, &ctor, ctor_is_relevant)?;
         let mut witnesses = ensure_sufficient_stack(|| {
             compute_exhaustiveness_and_usefulness(mcx, &mut spec_matrix)
diff --git a/compiler/rustc_pattern_analysis/tests/common/mod.rs b/compiler/rustc_pattern_analysis/tests/common/mod.rs
index 0b939ef7816..94f2a127b9b 100644
--- a/compiler/rustc_pattern_analysis/tests/common/mod.rs
+++ b/compiler/rustc_pattern_analysis/tests/common/mod.rs
@@ -1,3 +1,4 @@
+#![allow(dead_code, unreachable_pub)]
 use rustc_pattern_analysis::constructor::{
     Constructor, ConstructorSet, IntRange, MaybeInfiniteInt, RangeEnd, VariantVisibility,
 };
@@ -22,8 +23,10 @@ fn init_tracing() {
         .try_init();
 }
 
+pub(super) const UNIT: Ty = Ty::Tuple(&[]);
+pub(super) const NEVER: Ty = Ty::Enum(&[]);
+
 /// A simple set of types.
-#[allow(dead_code)]
 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
 pub(super) enum Ty {
     /// Booleans
@@ -38,6 +41,8 @@ pub(super) enum Ty {
     BigStruct { arity: usize, ty: &'static Ty },
     /// A enum with `arity` variants of type `ty`.
     BigEnum { arity: usize, ty: &'static Ty },
+    /// Like `Enum` but non-exhaustive.
+    NonExhaustiveEnum(&'static [Ty]),
 }
 
 /// The important logic.
@@ -47,7 +52,7 @@ impl Ty {
         match (ctor, *self) {
             (Struct, Ty::Tuple(tys)) => tys.iter().copied().collect(),
             (Struct, Ty::BigStruct { arity, ty }) => (0..arity).map(|_| *ty).collect(),
-            (Variant(i), Ty::Enum(tys)) => vec![tys[*i]],
+            (Variant(i), Ty::Enum(tys) | Ty::NonExhaustiveEnum(tys)) => vec![tys[*i]],
             (Variant(_), Ty::BigEnum { ty, .. }) => vec![*ty],
             (Bool(..) | IntRange(..) | NonExhaustive | Missing | Wildcard, _) => vec![],
             _ => panic!("Unexpected ctor {ctor:?} for type {self:?}"),
@@ -61,6 +66,7 @@ impl Ty {
             Ty::Enum(tys) => tys.iter().all(|ty| ty.is_empty()),
             Ty::BigStruct { arity, ty } => arity != 0 && ty.is_empty(),
             Ty::BigEnum { arity, ty } => arity == 0 || ty.is_empty(),
+            Ty::NonExhaustiveEnum(..) => false,
         }
     }
 
@@ -90,6 +96,19 @@ impl Ty {
                     .collect(),
                 non_exhaustive: false,
             },
+            Ty::NonExhaustiveEnum(tys) => ConstructorSet::Variants {
+                variants: tys
+                    .iter()
+                    .map(|ty| {
+                        if ty.is_empty() {
+                            VariantVisibility::Empty
+                        } else {
+                            VariantVisibility::Visible
+                        }
+                    })
+                    .collect(),
+                non_exhaustive: true,
+            },
             Ty::BigEnum { arity: 0, .. } => ConstructorSet::NoConstructors,
             Ty::BigEnum { arity, ty } => {
                 let vis = if ty.is_empty() {
@@ -113,7 +132,9 @@ impl Ty {
         match (*self, ctor) {
             (Ty::Tuple(..), _) => Ok(()),
             (Ty::BigStruct { .. }, _) => write!(f, "BigStruct"),
-            (Ty::Enum(..), Constructor::Variant(i)) => write!(f, "Enum::Variant{i}"),
+            (Ty::Enum(..) | Ty::NonExhaustiveEnum(..), Constructor::Variant(i)) => {
+                write!(f, "Enum::Variant{i}")
+            }
             (Ty::BigEnum { .. }, Constructor::Variant(i)) => write!(f, "BigEnum::Variant{i}"),
             _ => write!(f, "{:?}::{:?}", self, ctor),
         }
@@ -126,10 +147,11 @@ pub(super) fn compute_match_usefulness<'p>(
     ty: Ty,
     scrut_validity: PlaceValidity,
     complexity_limit: usize,
+    exhaustive_witnesses: bool,
 ) -> Result<UsefulnessReport<'p, Cx>, ()> {
     init_tracing();
     rustc_pattern_analysis::usefulness::compute_match_usefulness(
-        &Cx,
+        &Cx { exhaustive_witnesses },
         arms,
         ty,
         scrut_validity,
@@ -138,7 +160,9 @@ pub(super) fn compute_match_usefulness<'p>(
 }
 
 #[derive(Debug)]
-pub(super) struct Cx;
+pub(super) struct Cx {
+    exhaustive_witnesses: bool,
+}
 
 /// The context for pattern analysis. Forwards anything interesting to `Ty` methods.
 impl PatCx for Cx {
@@ -153,6 +177,10 @@ impl PatCx for Cx {
         false
     }
 
+    fn exhaustive_witnesses(&self) -> bool {
+        self.exhaustive_witnesses
+    }
+
     fn ctor_arity(&self, ctor: &Constructor<Self>, ty: &Self::Ty) -> usize {
         ty.sub_tys(ctor).len()
     }
@@ -219,16 +247,18 @@ macro_rules! pats {
     // Entrypoint
     // Parse `type; ..`
     ($ty:expr; $($rest:tt)*) => {{
-        #[allow(unused_imports)]
+        #[allow(unused)]
         use rustc_pattern_analysis::{
             constructor::{Constructor, IntRange, MaybeInfiniteInt, RangeEnd},
-            pat::DeconstructedPat,
+            pat::{DeconstructedPat, IndexedPat},
         };
         let ty = $ty;
         // The heart of the macro is designed to push `IndexedPat`s into a `Vec`, so we work around
         // that.
+        #[allow(unused)]
         let sub_tys = ::std::iter::repeat(&ty);
-        let mut vec = Vec::new();
+        #[allow(unused)]
+        let mut vec: Vec<IndexedPat<_>> = Vec::new();
         pats!(@ctor(vec:vec, sub_tys:sub_tys, idx:0) $($rest)*);
         vec.into_iter().map(|ipat| ipat.pat).collect::<Vec<_>>()
     }};
@@ -263,6 +293,8 @@ macro_rules! pats {
         let ctor = Constructor::Wildcard;
         pats!(@pat($($args)*, ctor:ctor) $($rest)*)
     }};
+    // Nothing
+    (@ctor($($args:tt)*)) => {};
 
     // Integers and int ranges
     (@ctor($($args:tt)*) $($start:literal)?..$end:literal $($rest:tt)*) => {{
diff --git a/compiler/rustc_pattern_analysis/tests/complexity.rs b/compiler/rustc_pattern_analysis/tests/complexity.rs
index 93aecafe48d..4754476f383 100644
--- a/compiler/rustc_pattern_analysis/tests/complexity.rs
+++ b/compiler/rustc_pattern_analysis/tests/complexity.rs
@@ -16,7 +16,7 @@ fn check(patterns: &[DeconstructedPat<Cx>], complexity_limit: usize) -> Result<(
     let ty = *patterns[0].ty();
     let arms: Vec<_> =
         patterns.iter().map(|pat| MatchArm { pat, has_guard: false, arm_data: () }).collect();
-    compute_match_usefulness(arms.as_slice(), ty, PlaceValidity::ValidOnly, complexity_limit)
+    compute_match_usefulness(arms.as_slice(), ty, PlaceValidity::ValidOnly, complexity_limit, false)
         .map(|_report| ())
 }
 
diff --git a/compiler/rustc_pattern_analysis/tests/exhaustiveness.rs b/compiler/rustc_pattern_analysis/tests/exhaustiveness.rs
index 3b8f346ef19..14ca0d057f0 100644
--- a/compiler/rustc_pattern_analysis/tests/exhaustiveness.rs
+++ b/compiler/rustc_pattern_analysis/tests/exhaustiveness.rs
@@ -11,16 +11,30 @@ use rustc_pattern_analysis::usefulness::PlaceValidity;
 mod common;
 
 /// Analyze a match made of these patterns.
-fn check(patterns: Vec<DeconstructedPat<Cx>>) -> Vec<WitnessPat<Cx>> {
-    let ty = *patterns[0].ty();
+fn run(
+    ty: Ty,
+    patterns: Vec<DeconstructedPat<Cx>>,
+    exhaustive_witnesses: bool,
+) -> Vec<WitnessPat<Cx>> {
     let arms: Vec<_> =
         patterns.iter().map(|pat| MatchArm { pat, has_guard: false, arm_data: () }).collect();
-    let report =
-        compute_match_usefulness(arms.as_slice(), ty, PlaceValidity::ValidOnly, usize::MAX)
-            .unwrap();
+    let report = compute_match_usefulness(
+        arms.as_slice(),
+        ty,
+        PlaceValidity::ValidOnly,
+        usize::MAX,
+        exhaustive_witnesses,
+    )
+    .unwrap();
     report.non_exhaustiveness_witnesses
 }
 
+/// Analyze a match made of these patterns. Panics if there are no patterns
+fn check(patterns: Vec<DeconstructedPat<Cx>>) -> Vec<WitnessPat<Cx>> {
+    let ty = *patterns[0].ty();
+    run(ty, patterns, true)
+}
+
 #[track_caller]
 fn assert_exhaustive(patterns: Vec<DeconstructedPat<Cx>>) {
     let witnesses = check(patterns);
@@ -35,6 +49,26 @@ fn assert_non_exhaustive(patterns: Vec<DeconstructedPat<Cx>>) {
     assert!(!witnesses.is_empty())
 }
 
+use WhichWitnesses::*;
+enum WhichWitnesses {
+    AllOfThem,
+    OnlySome,
+}
+
+#[track_caller]
+/// We take the type as input to support empty matches.
+fn assert_witnesses(
+    which: WhichWitnesses,
+    ty: Ty,
+    patterns: Vec<DeconstructedPat<Cx>>,
+    expected: Vec<&str>,
+) {
+    let exhaustive_wit = matches!(which, AllOfThem);
+    let witnesses = run(ty, patterns, exhaustive_wit);
+    let witnesses: Vec<_> = witnesses.iter().map(|w| format!("{w:?}")).collect();
+    assert_eq!(witnesses, expected)
+}
+
 #[test]
 fn test_int_ranges() {
     let ty = Ty::U8;
@@ -59,6 +93,8 @@ fn test_int_ranges() {
 
 #[test]
 fn test_nested() {
+    // enum E { A(bool), B(bool) }
+    // ty = (E, E)
     let ty = Ty::BigStruct { arity: 2, ty: &Ty::BigEnum { arity: 2, ty: &Ty::Bool } };
     assert_non_exhaustive(pats!(ty;
         Struct(Variant.0, _),
@@ -79,9 +115,73 @@ fn test_nested() {
 }
 
 #[test]
+fn test_witnesses() {
+    // TY = Option<bool>
+    const TY: Ty = Ty::Enum(&[Ty::Bool, UNIT]);
+    // ty = (Option<bool>, Option<bool>)
+    let ty = Ty::Tuple(&[TY, TY]);
+    assert_witnesses(AllOfThem, ty, vec![], vec!["(_, _)"]);
+    assert_witnesses(
+        OnlySome,
+        ty,
+        pats!(ty;
+            (Variant.0(false), Variant.0(false)),
+        ),
+        vec!["(Enum::Variant1(_), _)"],
+    );
+    assert_witnesses(
+        AllOfThem,
+        ty,
+        pats!(ty;
+            (Variant.0(false), Variant.0(false)),
+        ),
+        vec![
+            "(Enum::Variant0(false), Enum::Variant0(true))",
+            "(Enum::Variant0(false), Enum::Variant1(_))",
+            "(Enum::Variant0(true), _)",
+            "(Enum::Variant1(_), _)",
+        ],
+    );
+    assert_witnesses(
+        OnlySome,
+        ty,
+        pats!(ty;
+            (_, Variant.0(false)),
+        ),
+        vec!["(_, Enum::Variant1(_))"],
+    );
+    assert_witnesses(
+        AllOfThem,
+        ty,
+        pats!(ty;
+            (_, Variant.0(false)),
+        ),
+        vec!["(_, Enum::Variant0(true))", "(_, Enum::Variant1(_))"],
+    );
+
+    let ty = Ty::NonExhaustiveEnum(&[UNIT, UNIT, UNIT]);
+    assert_witnesses(
+        OnlySome,
+        ty,
+        pats!(ty;
+            Variant.0,
+        ),
+        vec!["_"],
+    );
+    assert_witnesses(
+        AllOfThem,
+        ty,
+        pats!(ty;
+            Variant.0,
+        ),
+        vec!["Enum::Variant1(_)", "Enum::Variant2(_)", "_"],
+    );
+}
+
+#[test]
 fn test_empty() {
     // `TY = Result<bool, !>`
-    const TY: Ty = Ty::Enum(&[Ty::Bool, Ty::Enum(&[])]);
+    const TY: Ty = Ty::Enum(&[Ty::Bool, NEVER]);
     assert_exhaustive(pats!(TY;
         Variant.0,
     ));
diff --git a/compiler/rustc_pattern_analysis/tests/intersection.rs b/compiler/rustc_pattern_analysis/tests/intersection.rs
index 8e6f84dcbc8..d4d390517e2 100644
--- a/compiler/rustc_pattern_analysis/tests/intersection.rs
+++ b/compiler/rustc_pattern_analysis/tests/intersection.rs
@@ -16,7 +16,7 @@ fn check(patterns: Vec<DeconstructedPat<Cx>>) -> Vec<Vec<usize>> {
     let arms: Vec<_> =
         patterns.iter().map(|pat| MatchArm { pat, has_guard: false, arm_data: () }).collect();
     let report =
-        compute_match_usefulness(arms.as_slice(), ty, PlaceValidity::ValidOnly, usize::MAX)
+        compute_match_usefulness(arms.as_slice(), ty, PlaceValidity::ValidOnly, usize::MAX, false)
             .unwrap();
     report.arm_intersections.into_iter().map(|bitset| bitset.iter().collect()).collect()
 }
diff --git a/library/Cargo.lock b/library/Cargo.lock
index 94155e08398..cb356480ead 100644
--- a/library/Cargo.lock
+++ b/library/Cargo.lock
@@ -78,9 +78,9 @@ dependencies = [
 
 [[package]]
 name = "dlmalloc"
-version = "0.2.9"
+version = "0.2.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d01597dde41c0b9da50d5f8c219023d63d8f27f39a27095070fd191fddc83891"
+checksum = "fa3a2dbee57b69fbb5dbe852fa9c0925697fb0c7fbcb1593e90e5ffaedf13d51"
 dependencies = [
  "cfg-if",
  "libc",
diff --git a/library/std/Cargo.toml b/library/std/Cargo.toml
index ba1e1f5218a..57859ea9147 100644
--- a/library/std/Cargo.toml
+++ b/library/std/Cargo.toml
@@ -63,7 +63,7 @@ rand = { version = "0.9.0", default-features = false, features = ["alloc"] }
 rand_xorshift = "0.4.0"
 
 [target.'cfg(any(all(target_family = "wasm", target_os = "unknown"), target_os = "xous", all(target_vendor = "fortanix", target_env = "sgx")))'.dependencies]
-dlmalloc = { version = "0.2.4", features = ['rustc-dep-of-std'] }
+dlmalloc = { version = "0.2.10", features = ['rustc-dep-of-std'] }
 
 [target.x86_64-fortanix-unknown-sgx.dependencies]
 fortanix-sgx-abi = { version = "0.5.0", features = [
diff --git a/src/bootstrap/src/core/sanity.rs b/src/bootstrap/src/core/sanity.rs
index b39d464493e..15e04f59129 100644
--- a/src/bootstrap/src/core/sanity.rs
+++ b/src/bootstrap/src/core/sanity.rs
@@ -338,12 +338,6 @@ than building it.
 
         // Make sure musl-root is valid.
         if target.contains("musl") && !target.contains("unikraft") {
-            // If this is a native target (host is also musl) and no musl-root is given,
-            // fall back to the system toolchain in /usr before giving up
-            if build.musl_root(*target).is_none() && build.config.is_host_target(*target) {
-                let target = build.config.target_config.entry(*target).or_default();
-                target.musl_root = Some("/usr".into());
-            }
             match build.musl_libdir(*target) {
                 Some(libdir) => {
                     if fs::metadata(libdir.join("libc.a")).is_err() {
diff --git a/src/bootstrap/src/lib.rs b/src/bootstrap/src/lib.rs
index 63aab4d116a..51a84ad5272 100644
--- a/src/bootstrap/src/lib.rs
+++ b/src/bootstrap/src/lib.rs
@@ -1329,23 +1329,33 @@ impl Build {
         }
     }
 
-    /// Returns the "musl root" for this `target`, if defined
+    /// Returns the "musl root" for this `target`, if defined.
+    ///
+    /// If this is a native target (host is also musl) and no musl-root is given,
+    /// it falls back to the system toolchain in /usr.
     fn musl_root(&self, target: TargetSelection) -> Option<&Path> {
-        self.config
+        let configured_root = self
+            .config
             .target_config
             .get(&target)
             .and_then(|t| t.musl_root.as_ref())
             .or(self.config.musl_root.as_ref())
-            .map(|p| &**p)
+            .map(|p| &**p);
+
+        if self.config.is_host_target(target) && configured_root.is_none() {
+            Some(Path::new("/usr"))
+        } else {
+            configured_root
+        }
     }
 
     /// Returns the "musl libdir" for this `target`.
     fn musl_libdir(&self, target: TargetSelection) -> Option<PathBuf> {
-        let t = self.config.target_config.get(&target)?;
-        if let libdir @ Some(_) = &t.musl_libdir {
-            return libdir.clone();
-        }
-        self.musl_root(target).map(|root| root.join("lib"))
+        self.config
+            .target_config
+            .get(&target)
+            .and_then(|t| t.musl_libdir.clone())
+            .or_else(|| self.musl_root(target).map(|root| root.join("lib")))
     }
 
     /// Returns the `lib` directory for the WASI target specified, if
diff --git a/src/tools/compiletest/src/directives/cfg.rs b/src/tools/compiletest/src/directives/cfg.rs
index 35f6a9e1644..802a1d63d1f 100644
--- a/src/tools/compiletest/src/directives/cfg.rs
+++ b/src/tools/compiletest/src/directives/cfg.rs
@@ -285,6 +285,11 @@ fn parse_cfg_name_directive<'a>(
         if name == "gdb-version" {
             outcome = MatchOutcome::External;
         }
+
+        // Don't error out for ignore-backends,as it is handled elsewhere.
+        if name == "backends" {
+            outcome = MatchOutcome::External;
+        }
     }
 
     ParsedNameDirective {
diff --git a/tests/assembly-llvm/dwarf-mixed-versions-lto.rs b/tests/assembly-llvm/dwarf-mixed-versions-lto.rs
index 9910a6e2f5f..828328df843 100644
--- a/tests/assembly-llvm/dwarf-mixed-versions-lto.rs
+++ b/tests/assembly-llvm/dwarf-mixed-versions-lto.rs
@@ -1,6 +1,7 @@
 // This test ensures that if LTO occurs between crates with different DWARF versions, we
 // will choose the highest DWARF version for the final binary. This matches Clang's behavior.
 // Note: `.2byte` directive is used on MIPS.
+// Note: `.half` directive is used on RISC-V.
 
 //@ only-linux
 //@ aux-build:dwarf-mixed-versions-lto-aux.rs
@@ -15,6 +16,6 @@ fn main() {
 }
 
 // CHECK: .section .debug_info
-// CHECK-NOT: {{\.(short|hword|2byte)}} 2
-// CHECK-NOT: {{\.(short|hword|2byte)}} 4
-// CHECK: {{\.(short|hword|2byte)}} 5
+// CHECK-NOT: {{\.(short|hword|2byte|half)}} 2
+// CHECK-NOT: {{\.(short|hword|2byte|half)}} 4
+// CHECK: {{\.(short|hword|2byte|half)}} 5
diff --git a/tests/codegen-llvm/const-vector.rs b/tests/codegen-llvm/const-vector.rs
index a2249f4fff7..f4307492341 100644
--- a/tests/codegen-llvm/const-vector.rs
+++ b/tests/codegen-llvm/const-vector.rs
@@ -15,6 +15,7 @@
 #![feature(arm_target_feature)]
 #![feature(mips_target_feature)]
 #![allow(non_camel_case_types)]
+#![feature(riscv_target_feature)]
 
 #[path = "../auxiliary/minisimd.rs"]
 mod minisimd;
@@ -42,6 +43,7 @@ extern "unadjusted" {
 #[cfg_attr(target_arch = "arm", target_feature(enable = "neon"))]
 #[cfg_attr(target_arch = "x86", target_feature(enable = "sse"))]
 #[cfg_attr(target_arch = "mips", target_feature(enable = "msa"))]
+#[cfg_attr(target_arch = "riscv64", target_feature(enable = "v"))]
 pub fn do_call() {
     unsafe {
         // CHECK: call void @test_i8x2(<2 x i8> <i8 32, i8 64>
diff --git a/tests/ui/allocator/no_std-alloc-error-handler-custom.rs b/tests/ui/allocator/no_std-alloc-error-handler-custom.rs
index 1b0f0608fc6..7b7ca2f6cc6 100644
--- a/tests/ui/allocator/no_std-alloc-error-handler-custom.rs
+++ b/tests/ui/allocator/no_std-alloc-error-handler-custom.rs
@@ -2,6 +2,7 @@
 //@ ignore-android no libc
 //@ ignore-emscripten no libc
 //@ ignore-sgx no libc
+//@ ignore-backends: gcc
 //@ only-linux
 //@ compile-flags:-C panic=abort
 //@ aux-build:helper.rs
diff --git a/tests/ui/allocator/no_std-alloc-error-handler-default.rs b/tests/ui/allocator/no_std-alloc-error-handler-default.rs
index 51ecf1a6731..5a6c0b33d51 100644
--- a/tests/ui/allocator/no_std-alloc-error-handler-default.rs
+++ b/tests/ui/allocator/no_std-alloc-error-handler-default.rs
@@ -2,6 +2,7 @@
 //@ ignore-android no libc
 //@ ignore-emscripten no libc
 //@ ignore-sgx no libc
+//@ ignore-backends: gcc
 //@ only-linux
 //@ compile-flags:-C panic=abort
 //@ aux-build:helper.rs
diff --git a/tests/ui/asm/may_unwind.rs b/tests/ui/asm/may_unwind.rs
index 1d4f50d5fe8..0fef317a2cf 100644
--- a/tests/ui/asm/may_unwind.rs
+++ b/tests/ui/asm/may_unwind.rs
@@ -1,6 +1,7 @@
 //@ run-pass
 //@ needs-asm-support
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 #![feature(asm_unwind)]
 
diff --git a/tests/ui/asm/x86_64/may_unwind.rs b/tests/ui/asm/x86_64/may_unwind.rs
index d3a2916df9d..9657f49ab30 100644
--- a/tests/ui/asm/x86_64/may_unwind.rs
+++ b/tests/ui/asm/x86_64/may_unwind.rs
@@ -2,6 +2,7 @@
 //@ run-pass
 //@ needs-asm-support
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 #![feature(asm_unwind)]
 
diff --git a/tests/ui/async-await/deep-futures-are-freeze.rs b/tests/ui/async-await/deep-futures-are-freeze.rs
index c4300163db1..79dbc033bf7 100644
--- a/tests/ui/async-await/deep-futures-are-freeze.rs
+++ b/tests/ui/async-await/deep-futures-are-freeze.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ build-pass
 //@ compile-flags: -Copt-level=s -Clto=fat
 //@ no-prefer-dynamic
diff --git a/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.rs b/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.rs
index 4bafb39f600..d6180bb2f45 100644
--- a/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.rs
+++ b/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ edition: 2021
 //@ known-bug: #108309
 
diff --git a/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.stderr b/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.stderr
index 62cca41f6cf..3d82f572a1a 100644
--- a/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.stderr
+++ b/tests/ui/async-await/in-trait/dont-project-to-specializable-projection.stderr
@@ -1,11 +1,11 @@
 error[E0053]: method `foo` has an incompatible type for trait
-  --> $DIR/dont-project-to-specializable-projection.rs:13:5
+  --> $DIR/dont-project-to-specializable-projection.rs:14:5
    |
 LL |     default async fn foo(_: T) -> &'static str {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found future
    |
 note: type in trait
-  --> $DIR/dont-project-to-specializable-projection.rs:9:5
+  --> $DIR/dont-project-to-specializable-projection.rs:10:5
    |
 LL |     async fn foo(_: T) -> &'static str;
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -13,7 +13,7 @@ LL |     async fn foo(_: T) -> &'static str;
               found signature `fn(_) -> impl Future<Output = &'static str>`
 
 error: async associated function in trait cannot be specialized
-  --> $DIR/dont-project-to-specializable-projection.rs:13:5
+  --> $DIR/dont-project-to-specializable-projection.rs:14:5
    |
 LL |     default async fn foo(_: T) -> &'static str {
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -21,7 +21,7 @@ LL |     default async fn foo(_: T) -> &'static str {
    = note: specialization behaves in inconsistent and surprising ways with async functions in traits, and for now is disallowed
 
 error[E0599]: no method named `poll` found for struct `Pin<&mut impl Future<Output = ()>>` in the current scope
-  --> $DIR/dont-project-to-specializable-projection.rs:48:28
+  --> $DIR/dont-project-to-specializable-projection.rs:49:28
    |
 LL |         match fut.as_mut().poll(ctx) {
    |                            ^^^^ method not found in `Pin<&mut impl Future<Output = ()>>`
diff --git a/tests/ui/backtrace/dylib-dep.rs b/tests/ui/backtrace/dylib-dep.rs
index a41931ad548..05fdb9afef8 100644
--- a/tests/ui/backtrace/dylib-dep.rs
+++ b/tests/ui/backtrace/dylib-dep.rs
@@ -8,6 +8,7 @@
 //@ ignore-fuchsia Backtraces not symbolized
 //@ ignore-musl musl doesn't support dynamic libraries (at least when the original test was written).
 //@ needs-unwind
+//@ ignore-backends: gcc
 //@ compile-flags: -g -Copt-level=0 -Cstrip=none -Cforce-frame-pointers=yes
 //@ ignore-emscripten Requires custom symbolization code
 //@ aux-crate: dylib_dep_helper=dylib-dep-helper.rs
diff --git a/tests/ui/borrowck/borrowck-partial-reinit-1.stderr b/tests/ui/borrowck/borrowck-partial-reinit-1.stderr
index 65f2bd6cfbd..d261f3ac572 100644
--- a/tests/ui/borrowck/borrowck-partial-reinit-1.stderr
+++ b/tests/ui/borrowck/borrowck-partial-reinit-1.stderr
@@ -8,6 +8,15 @@ LL |     drop(t);
    |          - value moved here
 LL |     t.b = Some(u);
    |     ^^^ value assigned here after move
+   |
+note: if `Test2` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-partial-reinit-1.rs:3:1
+   |
+LL | struct Test2 {
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     drop(t);
+   |          - you could clone this value
 
 error[E0382]: assign of moved value: `t`
   --> $DIR/borrowck-partial-reinit-1.rs:33:5
@@ -19,6 +28,15 @@ LL |     drop(t);
    |          - value moved here
 LL |     t.0 = Some(u);
    |     ^^^ value assigned here after move
+   |
+note: if `Test3` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-partial-reinit-1.rs:7:1
+   |
+LL | struct Test3(Option<Test>);
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     drop(t);
+   |          - you could clone this value
 
 error: aborting due to 2 previous errors
 
diff --git a/tests/ui/borrowck/borrowck-partial-reinit-2.stderr b/tests/ui/borrowck/borrowck-partial-reinit-2.stderr
index e25ca082b7b..dde70eb444e 100644
--- a/tests/ui/borrowck/borrowck-partial-reinit-2.stderr
+++ b/tests/ui/borrowck/borrowck-partial-reinit-2.stderr
@@ -7,6 +7,15 @@ LL |     let mut u = Test { a: 2, b: Some(Box::new(t))};
    |                                               - value moved here
 LL |     t.b = Some(Box::new(u));
    |     ^^^ value assigned here after move
+   |
+note: if `Test` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-partial-reinit-2.rs:1:1
+   |
+LL | struct Test {
+   | ^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     let mut u = Test { a: 2, b: Some(Box::new(t))};
+   |                                               - you could clone this value
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/borrowck/borrowck-union-move-assign.stderr b/tests/ui/borrowck/borrowck-union-move-assign.stderr
index 8c0239a3ae9..8721481dc1d 100644
--- a/tests/ui/borrowck/borrowck-union-move-assign.stderr
+++ b/tests/ui/borrowck/borrowck-union-move-assign.stderr
@@ -7,6 +7,15 @@ LL |             let a = u.a;
    |                     --- value moved here
 LL |             let a = u.a;
    |                     ^^^ value used here after move
+   |
+note: if `U` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move-assign.rs:7:1
+   |
+LL | union U {
+   | ^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.a;
+   |                     --- you could clone this value
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/borrowck/borrowck-union-move.stderr b/tests/ui/borrowck/borrowck-union-move.stderr
index 731607fbdd1..0bae7ac5227 100644
--- a/tests/ui/borrowck/borrowck-union-move.stderr
+++ b/tests/ui/borrowck/borrowck-union-move.stderr
@@ -7,6 +7,15 @@ LL |             let a = u.n1;
    |                     ---- value moved here
 LL |             let a = u.n1;
    |                     ^^^^ value used here after move
+   |
+note: if `Unn` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move.rs:7:1
+   |
+LL | union Unn {
+   | ^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.n1;
+   |                     ---- you could clone this value
 
 error[E0382]: use of moved value: `u`
   --> $DIR/borrowck-union-move.rs:31:21
@@ -17,6 +26,15 @@ LL |             let a = u.n1;
    |                     ---- value moved here
 LL |             let a = u;
    |                     ^ value used here after move
+   |
+note: if `Unn` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move.rs:7:1
+   |
+LL | union Unn {
+   | ^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.n1;
+   |                     ---- you could clone this value
 
 error[E0382]: use of moved value: `u`
   --> $DIR/borrowck-union-move.rs:36:21
@@ -27,6 +45,15 @@ LL |             let a = u.n1;
    |                     ---- value moved here
 LL |             let a = u.n2;
    |                     ^^^^ value used here after move
+   |
+note: if `Unn` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move.rs:7:1
+   |
+LL | union Unn {
+   | ^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.n1;
+   |                     ---- you could clone this value
 
 error[E0382]: use of moved value: `u`
   --> $DIR/borrowck-union-move.rs:63:21
@@ -37,6 +64,15 @@ LL |             let a = u.n;
    |                     --- value moved here
 LL |             let a = u.n;
    |                     ^^^ value used here after move
+   |
+note: if `Ucn` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move.rs:15:1
+   |
+LL | union Ucn {
+   | ^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.n;
+   |                     --- you could clone this value
 
 error[E0382]: use of moved value: `u`
   --> $DIR/borrowck-union-move.rs:68:21
@@ -47,6 +83,15 @@ LL |             let a = u.n;
    |                     --- value moved here
 LL |             let a = u.c;
    |                     ^^^ value used here after move
+   |
+note: if `Ucn` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move.rs:15:1
+   |
+LL | union Ucn {
+   | ^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.n;
+   |                     --- you could clone this value
 
 error[E0382]: use of moved value: `u`
   --> $DIR/borrowck-union-move.rs:83:21
@@ -57,6 +102,15 @@ LL |             let a = u.n;
    |                     --- value moved here
 LL |             let a = u;
    |                     ^ value used here after move
+   |
+note: if `Ucn` implemented `Clone`, you could clone the value
+  --> $DIR/borrowck-union-move.rs:15:1
+   |
+LL | union Ucn {
+   | ^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             let a = u.n;
+   |                     --- you could clone this value
 
 error: aborting due to 6 previous errors
 
diff --git a/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out-with-mut.stderr b/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out-with-mut.stderr
index b188766e221..167fd6b227f 100644
--- a/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out-with-mut.stderr
+++ b/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out-with-mut.stderr
@@ -17,6 +17,15 @@ LL |         drop(u);
    |              - value moved here
 LL |         u.0 = S(1);
    |         ^^^^^^^^^^ value partially assigned here after move
+   |
+note: if `Tpair` implemented `Clone`, you could clone the value
+  --> $DIR/issue-54499-field-mutation-of-moved-out-with-mut.rs:6:1
+   |
+LL | struct Tpair(S, i32);
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         drop(u);
+   |              - you could clone this value
 
 error[E0382]: assign to part of moved value: `v`
   --> $DIR/issue-54499-field-mutation-of-moved-out-with-mut.rs:31:9
@@ -27,6 +36,15 @@ LL |         drop(v);
    |              - value moved here
 LL |         v.x = S(1);
    |         ^^^^^^^^^^ value partially assigned here after move
+   |
+note: if `Spair` implemented `Clone`, you could clone the value
+  --> $DIR/issue-54499-field-mutation-of-moved-out-with-mut.rs:7:1
+   |
+LL | struct Spair { x: S, y: i32 }
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         drop(v);
+   |              - you could clone this value
 
 error: aborting due to 3 previous errors
 
diff --git a/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out.stderr b/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out.stderr
index 774b6cf0ea6..78c5040e52a 100644
--- a/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out.stderr
+++ b/tests/ui/borrowck/issue-54499-field-mutation-of-moved-out.stderr
@@ -50,6 +50,15 @@ LL |         drop(u);
    |              - value moved here
 LL |         u.0 = S(1);
    |         ^^^^^^^^^^ value partially assigned here after move
+   |
+note: if `Tpair` implemented `Clone`, you could clone the value
+  --> $DIR/issue-54499-field-mutation-of-moved-out.rs:6:1
+   |
+LL | struct Tpair(S, i32);
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         drop(u);
+   |              - you could clone this value
 
 error[E0594]: cannot assign to `u.1`, as `u` is not declared as mutable
   --> $DIR/issue-54499-field-mutation-of-moved-out.rs:27:9
@@ -82,6 +91,15 @@ LL |         drop(v);
    |              - value moved here
 LL |         v.x = S(1);
    |         ^^^^^^^^^^ value partially assigned here after move
+   |
+note: if `Spair` implemented `Clone`, you could clone the value
+  --> $DIR/issue-54499-field-mutation-of-moved-out.rs:7:1
+   |
+LL | struct Spair { x: S, y: i32 }
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         drop(v);
+   |              - you could clone this value
 
 error[E0594]: cannot assign to `v.y`, as `v` is not declared as mutable
   --> $DIR/issue-54499-field-mutation-of-moved-out.rs:38:9
diff --git a/tests/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr b/tests/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr
index 121c2e870e7..5a0d353a481 100644
--- a/tests/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr
+++ b/tests/ui/borrowck/issue-54597-reject-move-out-of-borrow-via-pat.stderr
@@ -4,6 +4,14 @@ error[E0507]: cannot move out of `*array` which is behind a shared reference
 LL |             *array
    |             ^^^^^^ move occurs because `*array` has type `Vec<Value>`, which does not implement the `Copy` trait
    |
+note: if `Value` implemented `Clone`, you could clone the value
+  --> $DIR/issue-54597-reject-move-out-of-borrow-via-pat.rs:4:1
+   |
+LL | struct Value;
+   | ^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             *array
+   |             ------ you could clone this value
 help: consider removing the dereference here
    |
 LL -             *array
diff --git a/tests/ui/issues/issue-4333.rs b/tests/ui/cast/trait-object-cast-segfault-4333.rs
index dccaa6f68bd..24e86d4d930 100644
--- a/tests/ui/issues/issue-4333.rs
+++ b/tests/ui/cast/trait-object-cast-segfault-4333.rs
@@ -7,3 +7,5 @@ pub fn main() {
     let stdout = &mut io::stdout() as &mut dyn io::Write;
     stdout.write(b"Hello!");
 }
+
+// https://github.com/rust-lang/rust/issues/4333
diff --git a/tests/ui/cfg/cfg-panic-abort.rs b/tests/ui/cfg/cfg-panic-abort.rs
index 448fde21086..b39888573b3 100644
--- a/tests/ui/cfg/cfg-panic-abort.rs
+++ b/tests/ui/cfg/cfg-panic-abort.rs
@@ -1,6 +1,7 @@
 //@ build-pass
 //@ compile-flags: -C panic=abort
 //@ no-prefer-dynamic
+//@ ignore-backends: gcc
 
 #[cfg(panic = "unwind")]
 pub fn bad() -> i32 { }
diff --git a/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2018.stderr b/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2018.stderr
index 394629c0001..057960ec014 100644
--- a/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2018.stderr
+++ b/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2018.stderr
@@ -26,6 +26,15 @@ LL |             E::Number(_) if let E::String(s) = *value => { }
 ...
 LL |     let x = value;
    |             ^^^^^ value used here after move
+   |
+note: if `E` implemented `Clone`, you could clone the value
+  --> $DIR/if-let-guards-errors.rs:32:1
+   |
+LL |             E::Number(_) if let E::String(s) = *value => { }
+   |                                                ------ you could clone this value
+...
+LL | enum E {
+   | ^^^^^^ consider implementing `Clone` for this type
 
 error: aborting due to 2 previous errors
 
diff --git a/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2021.stderr b/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2021.stderr
index 5672845019b..4a6e3908827 100644
--- a/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2021.stderr
+++ b/tests/ui/closures/2229_closure_analysis/match/if-let-guards-errors.e2021.stderr
@@ -26,6 +26,15 @@ LL |             E::Number(_) if let E::String(s) = *value => { }
 ...
 LL |     let x = value;
    |             ^^^^^ value used here after move
+   |
+note: if `E` implemented `Clone`, you could clone the value
+  --> $DIR/if-let-guards-errors.rs:32:1
+   |
+LL |             E::Number(_) if let E::String(s) = *value => { }
+   |                                                ------ you could clone this value
+...
+LL | enum E {
+   | ^^^^^^ consider implementing `Clone` for this type
 
 error: aborting due to 2 previous errors
 
diff --git a/tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs b/tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs
index a4646d67c68..40d838b7e8e 100644
--- a/tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs
+++ b/tests/ui/codegen/StackColoring-not-blowup-stack-issue-40883.rs
@@ -1,4 +1,6 @@
 //@ run-pass
+//@ ignore-backends: gcc
+
 #![allow(dead_code)]
 // check that we don't have linear stack usage with multiple calls to `push`
 
diff --git a/tests/ui/issues/issue-36278-prefix-nesting.rs b/tests/ui/codegen/dynamic-size-of-prefix-correctly-36278.rs
index 3f2ca7a2460..78c0129faa1 100644
--- a/tests/ui/issues/issue-36278-prefix-nesting.rs
+++ b/tests/ui/codegen/dynamic-size-of-prefix-correctly-36278.rs
@@ -18,3 +18,5 @@ fn main() {
     size_of_unsized = mem::size_of_val::<Ack<_>>(&y);
     assert_eq!(size_of_sized, size_of_unsized);
 }
+
+// https://github.com/rust-lang/rust/issues/36278
diff --git a/tests/ui/codegen/equal-pointers-unequal/as-cast/inline1.rs b/tests/ui/codegen/equal-pointers-unequal/as-cast/inline1.rs
index d13fd4b63b3..53e29e75781 100644
--- a/tests/ui/codegen/equal-pointers-unequal/as-cast/inline1.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/as-cast/inline1.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Based on https://github.com/rust-lang/rust/issues/107975#issuecomment-1432161340
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/as-cast/inline2.rs b/tests/ui/codegen/equal-pointers-unequal/as-cast/inline2.rs
index 5ec3c7cbdf5..47639762e7a 100644
--- a/tests/ui/codegen/equal-pointers-unequal/as-cast/inline2.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/as-cast/inline2.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Based on https://github.com/rust-lang/rust/issues/107975#issuecomment-1432161340
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/as-cast/segfault.rs b/tests/ui/codegen/equal-pointers-unequal/as-cast/segfault.rs
index 97a875f15bc..70cbb9a52f7 100644
--- a/tests/ui/codegen/equal-pointers-unequal/as-cast/segfault.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/as-cast/segfault.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // https://github.com/rust-lang/rust/issues/107975#issuecomment-1431758601
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/as-cast/zero.rs b/tests/ui/codegen/equal-pointers-unequal/as-cast/zero.rs
index 731c5b67882..694fb34828c 100644
--- a/tests/ui/codegen/equal-pointers-unequal/as-cast/zero.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/as-cast/zero.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Derived from https://github.com/rust-lang/rust/issues/107975#issuecomment-1431758601
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline1.rs b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline1.rs
index cdf07eade87..ade32663d48 100644
--- a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline1.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline1.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Based on https://github.com/rust-lang/rust/issues/107975#issuecomment-1432161340
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline2.rs b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline2.rs
index 94739708ab8..d8feaeee4fa 100644
--- a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline2.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/inline2.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Based on https://github.com/rust-lang/rust/issues/107975#issuecomment-1432161340
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/segfault.rs b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/segfault.rs
index b163c282d93..ad1d7b56c8c 100644
--- a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/segfault.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/segfault.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // https://github.com/rust-lang/rust/issues/107975#issuecomment-1431758601
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/zero.rs b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/zero.rs
index b7824f53d77..a50369b46cb 100644
--- a/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/zero.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/exposed-provenance/zero.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Derived from https://github.com/rust-lang/rust/issues/107975#issuecomment-1431758601
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline1.rs b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline1.rs
index 5f4ee731f7d..0b5b2df9f0e 100644
--- a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline1.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline1.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Based on https://github.com/rust-lang/rust/issues/107975#issuecomment-1432161340
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline2.rs b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline2.rs
index 0f838af1fb1..1812a1163f0 100644
--- a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline2.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/inline2.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Based on https://github.com/rust-lang/rust/issues/107975#issuecomment-1432161340
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/segfault.rs b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/segfault.rs
index fea41e03612..637f0042ada 100644
--- a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/segfault.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/segfault.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // https://github.com/rust-lang/rust/issues/107975#issuecomment-1431758601
 
diff --git a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/zero.rs b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/zero.rs
index 20ed991ed3d..5879b3f4f4f 100644
--- a/tests/ui/codegen/equal-pointers-unequal/strict-provenance/zero.rs
+++ b/tests/ui/codegen/equal-pointers-unequal/strict-provenance/zero.rs
@@ -1,6 +1,7 @@
 //@ known-bug: #107975
 //@ compile-flags: -Copt-level=2
 //@ run-pass
+//@ ignore-backends: gcc
 
 // Derived from https://github.com/rust-lang/rust/issues/107975#issuecomment-1431758601
 
diff --git a/tests/ui/issues/issue-39211.rs b/tests/ui/const-generics/generic-parameter-in-const-expression-39211.rs
index ab86afc3410..b2566e54471 100644
--- a/tests/ui/issues/issue-39211.rs
+++ b/tests/ui/const-generics/generic-parameter-in-const-expression-39211.rs
@@ -12,3 +12,5 @@ fn m<M: Mat>() {
 }
 fn main() {
 }
+
+// https://github.com/rust-lang/rust/issues/39211
diff --git a/tests/ui/issues/issue-39211.stderr b/tests/ui/const-generics/generic-parameter-in-const-expression-39211.stderr
index 2124bc667ff..2a80aff834a 100644
--- a/tests/ui/issues/issue-39211.stderr
+++ b/tests/ui/const-generics/generic-parameter-in-const-expression-39211.stderr
@@ -1,5 +1,5 @@
 error: constant expression depends on a generic parameter
-  --> $DIR/issue-39211.rs:9:17
+  --> $DIR/generic-parameter-in-const-expression-39211.rs:9:17
    |
 LL |     let a = [3; M::Row::DIM];
    |                 ^^^^^^^^^^^
@@ -7,7 +7,7 @@ LL |     let a = [3; M::Row::DIM];
    = note: this may fail depending on what value the parameter takes
 
 error: constant expression depends on a generic parameter
-  --> $DIR/issue-39211.rs:9:13
+  --> $DIR/generic-parameter-in-const-expression-39211.rs:9:13
    |
 LL |     let a = [3; M::Row::DIM];
    |             ^^^^^^^^^^^^^^^^
diff --git a/tests/ui/consts/const-eval/parse_ints.rs b/tests/ui/consts/const-eval/parse_ints.rs
index 409fae9e51d..6a7e157ea50 100644
--- a/tests/ui/consts/const-eval/parse_ints.rs
+++ b/tests/ui/consts/const-eval/parse_ints.rs
@@ -1,3 +1,5 @@
+//@ ignore-backends: gcc
+
 const _OK: () = match i32::from_str_radix("-1234", 10) {
     Ok(x) => assert!(x == -1234),
     Err(_) => panic!(),
diff --git a/tests/ui/consts/const-eval/parse_ints.stderr b/tests/ui/consts/const-eval/parse_ints.stderr
index 7e529c03725..9c9d083e7ca 100644
--- a/tests/ui/consts/const-eval/parse_ints.stderr
+++ b/tests/ui/consts/const-eval/parse_ints.stderr
@@ -1,5 +1,5 @@
 error[E0080]: evaluation panicked: from_ascii_radix: radix must lie in the range `[2, 36]`
-  --> $DIR/parse_ints.rs:5:24
+  --> $DIR/parse_ints.rs:7:24
    |
 LL | const _TOO_LOW: () = { u64::from_str_radix("12345ABCD", 1); };
    |                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_TOO_LOW` failed inside this call
@@ -11,7 +11,7 @@ note: inside `core::num::<impl u64>::from_ascii_radix`
    = note: this error originates in the macro `from_str_int_impl` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error[E0080]: evaluation panicked: from_ascii_radix: radix must lie in the range `[2, 36]`
-  --> $DIR/parse_ints.rs:6:25
+  --> $DIR/parse_ints.rs:8:25
    |
 LL | const _TOO_HIGH: () = { u64::from_str_radix("12345ABCD", 37); };
    |                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `_TOO_HIGH` failed inside this call
diff --git a/tests/ui/consts/const_cmp_type_id.rs b/tests/ui/consts/const_cmp_type_id.rs
index db2d50f4d22..8c21f7b1a5a 100644
--- a/tests/ui/consts/const_cmp_type_id.rs
+++ b/tests/ui/consts/const_cmp_type_id.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ compile-flags: -Znext-solver
 #![feature(const_type_id, const_trait_impl, const_cmp)]
 
diff --git a/tests/ui/consts/const_cmp_type_id.stderr b/tests/ui/consts/const_cmp_type_id.stderr
index 540eec5098b..05b94caef79 100644
--- a/tests/ui/consts/const_cmp_type_id.stderr
+++ b/tests/ui/consts/const_cmp_type_id.stderr
@@ -1,5 +1,5 @@
 error[E0015]: cannot call non-const operator in constants
-  --> $DIR/const_cmp_type_id.rs:10:18
+  --> $DIR/const_cmp_type_id.rs:11:18
    |
 LL |         let _a = TypeId::of::<u8>() < TypeId::of::<u16>();
    |                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
diff --git a/tests/ui/consts/issue-73976-monomorphic.rs b/tests/ui/consts/issue-73976-monomorphic.rs
index 5f364cd995e..f43823fa155 100644
--- a/tests/ui/consts/issue-73976-monomorphic.rs
+++ b/tests/ui/consts/issue-73976-monomorphic.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ check-pass
 //
 // This test is complement to the test in issue-73976-polymorphic.rs.
diff --git a/tests/ui/consts/issue-94675.rs b/tests/ui/consts/issue-94675.rs
index 22791e7d15e..f2ddc928d12 100644
--- a/tests/ui/consts/issue-94675.rs
+++ b/tests/ui/consts/issue-94675.rs
@@ -1,3 +1,5 @@
+//@ ignore-backends: gcc
+
 #![feature(const_trait_impl)]
 
 struct Foo<'a> {
diff --git a/tests/ui/consts/issue-94675.stderr b/tests/ui/consts/issue-94675.stderr
index 608ce0cfef0..d7664de5c07 100644
--- a/tests/ui/consts/issue-94675.stderr
+++ b/tests/ui/consts/issue-94675.stderr
@@ -1,17 +1,17 @@
 error[E0277]: the trait bound `Vec<usize>: [const] Index<_>` is not satisfied
-  --> $DIR/issue-94675.rs:9:9
+  --> $DIR/issue-94675.rs:11:9
    |
 LL |         self.bar[0] = baz.len();
    |         ^^^^^^^^^^^
 
 error[E0277]: the trait bound `Vec<usize>: [const] IndexMut<usize>` is not satisfied
-  --> $DIR/issue-94675.rs:9:9
+  --> $DIR/issue-94675.rs:11:9
    |
 LL |         self.bar[0] = baz.len();
    |         ^^^^^^^^^^^
 
 error[E0277]: the trait bound `Vec<usize>: [const] Index<usize>` is not satisfied
-  --> $DIR/issue-94675.rs:9:9
+  --> $DIR/issue-94675.rs:11:9
    |
 LL |         self.bar[0] = baz.len();
    |         ^^^^^^^^^^^
diff --git a/tests/ui/consts/issue-miri-1910.rs b/tests/ui/consts/issue-miri-1910.rs
index 6eae885ea8a..78587bbb4dd 100644
--- a/tests/ui/consts/issue-miri-1910.rs
+++ b/tests/ui/consts/issue-miri-1910.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ error-pattern unable to turn pointer into raw bytes
 //@ normalize-stderr: "alloc[0-9]+\+0x[a-z0-9]+" -> "ALLOC"
 
diff --git a/tests/ui/consts/issue-miri-1910.stderr b/tests/ui/consts/issue-miri-1910.stderr
index 140b1861bb4..2b6e079e380 100644
--- a/tests/ui/consts/issue-miri-1910.stderr
+++ b/tests/ui/consts/issue-miri-1910.stderr
@@ -1,5 +1,5 @@
 error[E0080]: unable to turn pointer into integer
-  --> $DIR/issue-miri-1910.rs:7:5
+  --> $DIR/issue-miri-1910.rs:8:5
    |
 LL |     (&foo as *const _ as *const u8).add(one_and_a_half_pointers).read();
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ evaluation of `C` failed here
diff --git a/tests/ui/consts/missing_span_in_backtrace.rs b/tests/ui/consts/missing_span_in_backtrace.rs
index 893dc321604..4f3f9aa6ada 100644
--- a/tests/ui/consts/missing_span_in_backtrace.rs
+++ b/tests/ui/consts/missing_span_in_backtrace.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ compile-flags: -Z ui-testing=no
 
 use std::{
diff --git a/tests/ui/consts/missing_span_in_backtrace.stderr b/tests/ui/consts/missing_span_in_backtrace.stderr
index de4acbffa28..0ac1e281107 100644
--- a/tests/ui/consts/missing_span_in_backtrace.stderr
+++ b/tests/ui/consts/missing_span_in_backtrace.stderr
@@ -1,11 +1,11 @@
 error[E0080]: unable to copy parts of a pointer from memory at ALLOC0
-  --> $DIR/missing_span_in_backtrace.rs:14:9
+  --> $DIR/missing_span_in_backtrace.rs:15:9
    |
-14 | /         ptr::swap_nonoverlapping(
-15 | |             &mut ptr1 as *mut _ as *mut MaybeUninit<u8>,
-16 | |             &mut ptr2 as *mut _ as *mut MaybeUninit<u8>,
-17 | |             mem::size_of::<&i32>(),
-18 | |         );
+15 | /         ptr::swap_nonoverlapping(
+16 | |             &mut ptr1 as *mut _ as *mut MaybeUninit<u8>,
+17 | |             &mut ptr2 as *mut _ as *mut MaybeUninit<u8>,
+18 | |             mem::size_of::<&i32>(),
+19 | |         );
    | |_________^ evaluation of `X` failed inside this call
    |
    = help: this code performed an operation that depends on the underlying bytes representing a pointer
diff --git a/tests/ui/consts/try-operator.rs b/tests/ui/consts/try-operator.rs
index 59d9fcb1cbd..cd0bf8ea571 100644
--- a/tests/ui/consts/try-operator.rs
+++ b/tests/ui/consts/try-operator.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ run-pass
 
 #![feature(try_trait_v2)]
diff --git a/tests/ui/coroutine/panic-drops-resume.rs b/tests/ui/coroutine/panic-drops-resume.rs
index b23666b7885..ee58dab3e37 100644
--- a/tests/ui/coroutine/panic-drops-resume.rs
+++ b/tests/ui/coroutine/panic-drops-resume.rs
@@ -2,6 +2,7 @@
 
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 #![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
 
diff --git a/tests/ui/coroutine/panic-drops.rs b/tests/ui/coroutine/panic-drops.rs
index 8c2cf560f2a..c8ac401372f 100644
--- a/tests/ui/coroutine/panic-drops.rs
+++ b/tests/ui/coroutine/panic-drops.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 #![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
 
diff --git a/tests/ui/coroutine/panic-safe.rs b/tests/ui/coroutine/panic-safe.rs
index 6b9b4cb33c3..cee2afacb61 100644
--- a/tests/ui/coroutine/panic-safe.rs
+++ b/tests/ui/coroutine/panic-safe.rs
@@ -1,6 +1,6 @@
 //@ run-pass
 //@ needs-unwind
-
+//@ ignore-backends: gcc
 
 #![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
 
diff --git a/tests/ui/coroutine/resume-after-return.rs b/tests/ui/coroutine/resume-after-return.rs
index 7028e1e81e5..f566bd37d3d 100644
--- a/tests/ui/coroutine/resume-after-return.rs
+++ b/tests/ui/coroutine/resume-after-return.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ run-pass
 //@ needs-unwind
 
diff --git a/tests/ui/coroutine/unwind-abort-mix.rs b/tests/ui/coroutine/unwind-abort-mix.rs
index 517c6613e3d..175c2928a80 100644
--- a/tests/ui/coroutine/unwind-abort-mix.rs
+++ b/tests/ui/coroutine/unwind-abort-mix.rs
@@ -6,6 +6,7 @@
 //@ aux-build:unwind-aux.rs
 //@ compile-flags: -Cpanic=abort
 //@ needs-unwind
+//@ ignore-backends: gcc
 extern crate unwind_aux;
 
 pub fn main() {
diff --git a/tests/ui/issues/auxiliary/issue-2472-b.rs b/tests/ui/cross-crate/auxiliary/exporting-impl-from-root-causes-ice-2472-b.rs
index 0d151520fe0..0d151520fe0 100644
--- a/tests/ui/issues/auxiliary/issue-2472-b.rs
+++ b/tests/ui/cross-crate/auxiliary/exporting-impl-from-root-causes-ice-2472-b.rs
diff --git a/tests/ui/cross-crate/exporting-impl-from-root-causes-ice-2472.rs b/tests/ui/cross-crate/exporting-impl-from-root-causes-ice-2472.rs
new file mode 100644
index 00000000000..86d637b579d
--- /dev/null
+++ b/tests/ui/cross-crate/exporting-impl-from-root-causes-ice-2472.rs
@@ -0,0 +1,15 @@
+//@ run-pass
+//@ aux-build:exporting-impl-from-root-causes-ice-2472-b.rs
+
+
+extern crate exporting_impl_from_root_causes_ice_2472_b as lib;
+
+use lib::{S, T};
+
+pub fn main() {
+    let s = S(());
+    s.foo();
+    s.bar();
+}
+
+// https://github.com/rust-lang/rust/issues/2472
diff --git a/tests/ui/delegation/fn-header.rs b/tests/ui/delegation/fn-header.rs
index 9de0d549f20..608aef8d968 100644
--- a/tests/ui/delegation/fn-header.rs
+++ b/tests/ui/delegation/fn-header.rs
@@ -1,6 +1,7 @@
 //@ check-pass
 //@ edition:2018
 //@ aux-crate:fn_header_aux=fn-header-aux.rs
+//@ ignore-backends: gcc
 
 #![feature(c_variadic)]
 #![feature(fn_delegation)]
diff --git a/tests/ui/issues/issue-34229.rs b/tests/ui/derives/invalid-derive-comparison-34229.rs
index 13e627a492f..d77ca78dc81 100644
--- a/tests/ui/issues/issue-34229.rs
+++ b/tests/ui/derives/invalid-derive-comparison-34229.rs
@@ -3,3 +3,5 @@
 //~^ ERROR can't compare `Comparable`
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/34229
diff --git a/tests/ui/issues/issue-34229.stderr b/tests/ui/derives/invalid-derive-comparison-34229.stderr
index 2385284de0b..e3a9970670e 100644
--- a/tests/ui/issues/issue-34229.stderr
+++ b/tests/ui/derives/invalid-derive-comparison-34229.stderr
@@ -1,5 +1,5 @@
 error[E0277]: can't compare `Comparable` with `Comparable`
-  --> $DIR/issue-34229.rs:2:46
+  --> $DIR/invalid-derive-comparison-34229.rs:2:46
    |
 LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable);
    |                     ----------               ^^^^^^^^^^ no implementation for `Comparable < Comparable` and `Comparable > Comparable`
diff --git a/tests/ui/issues/issue-9446.rs b/tests/ui/drop/drop-immediate-non-box-ty-9446.rs
index a6ea91e8785..ad3f7b64aa9 100644
--- a/tests/ui/issues/issue-9446.rs
+++ b/tests/ui/drop/drop-immediate-non-box-ty-9446.rs
@@ -28,3 +28,5 @@ pub fn main() {
         Wrapper::new("Bob".to_string()).say_hi();
     }
 }
+
+// https://github.com/rust-lang/rust/issues/9446
diff --git a/tests/ui/drop/dynamic-drop-async.rs b/tests/ui/drop/dynamic-drop-async.rs
index e7a32d3c24e..64de6995c7a 100644
--- a/tests/ui/drop/dynamic-drop-async.rs
+++ b/tests/ui/drop/dynamic-drop-async.rs
@@ -6,6 +6,7 @@
 //@ run-pass
 //@ needs-unwind
 //@ edition:2018
+//@ ignore-backends: gcc
 
 #![allow(unused)]
 
diff --git a/tests/ui/drop/dynamic-drop.rs b/tests/ui/drop/dynamic-drop.rs
index b695b5702d9..1bd75e1852c 100644
--- a/tests/ui/drop/dynamic-drop.rs
+++ b/tests/ui/drop/dynamic-drop.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 #![feature(coroutines, coroutine_trait, stmt_expr_attributes)]
 #![feature(if_let_guard)]
diff --git a/tests/ui/issues/issue-32326.rs b/tests/ui/enum/recursive-enum-memory-32326.rs
index e928c66e2cc..6b8b04a7c91 100644
--- a/tests/ui/issues/issue-32326.rs
+++ b/tests/ui/enum/recursive-enum-memory-32326.rs
@@ -8,3 +8,5 @@ enum Expr { //~ ERROR E0072
 }
 
 fn main() { }
+
+// https://github.com/rust-lang/rust/issues/32326
diff --git a/tests/ui/issues/issue-32326.stderr b/tests/ui/enum/recursive-enum-memory-32326.stderr
index 1989a915cc1..0260a6758ed 100644
--- a/tests/ui/issues/issue-32326.stderr
+++ b/tests/ui/enum/recursive-enum-memory-32326.stderr
@@ -1,5 +1,5 @@
 error[E0072]: recursive type `Expr` has infinite size
-  --> $DIR/issue-32326.rs:5:1
+  --> $DIR/recursive-enum-memory-32326.rs:5:1
    |
 LL | enum Expr {
    | ^^^^^^^^^
diff --git a/tests/ui/issues/auxiliary/issue-18514.rs b/tests/ui/generics/auxiliary/generic-impl-method-match-autoderef-18514.rs
index 20c8e60ee45..20c8e60ee45 100644
--- a/tests/ui/issues/auxiliary/issue-18514.rs
+++ b/tests/ui/generics/auxiliary/generic-impl-method-match-autoderef-18514.rs
diff --git a/tests/ui/issues/issue-18514.rs b/tests/ui/generics/generic-impl-method-match-autoderef-18514.rs
index 89f58d3988d..3520e936209 100644
--- a/tests/ui/issues/issue-18514.rs
+++ b/tests/ui/generics/generic-impl-method-match-autoderef-18514.rs
@@ -5,12 +5,14 @@
 // expression that autoderefs through an overloaded generic deref
 // impl.
 
-//@ aux-build:issue-18514.rs
+//@ aux-build:generic-impl-method-match-autoderef-18514.rs
 
-extern crate issue_18514 as ice;
+extern crate generic_impl_method_match_autoderef_18514 as ice;
 use ice::{Tr, St};
 
 fn main() {
     let st: St<()> = St(vec![]);
     st.tr();
 }
+
+// https://github.com/rust-lang/rust/issues/18514
diff --git a/tests/ui/intrinsics/panic-uninitialized-zeroed.rs b/tests/ui/intrinsics/panic-uninitialized-zeroed.rs
index 346a94c37dd..cdf8aa85482 100644
--- a/tests/ui/intrinsics/panic-uninitialized-zeroed.rs
+++ b/tests/ui/intrinsics/panic-uninitialized-zeroed.rs
@@ -4,6 +4,7 @@
 //@ revisions: default strict
 //@ [strict]compile-flags: -Zstrict-init-checks
 //@ needs-subprocess
+//@ ignore-backends: gcc
 
 #![allow(deprecated, invalid_value)]
 #![feature(never_type)]
diff --git a/tests/ui/issues/issue-14875.rs b/tests/ui/issues/issue-14875.rs
index 235d255716f..e330c64a335 100644
--- a/tests/ui/issues/issue-14875.rs
+++ b/tests/ui/issues/issue-14875.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 // Check that values are not leaked when a dtor panics (#14875)
 
diff --git a/tests/ui/issues/issue-2472.rs b/tests/ui/issues/issue-2472.rs
deleted file mode 100644
index f8f539ed1d1..00000000000
--- a/tests/ui/issues/issue-2472.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-//@ run-pass
-//@ aux-build:issue-2472-b.rs
-
-
-extern crate issue_2472_b;
-
-use issue_2472_b::{S, T};
-
-pub fn main() {
-    let s = S(());
-    s.foo();
-    s.bar();
-}
diff --git a/tests/ui/issues/issue-29948.rs b/tests/ui/issues/issue-29948.rs
index 77e1f6807d9..77a3885da04 100644
--- a/tests/ui/issues/issue-29948.rs
+++ b/tests/ui/issues/issue-29948.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 use std::panic;
 
diff --git a/tests/ui/issues/issue-49544.rs b/tests/ui/issues/issue-49544.rs
deleted file mode 100644
index bb052501f8b..00000000000
--- a/tests/ui/issues/issue-49544.rs
+++ /dev/null
@@ -1,9 +0,0 @@
-//@ aux-build:issue-49544.rs
-//@ check-pass
-
-extern crate issue_49544;
-use issue_49544::foo;
-
-fn main() {
-    let _ = foo();
-}
diff --git a/tests/ui/issues/auxiliary/issue-49544.rs b/tests/ui/iterators/auxiliary/iterator-adapter-undeclared-type-49544.rs
index f8b3a3fba1e..f8b3a3fba1e 100644
--- a/tests/ui/issues/auxiliary/issue-49544.rs
+++ b/tests/ui/iterators/auxiliary/iterator-adapter-undeclared-type-49544.rs
diff --git a/tests/ui/iterators/iter-sum-overflow-debug.rs b/tests/ui/iterators/iter-sum-overflow-debug.rs
index 32efc925a45..974282b0379 100644
--- a/tests/ui/iterators/iter-sum-overflow-debug.rs
+++ b/tests/ui/iterators/iter-sum-overflow-debug.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 //@ compile-flags: -C debug_assertions=yes
 
 use std::panic;
diff --git a/tests/ui/iterators/iter-sum-overflow-overflow-checks.rs b/tests/ui/iterators/iter-sum-overflow-overflow-checks.rs
index 8fffd19e2be..aba6f9a188f 100644
--- a/tests/ui/iterators/iter-sum-overflow-overflow-checks.rs
+++ b/tests/ui/iterators/iter-sum-overflow-overflow-checks.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 //@ compile-flags: -C overflow-checks
 
 use std::panic;
diff --git a/tests/ui/iterators/iterator-adapter-undeclared-type-49544.rs b/tests/ui/iterators/iterator-adapter-undeclared-type-49544.rs
new file mode 100644
index 00000000000..f2532ceb1ba
--- /dev/null
+++ b/tests/ui/iterators/iterator-adapter-undeclared-type-49544.rs
@@ -0,0 +1,11 @@
+//@ aux-build:iterator-adapter-undeclared-type-49544.rs
+//@ check-pass
+
+extern crate iterator_adapter_undeclared_type_49544 as lib;
+use lib::foo;
+
+fn main() {
+    let _ = foo();
+}
+
+// https://github.com/rust-lang/rust/issues/49544
diff --git a/tests/ui/lto/all-crates.rs b/tests/ui/lto/all-crates.rs
index ceabf9f05df..fa17684dcff 100644
--- a/tests/ui/lto/all-crates.rs
+++ b/tests/ui/lto/all-crates.rs
@@ -2,6 +2,7 @@
 
 //@ compile-flags: -Clto=thin
 //@ no-prefer-dynamic
+//@ ignore-backends: gcc
 
 fn main() {
     println!("hello!");
diff --git a/tests/ui/lto/lto-thin-rustc-loads-linker-plugin.rs b/tests/ui/lto/lto-thin-rustc-loads-linker-plugin.rs
index a38d0e2b2e3..8579fd599f7 100644
--- a/tests/ui/lto/lto-thin-rustc-loads-linker-plugin.rs
+++ b/tests/ui/lto/lto-thin-rustc-loads-linker-plugin.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ compile-flags: -C lto=thin
 //@ aux-build:lto-rustc-loads-linker-plugin.rs
 //@ run-pass
diff --git a/tests/ui/lto/thin-lto-inlines2.rs b/tests/ui/lto/thin-lto-inlines2.rs
index 735557ab491..4c7b9278b08 100644
--- a/tests/ui/lto/thin-lto-inlines2.rs
+++ b/tests/ui/lto/thin-lto-inlines2.rs
@@ -4,6 +4,7 @@
 //@ aux-build:thin-lto-inlines-aux.rs
 //@ no-prefer-dynamic
 //@ ignore-emscripten can't inspect instructions on emscripten
+//@ ignore-backends: gcc
 
 // We want to assert here that ThinLTO will inline across codegen units. There's
 // not really a great way to do that in general so we sort of hack around it by
diff --git a/tests/ui/issues/issue-34418.rs b/tests/ui/macros/macro-invocation-with-curly-braces-34418.rs
index 0dcefb01935..46dbdd35ef6 100644
--- a/tests/ui/issues/issue-34418.rs
+++ b/tests/ui/macros/macro-invocation-with-curly-braces-34418.rs
@@ -17,3 +17,5 @@ fn g() {
 }
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/34418
diff --git a/tests/ui/issues/issue-106755.rs b/tests/ui/marker_trait_attr/conflicting-send-impls-for-marker-trait-106755.rs
index d7e7122ebda..891b8c1f74d 100644
--- a/tests/ui/issues/issue-106755.rs
+++ b/tests/ui/marker_trait_attr/conflicting-send-impls-for-marker-trait-106755.rs
@@ -20,3 +20,5 @@ impl !Send for TestType<i32> {}
 //~^ ERROR `!Send` impls cannot be specialized
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/106755
diff --git a/tests/ui/issues/issue-106755.stderr b/tests/ui/marker_trait_attr/conflicting-send-impls-for-marker-trait-106755.stderr
index da6b8c5c563..100b3bf1ae3 100644
--- a/tests/ui/issues/issue-106755.stderr
+++ b/tests/ui/marker_trait_attr/conflicting-send-impls-for-marker-trait-106755.stderr
@@ -1,5 +1,5 @@
 error[E0751]: found both positive and negative implementation of trait `Send` for type `TestType<_>`:
-  --> $DIR/issue-106755.rs:13:1
+  --> $DIR/conflicting-send-impls-for-marker-trait-106755.rs:13:1
    |
 LL | unsafe impl<T: MyTrait + 'static> Send for TestType<T> {}
    | ------------------------------------------------------ positive implementation here
@@ -8,7 +8,7 @@ LL | impl<T: MyTrait> !Send for TestType<T> {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ negative implementation here
 
 error[E0119]: conflicting implementations of trait `Send` for type `TestType<_>`
-  --> $DIR/issue-106755.rs:17:1
+  --> $DIR/conflicting-send-impls-for-marker-trait-106755.rs:17:1
    |
 LL | unsafe impl<T: MyTrait + 'static> Send for TestType<T> {}
    | ------------------------------------------------------ first implementation here
@@ -17,26 +17,26 @@ LL | unsafe impl<T: 'static> Send for TestType<T> {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `TestType<_>`
 
 error[E0367]: `!Send` impl requires `T: MyTrait` but the struct it is implemented for does not
-  --> $DIR/issue-106755.rs:13:9
+  --> $DIR/conflicting-send-impls-for-marker-trait-106755.rs:13:9
    |
 LL | impl<T: MyTrait> !Send for TestType<T> {}
    |         ^^^^^^^
    |
 note: the implementor must specify the same requirement
-  --> $DIR/issue-106755.rs:9:1
+  --> $DIR/conflicting-send-impls-for-marker-trait-106755.rs:9:1
    |
 LL | struct TestType<T>(::std::marker::PhantomData<T>);
    | ^^^^^^^^^^^^^^^^^^
 
 error[E0366]: `!Send` impls cannot be specialized
-  --> $DIR/issue-106755.rs:19:1
+  --> $DIR/conflicting-send-impls-for-marker-trait-106755.rs:19:1
    |
 LL | impl !Send for TestType<i32> {}
    | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
    = note: `i32` is not a generic parameter
 note: use the same sequence of generic lifetime, type and const parameters as the struct definition
-  --> $DIR/issue-106755.rs:9:1
+  --> $DIR/conflicting-send-impls-for-marker-trait-106755.rs:9:1
    |
 LL | struct TestType<T>(::std::marker::PhantomData<T>);
    | ^^^^^^^^^^^^^^^^^^
diff --git a/tests/ui/issues/issue-46964.rs b/tests/ui/match/innocent-looking-match-crash-46964.rs
index 6a29d91df73..c3efe874703 100644
--- a/tests/ui/issues/issue-46964.rs
+++ b/tests/ui/match/innocent-looking-match-crash-46964.rs
@@ -17,3 +17,5 @@ pub fn crash() -> bool {
 }
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/46964
diff --git a/tests/ui/issues/issue-53843.rs b/tests/ui/methods/inherent-method-resolution-on-deref-type-53843.rs
index d4b0b1e332b..0b2ab9afc39 100644
--- a/tests/ui/issues/issue-53843.rs
+++ b/tests/ui/methods/inherent-method-resolution-on-deref-type-53843.rs
@@ -24,3 +24,5 @@ fn main() {
     let pin = Pin(&mut unit);
     pin.poll();
 }
+
+// https://github.com/rust-lang/rust/issues/53843
diff --git a/tests/ui/mir/mir_drop_order.rs b/tests/ui/mir/mir_drop_order.rs
index 21d1054c422..a7a1a26a956 100644
--- a/tests/ui/mir/mir_drop_order.rs
+++ b/tests/ui/mir/mir_drop_order.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 
 use std::cell::RefCell;
 use std::panic;
diff --git a/tests/ui/mir/mir_let_chains_drop_order.rs b/tests/ui/mir/mir_let_chains_drop_order.rs
index 8a54f21b57f..1579e298ee7 100644
--- a/tests/ui/mir/mir_let_chains_drop_order.rs
+++ b/tests/ui/mir/mir_let_chains_drop_order.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 //@ edition: 2024
 
 // See `mir_drop_order.rs` for more information
diff --git a/tests/ui/mir/mir_match_guard_let_chains_drop_order.rs b/tests/ui/mir/mir_match_guard_let_chains_drop_order.rs
index e98d57d1154..3196513454b 100644
--- a/tests/ui/mir/mir_match_guard_let_chains_drop_order.rs
+++ b/tests/ui/mir/mir_match_guard_let_chains_drop_order.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 //@ revisions: edition2021 edition2024
 //@ [edition2021] edition: 2021
 //@ [edition2024] edition: 2024
diff --git a/tests/ui/moves/suggest-clone-when-some-obligation-is-unmet.stderr b/tests/ui/moves/suggest-clone-when-some-obligation-is-unmet.stderr
index c626796e01d..6272455cc57 100644
--- a/tests/ui/moves/suggest-clone-when-some-obligation-is-unmet.stderr
+++ b/tests/ui/moves/suggest-clone-when-some-obligation-is-unmet.stderr
@@ -8,6 +8,14 @@ LL |     let mut copy: Vec<U> = map.clone().into_values().collect();
    |
 note: `HashMap::<K, V, S>::into_values` takes ownership of the receiver `self`, which moves value
   --> $SRC_DIR/std/src/collections/hash/map.rs:LL:COL
+note: if `Hash128_1` implemented `Clone`, you could clone the value
+  --> $DIR/suggest-clone-when-some-obligation-is-unmet.rs:8:1
+   |
+LL | pub struct Hash128_1;
+   | ^^^^^^^^^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     let mut copy: Vec<U> = map.clone().into_values().collect();
+   |                            ----------- you could clone this value
 help: you could `clone` the value and consume it, if the `Hash128_1: Clone` trait bound could be satisfied
    |
 LL -     let mut copy: Vec<U> = map.clone().into_values().collect();
diff --git a/tests/ui/nll/issue-21232-partial-init-and-erroneous-use.stderr b/tests/ui/nll/issue-21232-partial-init-and-erroneous-use.stderr
index 63f230be7d4..3363c4ea28b 100644
--- a/tests/ui/nll/issue-21232-partial-init-and-erroneous-use.stderr
+++ b/tests/ui/nll/issue-21232-partial-init-and-erroneous-use.stderr
@@ -27,6 +27,15 @@ LL |     drop(d);
    |          - value moved here
 LL |     d.x = 10;
    |     ^^^^^^^^ value assigned here after move
+   |
+note: if `D` implemented `Clone`, you could clone the value
+  --> $DIR/issue-21232-partial-init-and-erroneous-use.rs:11:1
+   |
+LL | struct D {
+   | ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     drop(d);
+   |          - you could clone this value
 
 error[E0381]: partially assigned binding `d` isn't fully initialized
   --> $DIR/issue-21232-partial-init-and-erroneous-use.rs:45:5
@@ -57,6 +66,15 @@ LL |     drop(d);
    |          - value moved here
 LL |     d.s.y = 20;
    |     ^^^^^^^^^^ value partially assigned here after move
+   |
+note: if `D` implemented `Clone`, you could clone the value
+  --> $DIR/issue-21232-partial-init-and-erroneous-use.rs:11:1
+   |
+LL | struct D {
+   | ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     drop(d);
+   |          - you could clone this value
 
 error: aborting due to 6 previous errors
 
diff --git a/tests/ui/numbers-arithmetic/u128-as-f32.rs b/tests/ui/numbers-arithmetic/u128-as-f32.rs
index 88579f507eb..57c82d5a24f 100644
--- a/tests/ui/numbers-arithmetic/u128-as-f32.rs
+++ b/tests/ui/numbers-arithmetic/u128-as-f32.rs
@@ -1,4 +1,5 @@
 //@ run-pass
+//@ ignore-backends: gcc
 
 #![feature(test)]
 #![deny(overflowing_literals)]
diff --git a/tests/ui/panic-runtime/abort-link-to-unwinding-crates.rs b/tests/ui/panic-runtime/abort-link-to-unwinding-crates.rs
index 0566d2319df..bef2d8bcff0 100644
--- a/tests/ui/panic-runtime/abort-link-to-unwinding-crates.rs
+++ b/tests/ui/panic-runtime/abort-link-to-unwinding-crates.rs
@@ -3,6 +3,7 @@
 //@ aux-build:exit-success-if-unwind.rs
 //@ no-prefer-dynamic
 //@ needs-subprocess
+//@ ignore-backends: gcc
 
 extern crate exit_success_if_unwind;
 
diff --git a/tests/ui/panic-runtime/abort.rs b/tests/ui/panic-runtime/abort.rs
index 8cdfd018a92..2a52228801f 100644
--- a/tests/ui/panic-runtime/abort.rs
+++ b/tests/ui/panic-runtime/abort.rs
@@ -2,6 +2,7 @@
 //@ compile-flags:-C panic=abort
 //@ no-prefer-dynamic
 //@ needs-subprocess
+//@ ignore-backends: gcc
 
 use std::env;
 use std::process::Command;
diff --git a/tests/ui/panic-runtime/link-to-abort.rs b/tests/ui/panic-runtime/link-to-abort.rs
index a4013f2a6cf..98718ab8342 100644
--- a/tests/ui/panic-runtime/link-to-abort.rs
+++ b/tests/ui/panic-runtime/link-to-abort.rs
@@ -2,6 +2,7 @@
 
 //@ compile-flags:-C panic=abort
 //@ no-prefer-dynamic
+//@ ignore-backends: gcc
 
 #![feature(panic_abort)]
 
diff --git a/tests/ui/panic-runtime/lto-abort.rs b/tests/ui/panic-runtime/lto-abort.rs
index cf15ae6435b..cf36cd8c810 100644
--- a/tests/ui/panic-runtime/lto-abort.rs
+++ b/tests/ui/panic-runtime/lto-abort.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ run-pass
 //@ compile-flags:-C lto -C panic=abort
 //@ no-prefer-dynamic
diff --git a/tests/ui/parser/unclosed-delimiter-in-dep.rs b/tests/ui/parser/unclosed-delimiter-in-dep.rs
index 40f517f317e..4f0423a704f 100644
--- a/tests/ui/parser/unclosed-delimiter-in-dep.rs
+++ b/tests/ui/parser/unclosed-delimiter-in-dep.rs
@@ -1,3 +1,5 @@
+//@ ignore-backends: gcc
+
 mod unclosed_delim_mod;
 
 fn main() {
diff --git a/tests/ui/pattern/move-ref-patterns/move-ref-patterns-closure-captures-inside.stderr b/tests/ui/pattern/move-ref-patterns/move-ref-patterns-closure-captures-inside.stderr
index f19fed08917..deb14d141a9 100644
--- a/tests/ui/pattern/move-ref-patterns/move-ref-patterns-closure-captures-inside.stderr
+++ b/tests/ui/pattern/move-ref-patterns/move-ref-patterns-closure-captures-inside.stderr
@@ -146,6 +146,15 @@ LL |         m!((ref mut borrow, mov) = tup0);
 ...
 LL |     drop(&tup0);
    |          ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!((ref mut borrow, mov) = tup0);
+   |                                    ---- you could clone this value
 
 error[E0382]: borrow of moved value: `tup1`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:76:10
@@ -161,6 +170,15 @@ LL |         m!((mov, _, ref mut borrow) = tup1);
 ...
 LL |     drop(&tup1);
    |          ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!((mov, _, ref mut borrow) = tup1);
+   |                                       ---- you could clone this value
 
 error[E0382]: borrow of moved value: `tup2`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:77:10
@@ -176,6 +194,15 @@ LL |         m!((ref borrow, mov) = tup2);
 ...
 LL |     drop(&tup2);
    |          ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!((ref borrow, mov) = tup2);
+   |                                ---- you could clone this value
 
 error[E0382]: borrow of moved value: `tup3`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:78:10
@@ -191,6 +218,15 @@ LL |         m!((mov, _, ref borrow) = tup3);
 ...
 LL |     drop(&tup3);
    |          ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!((mov, _, ref borrow) = tup3);
+   |                                   ---- you could clone this value
 
 error[E0382]: borrow of moved value: `tup4`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:79:21
@@ -206,6 +242,15 @@ LL |         m!((ref borrow, mov) = tup4);
 ...
 LL |     m!((ref x, _) = &tup4);
    |                     ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!((ref borrow, mov) = tup4);
+   |                                ---- you could clone this value
 
 error[E0382]: borrow of moved value: `arr0`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:80:10
@@ -221,6 +266,15 @@ LL |         m!([mov @ .., ref borrow] = arr0);
 ...
 LL |     drop(&arr0);
    |          ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!([mov @ .., ref borrow] = arr0);
+   |                                     ---- you could clone this value
 
 error[E0382]: borrow of moved value: `arr1`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:81:35
@@ -236,6 +290,15 @@ LL |         m!([_, ref mut borrow @ .., _, mov] = arr1);
 ...
 LL |     m!([_, mov1, mov2, mov3, _] = &arr1);
    |                                   ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!([_, ref mut borrow @ .., _, mov] = arr1);
+   |                                               ---- you could clone this value
 
 error[E0382]: borrow of moved value: `arr2`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:82:10
@@ -251,6 +314,15 @@ LL |         m!([mov @ .., ref borrow] = arr2);
 ...
 LL |     drop(&arr2);
    |          ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!([mov @ .., ref borrow] = arr2);
+   |                                     ---- you could clone this value
 
 error[E0382]: borrow of moved value: `arr3`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:83:35
@@ -265,6 +337,15 @@ LL |         m!([_, ref borrow @ .., _, mov] = arr3);
 ...
 LL |     m!([_, mov1, mov2, mov3, _] = &arr3);
    |                                   ^^^^^ value borrowed here after move
+   |
+note: if `S` implemented `Clone`, you could clone the value
+  --> $DIR/move-ref-patterns-closure-captures-inside.rs:2:5
+   |
+LL |     struct S; // Not `Copy`.
+   |     ^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         m!([_, ref borrow @ .., _, mov] = arr3);
+   |                                           ---- you could clone this value
 
 error[E0382]: borrow of moved value: `tup0`
   --> $DIR/move-ref-patterns-closure-captures-inside.rs:111:10
diff --git a/tests/ui/issues/issue-54062.rs b/tests/ui/privacy/private-field-access-in-mutex-54062.rs
index 093d6601d4e..f145f9c3e52 100644
--- a/tests/ui/issues/issue-54062.rs
+++ b/tests/ui/privacy/private-field-access-in-mutex-54062.rs
@@ -10,3 +10,5 @@ fn testing(test: Test) {
     let _ = test.comps.inner.try_lock();
     //~^ ERROR: field `inner` of struct `Mutex` is private
 }
+
+// https://github.com/rust-lang/rust/issues/54062
diff --git a/tests/ui/issues/issue-54062.stderr b/tests/ui/privacy/private-field-access-in-mutex-54062.stderr
index 75eef543f27..14244107597 100644
--- a/tests/ui/issues/issue-54062.stderr
+++ b/tests/ui/privacy/private-field-access-in-mutex-54062.stderr
@@ -1,5 +1,5 @@
 error[E0616]: field `inner` of struct `Mutex` is private
-  --> $DIR/issue-54062.rs:10:24
+  --> $DIR/private-field-access-in-mutex-54062.rs:10:24
    |
 LL |     let _ = test.comps.inner.try_lock();
    |                        ^^^^^ private field
diff --git a/tests/ui/process/nofile-limit.rs b/tests/ui/process/nofile-limit.rs
index dafc982607c..64777b51425 100644
--- a/tests/ui/process/nofile-limit.rs
+++ b/tests/ui/process/nofile-limit.rs
@@ -7,6 +7,8 @@
 //@ only-linux
 //@ no-prefer-dynamic
 //@ compile-flags: -Ctarget-feature=+crt-static -Crpath=no -Crelocation-model=static
+//@ ignore-backends: gcc
+
 #![feature(exit_status_error)]
 #![feature(rustc_private)]
 extern crate libc;
diff --git a/tests/ui/process/println-with-broken-pipe.rs b/tests/ui/process/println-with-broken-pipe.rs
index fbac9b6cd95..58b83a2dd9a 100644
--- a/tests/ui/process/println-with-broken-pipe.rs
+++ b/tests/ui/process/println-with-broken-pipe.rs
@@ -5,6 +5,7 @@
 //@ ignore-fuchsia
 //@ ignore-horizon
 //@ ignore-android
+//@ ignore-backends: gcc
 //@ normalize-stderr: ".rs:\d+:\d+" -> ".rs:LL:CC"
 //@ compile-flags: -Zon-broken-pipe=error
 
diff --git a/tests/ui/issues/issue-67552.rs b/tests/ui/recursion/recursive-impl-trait-iterator-by-ref-67552.rs
index 53f0e931d60..0875d385ddc 100644
--- a/tests/ui/issues/issue-67552.rs
+++ b/tests/ui/recursion/recursive-impl-trait-iterator-by-ref-67552.rs
@@ -29,3 +29,5 @@ where
         //~^ ERROR reached the recursion limit while instantiating
     }
 }
+
+// https://github.com/rust-lang/rust/issues/67552
diff --git a/tests/ui/issues/issue-67552.stderr b/tests/ui/recursion/recursive-impl-trait-iterator-by-ref-67552.stderr
index def0a29f3e5..fe005984fab 100644
--- a/tests/ui/issues/issue-67552.stderr
+++ b/tests/ui/recursion/recursive-impl-trait-iterator-by-ref-67552.stderr
@@ -1,17 +1,17 @@
 error: reached the recursion limit while instantiating `rec::<&mut &mut &mut &mut &mut ...>`
-  --> $DIR/issue-67552.rs:28:9
+  --> $DIR/recursive-impl-trait-iterator-by-ref-67552.rs:28:9
    |
 LL |         rec(identity(&mut it))
    |         ^^^^^^^^^^^^^^^^^^^^^^
    |
 note: `rec` defined here
-  --> $DIR/issue-67552.rs:21:1
+  --> $DIR/recursive-impl-trait-iterator-by-ref-67552.rs:21:1
    |
 LL | / fn rec<T>(mut it: T)
 LL | | where
 LL | |     T: Iterator,
    | |________________^
-   = note: the full type name has been written to '$TEST_BUILD_DIR/issue-67552.long-type.txt'
+   = note: the full type name has been written to '$TEST_BUILD_DIR/recursive-impl-trait-iterator-by-ref-67552.long-type.txt'
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/issues/issue-24353.rs b/tests/ui/return/early-return-with-unreachable-code-24353.rs
index 369fc238d11..13add4652d9 100644
--- a/tests/ui/issues/issue-24353.rs
+++ b/tests/ui/return/early-return-with-unreachable-code-24353.rs
@@ -6,3 +6,5 @@ fn main() {
     let x = ();
     x
 }
+
+// https://github.com/rust-lang/rust/issues/24353
diff --git a/tests/ui/rfcs/rfc-2091-track-caller/std-panic-locations.rs b/tests/ui/rfcs/rfc-2091-track-caller/std-panic-locations.rs
index bd62a644785..b1df1b191bc 100644
--- a/tests/ui/rfcs/rfc-2091-track-caller/std-panic-locations.rs
+++ b/tests/ui/rfcs/rfc-2091-track-caller/std-panic-locations.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 //@ revisions: default mir-opt
 //@[mir-opt] compile-flags: -Zmir-opt-level=4
 
diff --git a/tests/ui/runtime/on-broken-pipe/child-processes.rs b/tests/ui/runtime/on-broken-pipe/child-processes.rs
index 0da2347481b..c0c8ad4e2f5 100644
--- a/tests/ui/runtime/on-broken-pipe/child-processes.rs
+++ b/tests/ui/runtime/on-broken-pipe/child-processes.rs
@@ -1,6 +1,7 @@
 //@ revisions: default error kill inherit
 //@ ignore-cross-compile because aux-bin does not yet support it
 //@ only-unix because SIGPIPE is a unix thing
+//@ ignore-backends: gcc
 //@ run-pass
 //@ aux-bin:assert-sigpipe-disposition.rs
 //@ aux-crate:sigpipe_utils=sigpipe-utils.rs
diff --git a/tests/ui/runtime/rt-explody-panic-payloads.rs b/tests/ui/runtime/rt-explody-panic-payloads.rs
index d564a26ca73..1d5795f8e86 100644
--- a/tests/ui/runtime/rt-explody-panic-payloads.rs
+++ b/tests/ui/runtime/rt-explody-panic-payloads.rs
@@ -1,6 +1,7 @@
 //@ run-pass
 //@ needs-unwind
 //@ needs-subprocess
+//@ ignore-backends: gcc
 
 use std::env;
 use std::process::Command;
diff --git a/tests/ui/sanitizer/cfi/assoc-ty-lifetime-issue-123053.rs b/tests/ui/sanitizer/cfi/assoc-ty-lifetime-issue-123053.rs
index f4f383e008a..fad57198dfb 100644
--- a/tests/ui/sanitizer/cfi/assoc-ty-lifetime-issue-123053.rs
+++ b/tests/ui/sanitizer/cfi/assoc-ty-lifetime-issue-123053.rs
@@ -6,6 +6,7 @@
 //@ edition: 2021
 //@ no-prefer-dynamic
 //@ only-x86_64-unknown-linux-gnu
+//@ ignore-backends: gcc
 //@ build-pass
 
 trait Iterable {
diff --git a/tests/ui/sanitizer/cfi/async-closures.rs b/tests/ui/sanitizer/cfi/async-closures.rs
index 351853ab1a7..9b099263000 100644
--- a/tests/ui/sanitizer/cfi/async-closures.rs
+++ b/tests/ui/sanitizer/cfi/async-closures.rs
@@ -4,6 +4,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/can-reveal-opaques.rs b/tests/ui/sanitizer/cfi/can-reveal-opaques.rs
index 99c12d72eb5..a881c6b92b2 100644
--- a/tests/ui/sanitizer/cfi/can-reveal-opaques.rs
+++ b/tests/ui/sanitizer/cfi/can-reveal-opaques.rs
@@ -2,6 +2,7 @@
 //@ compile-flags: -Ccodegen-units=1 -Clto -Ctarget-feature=-crt-static -Zsanitizer=cfi
 //@ no-prefer-dynamic
 //@ only-x86_64-unknown-linux-gnu
+//@ ignore-backends: gcc
 //@ build-pass
 
 // See comment below for why this test exists.
diff --git a/tests/ui/sanitizer/cfi/closures.rs b/tests/ui/sanitizer/cfi/closures.rs
index 424e70560db..fc9718faa28 100644
--- a/tests/ui/sanitizer/cfi/closures.rs
+++ b/tests/ui/sanitizer/cfi/closures.rs
@@ -3,6 +3,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/complex-receiver.rs b/tests/ui/sanitizer/cfi/complex-receiver.rs
index c7b45a775ca..aac44c33227 100644
--- a/tests/ui/sanitizer/cfi/complex-receiver.rs
+++ b/tests/ui/sanitizer/cfi/complex-receiver.rs
@@ -5,6 +5,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/coroutine.rs b/tests/ui/sanitizer/cfi/coroutine.rs
index 39a754f1036..084a521f597 100644
--- a/tests/ui/sanitizer/cfi/coroutine.rs
+++ b/tests/ui/sanitizer/cfi/coroutine.rs
@@ -3,6 +3,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ edition: 2024
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
diff --git a/tests/ui/sanitizer/cfi/drop-in-place.rs b/tests/ui/sanitizer/cfi/drop-in-place.rs
index 8ce2c432602..160338a5b54 100644
--- a/tests/ui/sanitizer/cfi/drop-in-place.rs
+++ b/tests/ui/sanitizer/cfi/drop-in-place.rs
@@ -2,6 +2,7 @@
 //
 // FIXME(#122848): Remove only-linux when fixed.
 //@ only-linux
+//@ ignore-backends: gcc
 //@ needs-sanitizer-cfi
 //@ compile-flags: -Clto -Copt-level=0 -Cprefer-dynamic=off -Ctarget-feature=-crt-static -Zsanitizer=cfi
 //@ run-pass
diff --git a/tests/ui/sanitizer/cfi/drop-no-principal.rs b/tests/ui/sanitizer/cfi/drop-no-principal.rs
index c1c88c8c71c..e3a46fe9d75 100644
--- a/tests/ui/sanitizer/cfi/drop-no-principal.rs
+++ b/tests/ui/sanitizer/cfi/drop-no-principal.rs
@@ -3,6 +3,7 @@
 //@ needs-sanitizer-cfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries works
 //@ only-linux
+//@ ignore-backends: gcc
 //@ compile-flags: --crate-type=bin -Cprefer-dynamic=off -Clto -Zsanitizer=cfi
 //@ compile-flags: -C target-feature=-crt-static -C codegen-units=1 -C opt-level=0
 // FIXME(#118761) Should be run-pass once the labels on drop are compatible.
diff --git a/tests/ui/sanitizer/cfi/fn-ptr.rs b/tests/ui/sanitizer/cfi/fn-ptr.rs
index 505b4b8e7f0..d3209c62ddf 100644
--- a/tests/ui/sanitizer/cfi/fn-ptr.rs
+++ b/tests/ui/sanitizer/cfi/fn-ptr.rs
@@ -3,6 +3,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/self-ref.rs b/tests/ui/sanitizer/cfi/self-ref.rs
index 3b524ac661c..b93d49296b6 100644
--- a/tests/ui/sanitizer/cfi/self-ref.rs
+++ b/tests/ui/sanitizer/cfi/self-ref.rs
@@ -3,6 +3,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/sized-associated-ty.rs b/tests/ui/sanitizer/cfi/sized-associated-ty.rs
index f5b4e22e9d9..eefc3e2e9db 100644
--- a/tests/ui/sanitizer/cfi/sized-associated-ty.rs
+++ b/tests/ui/sanitizer/cfi/sized-associated-ty.rs
@@ -4,6 +4,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/supertraits.rs b/tests/ui/sanitizer/cfi/supertraits.rs
index f80b3169188..f5a984b9583 100644
--- a/tests/ui/sanitizer/cfi/supertraits.rs
+++ b/tests/ui/sanitizer/cfi/supertraits.rs
@@ -3,6 +3,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/cfi/virtual-auto.rs b/tests/ui/sanitizer/cfi/virtual-auto.rs
index 6971d516a20..e6f2ebd4b2c 100644
--- a/tests/ui/sanitizer/cfi/virtual-auto.rs
+++ b/tests/ui/sanitizer/cfi/virtual-auto.rs
@@ -3,6 +3,7 @@
 //@ revisions: cfi kcfi
 // FIXME(#122848) Remove only-linux once OSX CFI binaries work
 //@ only-linux
+//@ ignore-backends: gcc
 //@ [cfi] needs-sanitizer-cfi
 //@ [kcfi] needs-sanitizer-kcfi
 //@ compile-flags: -C target-feature=-crt-static
diff --git a/tests/ui/sanitizer/kcfi-mangling.rs b/tests/ui/sanitizer/kcfi-mangling.rs
index fde7b5451b6..ba36dc184ec 100644
--- a/tests/ui/sanitizer/kcfi-mangling.rs
+++ b/tests/ui/sanitizer/kcfi-mangling.rs
@@ -4,6 +4,7 @@
 //@ no-prefer-dynamic
 //@ compile-flags: -C panic=abort -Zsanitizer=kcfi -C symbol-mangling-version=v0
 //@ build-pass
+//@ ignore-backends: gcc
 
 trait Foo {
     fn foo(&self);
diff --git a/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs b/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
index bf38a8b1720..09f5d41a87c 100644
--- a/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
+++ b/tests/ui/simd/intrinsic/generic-arithmetic-pass.rs
@@ -1,4 +1,6 @@
 //@ run-pass
+//@ ignore-backends: gcc
+
 #![allow(non_camel_case_types)]
 #![feature(repr_simd, core_intrinsics)]
 
diff --git a/tests/ui/simd/intrinsic/generic-as.rs b/tests/ui/simd/intrinsic/generic-as.rs
index f9ed416b6ff..bba712e6296 100644
--- a/tests/ui/simd/intrinsic/generic-as.rs
+++ b/tests/ui/simd/intrinsic/generic-as.rs
@@ -1,4 +1,5 @@
 //@ run-pass
+//@ ignore-backends: gcc
 
 #![feature(repr_simd, core_intrinsics)]
 
diff --git a/tests/ui/simd/issue-17170.rs b/tests/ui/simd/issue-17170.rs
index 2d13962843c..508f480a58d 100644
--- a/tests/ui/simd/issue-17170.rs
+++ b/tests/ui/simd/issue-17170.rs
@@ -1,4 +1,6 @@
 //@ run-pass
+//@ ignore-backends: gcc
+
 #![feature(repr_simd)]
 
 #[repr(simd)]
diff --git a/tests/ui/simd/issue-39720.rs b/tests/ui/simd/issue-39720.rs
index 09d6142c920..41617c744d6 100644
--- a/tests/ui/simd/issue-39720.rs
+++ b/tests/ui/simd/issue-39720.rs
@@ -1,4 +1,5 @@
 //@ run-pass
+//@ ignore-backends: gcc
 
 #![feature(repr_simd, core_intrinsics)]
 
diff --git a/tests/ui/simd/masked-load-store.rs b/tests/ui/simd/masked-load-store.rs
index da32ba611c4..bc4307fb26d 100644
--- a/tests/ui/simd/masked-load-store.rs
+++ b/tests/ui/simd/masked-load-store.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ run-pass
 #![feature(repr_simd, core_intrinsics)]
 
diff --git a/tests/ui/simd/repr_packed.rs b/tests/ui/simd/repr_packed.rs
index f0c6de7c402..9cf679dc432 100644
--- a/tests/ui/simd/repr_packed.rs
+++ b/tests/ui/simd/repr_packed.rs
@@ -1,3 +1,4 @@
+//@ ignore-backends: gcc
 //@ run-pass
 
 #![feature(repr_simd, core_intrinsics)]
diff --git a/tests/ui/simd/simd-bitmask-notpow2.rs b/tests/ui/simd/simd-bitmask-notpow2.rs
index b9af591d1b9..991fe0d8933 100644
--- a/tests/ui/simd/simd-bitmask-notpow2.rs
+++ b/tests/ui/simd/simd-bitmask-notpow2.rs
@@ -2,6 +2,8 @@
 // FIXME: broken codegen on big-endian (https://github.com/rust-lang/rust/issues/127205)
 // This should be merged into `simd-bitmask` once that's fixed.
 //@ ignore-endian-big
+//@ ignore-backends: gcc
+
 #![feature(repr_simd, core_intrinsics)]
 
 #[path = "../../auxiliary/minisimd.rs"]
diff --git a/tests/ui/issues/issue-37534.rs b/tests/ui/sized/relaxing-default-bound-error-37534.rs
index 63f6479ae2e..d30e9f92ce9 100644
--- a/tests/ui/issues/issue-37534.rs
+++ b/tests/ui/sized/relaxing-default-bound-error-37534.rs
@@ -3,3 +3,5 @@ struct Foo<T: ?Hash> {}
 //~| ERROR bound modifier `?` can only be applied to `Sized`
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/37534
diff --git a/tests/ui/issues/issue-37534.stderr b/tests/ui/sized/relaxing-default-bound-error-37534.stderr
index 08607354203..8b9597f33e3 100644
--- a/tests/ui/issues/issue-37534.stderr
+++ b/tests/ui/sized/relaxing-default-bound-error-37534.stderr
@@ -1,5 +1,5 @@
 error[E0404]: expected trait, found derive macro `Hash`
-  --> $DIR/issue-37534.rs:1:16
+  --> $DIR/relaxing-default-bound-error-37534.rs:1:16
    |
 LL | struct Foo<T: ?Hash> {}
    |                ^^^^ not a trait
@@ -10,7 +10,7 @@ LL + use std::hash::Hash;
    |
 
 error: bound modifier `?` can only be applied to `Sized`
-  --> $DIR/issue-37534.rs:1:15
+  --> $DIR/relaxing-default-bound-error-37534.rs:1:15
    |
 LL | struct Foo<T: ?Hash> {}
    |               ^^^^^
diff --git a/tests/ui/static/static-items-cant-move.stderr b/tests/ui/static/static-items-cant-move.stderr
index 1361e7089e8..7c806613c5c 100644
--- a/tests/ui/static/static-items-cant-move.stderr
+++ b/tests/ui/static/static-items-cant-move.stderr
@@ -3,6 +3,15 @@ error[E0507]: cannot move out of static item `BAR`
    |
 LL |     test(BAR);
    |          ^^^ move occurs because `BAR` has type `Foo`, which does not implement the `Copy` trait
+   |
+note: if `Foo` implemented `Clone`, you could clone the value
+  --> $DIR/static-items-cant-move.rs:5:1
+   |
+LL | struct Foo {
+   | ^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     test(BAR);
+   |          --- you could clone this value
 
 error: aborting due to 1 previous error
 
diff --git a/tests/ui/statics/const_generics.rs b/tests/ui/statics/const_generics.rs
index 6cc0a65f77d..1921b2c99a3 100644
--- a/tests/ui/statics/const_generics.rs
+++ b/tests/ui/statics/const_generics.rs
@@ -3,6 +3,7 @@
 //! This is not an intentional guarantee, it just describes the status quo.
 
 //@ run-pass
+//@ ignore-backends: gcc
 // With optimizations, LLVM will deduplicate the constant `X` whose
 // value is `&42` to just be a reference to the static. This is correct,
 // but obscures the issue we're trying to show.
diff --git a/tests/ui/issues/issue-3389.rs b/tests/ui/structs/trie-node-structure-usage-3389.rs
index 4e73a2cf001..1518e107944 100644
--- a/tests/ui/issues/issue-3389.rs
+++ b/tests/ui/structs/trie-node-structure-usage-3389.rs
@@ -24,3 +24,5 @@ pub fn main() {
     print_str_vector(node.content.clone());
 
 }
+
+// https://github.com/rust-lang/rust/issues/3389
diff --git a/tests/ui/suggestions/option-content-move2.stderr b/tests/ui/suggestions/option-content-move2.stderr
index 436441d6f1b..c73e874b403 100644
--- a/tests/ui/suggestions/option-content-move2.stderr
+++ b/tests/ui/suggestions/option-content-move2.stderr
@@ -13,6 +13,15 @@ LL |         move || {
 LL |
 LL |             var = Some(NotCopyable);
    |             --- variable moved due to use in closure
+   |
+note: if `NotCopyable` implemented `Clone`, you could clone the value
+  --> $DIR/option-content-move2.rs:1:1
+   |
+LL | struct NotCopyable;
+   | ^^^^^^^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |             var = Some(NotCopyable);
+   |             --- you could clone this value
 
 error[E0507]: cannot move out of `var`, a captured variable in an `FnMut` closure
   --> $DIR/option-content-move2.rs:21:9
diff --git a/tests/ui/issues/issue-39089.rs b/tests/ui/trait-bounds/for-binder-placement-error-39089.rs
index 822c47503af..47976bdfff4 100644
--- a/tests/ui/issues/issue-39089.rs
+++ b/tests/ui/trait-bounds/for-binder-placement-error-39089.rs
@@ -2,3 +2,5 @@ fn f<T: ?for<'a> Sized>() {}
 //~^ ERROR `for<...>` binder should be placed before trait bound modifiers
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/39089
diff --git a/tests/ui/issues/issue-39089.stderr b/tests/ui/trait-bounds/for-binder-placement-error-39089.stderr
index a81010aedff..12fcbc5757f 100644
--- a/tests/ui/issues/issue-39089.stderr
+++ b/tests/ui/trait-bounds/for-binder-placement-error-39089.stderr
@@ -1,5 +1,5 @@
 error: `for<...>` binder should be placed before trait bound modifiers
-  --> $DIR/issue-39089.rs:1:13
+  --> $DIR/for-binder-placement-error-39089.rs:1:13
    |
 LL | fn f<T: ?for<'a> Sized>() {}
    |         -   ^^^^
diff --git a/tests/ui/traits/const-traits/const-drop-fail.new_precise.stderr b/tests/ui/traits/const-traits/const-drop-fail.new_precise.stderr
index 9c49ee56b0f..ff803ff889b 100644
--- a/tests/ui/traits/const-traits/const-drop-fail.new_precise.stderr
+++ b/tests/ui/traits/const-traits/const-drop-fail.new_precise.stderr
@@ -1,5 +1,5 @@
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:33:5
+  --> $DIR/const-drop-fail.rs:34:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -8,13 +8,13 @@ LL |     NonTrivialDrop,
    |     ^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
 
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:35:5
+  --> $DIR/const-drop-fail.rs:36:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -23,7 +23,7 @@ LL |     ConstImplWithDropGlue(NonTrivialDrop),
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
diff --git a/tests/ui/traits/const-traits/const-drop-fail.new_stock.stderr b/tests/ui/traits/const-traits/const-drop-fail.new_stock.stderr
index 9c49ee56b0f..ff803ff889b 100644
--- a/tests/ui/traits/const-traits/const-drop-fail.new_stock.stderr
+++ b/tests/ui/traits/const-traits/const-drop-fail.new_stock.stderr
@@ -1,5 +1,5 @@
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:33:5
+  --> $DIR/const-drop-fail.rs:34:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -8,13 +8,13 @@ LL |     NonTrivialDrop,
    |     ^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
 
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:35:5
+  --> $DIR/const-drop-fail.rs:36:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -23,7 +23,7 @@ LL |     ConstImplWithDropGlue(NonTrivialDrop),
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
diff --git a/tests/ui/traits/const-traits/const-drop-fail.old_precise.stderr b/tests/ui/traits/const-traits/const-drop-fail.old_precise.stderr
index 9c49ee56b0f..ff803ff889b 100644
--- a/tests/ui/traits/const-traits/const-drop-fail.old_precise.stderr
+++ b/tests/ui/traits/const-traits/const-drop-fail.old_precise.stderr
@@ -1,5 +1,5 @@
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:33:5
+  --> $DIR/const-drop-fail.rs:34:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -8,13 +8,13 @@ LL |     NonTrivialDrop,
    |     ^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
 
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:35:5
+  --> $DIR/const-drop-fail.rs:36:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -23,7 +23,7 @@ LL |     ConstImplWithDropGlue(NonTrivialDrop),
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
diff --git a/tests/ui/traits/const-traits/const-drop-fail.old_stock.stderr b/tests/ui/traits/const-traits/const-drop-fail.old_stock.stderr
index 9c49ee56b0f..ff803ff889b 100644
--- a/tests/ui/traits/const-traits/const-drop-fail.old_stock.stderr
+++ b/tests/ui/traits/const-traits/const-drop-fail.old_stock.stderr
@@ -1,5 +1,5 @@
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:33:5
+  --> $DIR/const-drop-fail.rs:34:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -8,13 +8,13 @@ LL |     NonTrivialDrop,
    |     ^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
 
 error[E0277]: the trait bound `NonTrivialDrop: const Destruct` is not satisfied
-  --> $DIR/const-drop-fail.rs:35:5
+  --> $DIR/const-drop-fail.rs:36:5
    |
 LL |         const _: () = check($exp);
    |                       ----- required by a bound introduced by this call
@@ -23,7 +23,7 @@ LL |     ConstImplWithDropGlue(NonTrivialDrop),
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    |
 note: required by a bound in `check`
-  --> $DIR/const-drop-fail.rs:24:19
+  --> $DIR/const-drop-fail.rs:25:19
    |
 LL | const fn check<T: [const] Destruct>(_: T) {}
    |                   ^^^^^^^^^^^^^^^^ required by this bound in `check`
diff --git a/tests/ui/traits/const-traits/const-drop-fail.rs b/tests/ui/traits/const-traits/const-drop-fail.rs
index 4513d71f613..b74716f0061 100644
--- a/tests/ui/traits/const-traits/const-drop-fail.rs
+++ b/tests/ui/traits/const-traits/const-drop-fail.rs
@@ -1,6 +1,7 @@
 //@[new_precise] compile-flags: -Znext-solver
 //@[new_stock] compile-flags: -Znext-solver
 //@ revisions: new_stock old_stock new_precise old_precise
+//@ ignore-backends: gcc
 
 #![feature(const_trait_impl, const_destruct)]
 #![cfg_attr(any(new_precise, old_precise), feature(const_precise_live_drops))]
diff --git a/tests/ui/issues/issue-23281.rs b/tests/ui/traits/dyn-trait-size-error-23281.rs
index 72716896426..8e44b8c8799 100644
--- a/tests/ui/issues/issue-23281.rs
+++ b/tests/ui/traits/dyn-trait-size-error-23281.rs
@@ -10,3 +10,5 @@ struct Vec<T> {
 }
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/23281
diff --git a/tests/ui/issues/issue-23281.stderr b/tests/ui/traits/dyn-trait-size-error-23281.stderr
index ee079f2deec..d7b791a0452 100644
--- a/tests/ui/issues/issue-23281.stderr
+++ b/tests/ui/traits/dyn-trait-size-error-23281.stderr
@@ -1,17 +1,17 @@
 error[E0277]: the size for values of type `(dyn Fn() + 'static)` cannot be known at compilation time
-  --> $DIR/issue-23281.rs:4:27
+  --> $DIR/dyn-trait-size-error-23281.rs:4:27
    |
 LL |     pub fn function(funs: Vec<dyn Fn() -> ()>) {}
    |                           ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time
    |
    = help: the trait `Sized` is not implemented for `(dyn Fn() + 'static)`
 note: required by an implicit `Sized` bound in `Vec`
-  --> $DIR/issue-23281.rs:8:12
+  --> $DIR/dyn-trait-size-error-23281.rs:8:12
    |
 LL | struct Vec<T> {
    |            ^ required by the implicit `Sized` requirement on this type parameter in `Vec`
 help: you could relax the implicit `Sized` bound on `T` if it were used through indirection like `&T` or `Box<T>`
-  --> $DIR/issue-23281.rs:8:12
+  --> $DIR/dyn-trait-size-error-23281.rs:8:12
    |
 LL | struct Vec<T> {
    |            ^ this could be changed to `T: ?Sized`...
diff --git a/tests/ui/issues/issue-36839.rs b/tests/ui/traits/trait-associated-type-bounds-36839.rs
index 654c0f6e4b5..156c063abc2 100644
--- a/tests/ui/issues/issue-36839.rs
+++ b/tests/ui/traits/trait-associated-type-bounds-36839.rs
@@ -19,3 +19,5 @@ impl<T> Broken for T {
 fn main() {
     let _m: &dyn Broken<Assoc=()> = &();
 }
+
+// https://github.com/rust-lang/rust/issues/36839
diff --git a/tests/ui/issues/issue-5280.rs b/tests/ui/traits/trait-implementation-for-primitive-type-5280.rs
index 66452c36776..72a4283bc7e 100644
--- a/tests/ui/issues/issue-5280.rs
+++ b/tests/ui/traits/trait-implementation-for-primitive-type-5280.rs
@@ -16,3 +16,5 @@ impl FontTableTagConversions for FontTableTag {
 pub fn main() {
     5.tag_to_string();
 }
+
+// https://github.com/rust-lang/rust/issues/5280
diff --git a/tests/ui/issues/issue-5321-immediates-with-bare-self.rs b/tests/ui/traits/trait-implementation-for-usize-5321.rs
index cb35a641c5e..ab997b6627a 100644
--- a/tests/ui/issues/issue-5321-immediates-with-bare-self.rs
+++ b/tests/ui/traits/trait-implementation-for-usize-5321.rs
@@ -13,3 +13,5 @@ impl Fooable for usize {
 pub fn main() {
     2.yes();
 }
+
+// https://github.com/rust-lang/rust/issues/5321
diff --git a/tests/ui/issues/issue-21174.rs b/tests/ui/transmutability/transmute-between-associated-types-with-lifetimers-21174.rs
index 07827425116..22cb379ffda 100644
--- a/tests/ui/issues/issue-21174.rs
+++ b/tests/ui/transmutability/transmute-between-associated-types-with-lifetimers-21174.rs
@@ -9,3 +9,5 @@ fn foo<'a, T: Trait<'a>>(value: T::A) {
 }
 
 fn main() { }
+
+// https://github.com/rust-lang/rust/issues/21174
diff --git a/tests/ui/issues/issue-21174.stderr b/tests/ui/transmutability/transmute-between-associated-types-with-lifetimers-21174.stderr
index a6b75c91352..5c0cd91cee1 100644
--- a/tests/ui/issues/issue-21174.stderr
+++ b/tests/ui/transmutability/transmute-between-associated-types-with-lifetimers-21174.stderr
@@ -1,5 +1,5 @@
 error[E0512]: cannot transmute between types of different sizes, or dependently-sized types
-  --> $DIR/issue-21174.rs:7:30
+  --> $DIR/transmute-between-associated-types-with-lifetimers-21174.rs:7:30
    |
 LL |     let new: T::B = unsafe { std::mem::transmute(value) };
    |                              ^^^^^^^^^^^^^^^^^^^
diff --git a/tests/ui/issues/issue-14382.rs b/tests/ui/type-inference/float-type-inference-unification-14382.rs
index 74d938783ae..5bf497d2eab 100644
--- a/tests/ui/issues/issue-14382.rs
+++ b/tests/ui/type-inference/float-type-inference-unification-14382.rs
@@ -13,3 +13,5 @@ fn main() {
     let m : Matrix4<f32> = translate(x);
     println!("m: {:?}", m);
 }
+
+// https://github.com/rust-lang/rust/issues/14382
diff --git a/tests/ui/issues/issue-18952.rs b/tests/ui/unboxed-closures/fn-traits-overloading-arity-18952.rs
index 9fdafb1ff4a..4e3bc9b671a 100644
--- a/tests/ui/issues/issue-18952.rs
+++ b/tests/ui/unboxed-closures/fn-traits-overloading-arity-18952.rs
@@ -54,3 +54,5 @@ fn main() {
     assert_eq!(foo(1, 1), (2, 2));
     assert_eq!(foo(1, 1, 1), (4, 4, 4));
 }
+
+// https://github.com/rust-lang/rust/issues/18952
diff --git a/tests/ui/issues/issue-22789.rs b/tests/ui/unboxed-closures/unboxed-closure-call-22789.rs
index 95ebe6baaa3..0bc8bed0588 100644
--- a/tests/ui/issues/issue-22789.rs
+++ b/tests/ui/unboxed-closures/unboxed-closure-call-22789.rs
@@ -6,3 +6,5 @@ fn main() {
     let k = |x: i32| { x + 1 };
     Fn::call(&k, (0,));
 }
+
+// https://github.com/rust-lang/rust/issues/22789
diff --git a/tests/ui/uninhabited/uninhabited-transparent-return-abi.rs b/tests/ui/uninhabited/uninhabited-transparent-return-abi.rs
index 2c2788a3e56..e439a82be5a 100644
--- a/tests/ui/uninhabited/uninhabited-transparent-return-abi.rs
+++ b/tests/ui/uninhabited/uninhabited-transparent-return-abi.rs
@@ -1,5 +1,6 @@
 //@ run-pass
 //@ needs-unwind
+//@ ignore-backends: gcc
 // See https://github.com/rust-lang/rust/issues/135802
 
 enum Void {}
diff --git a/tests/ui/union/union-borrow-move-parent-sibling.stderr b/tests/ui/union/union-borrow-move-parent-sibling.stderr
index f8e9609cb1c..461ee407e2d 100644
--- a/tests/ui/union/union-borrow-move-parent-sibling.stderr
+++ b/tests/ui/union/union-borrow-move-parent-sibling.stderr
@@ -31,6 +31,15 @@ LL |     let a = u.x;
    |             --- value moved here
 LL |     let b = u.y;
    |             ^^^ value used here after move
+   |
+note: if `U` implemented `Clone`, you could clone the value
+  --> $DIR/union-borrow-move-parent-sibling.rs:43:1
+   |
+LL | union U {
+   | ^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     let a = u.x;
+   |             --- you could clone this value
 
 error[E0502]: cannot borrow `u` (via `u.y`) as immutable because it is also borrowed as mutable (via `u.x`)
   --> $DIR/union-borrow-move-parent-sibling.rs:67:13
@@ -73,6 +82,15 @@ LL |     let a = u.x;
    |             --- value moved here
 LL |     let b = u.y;
    |             ^^^ value used here after move
+   |
+note: if `U` implemented `Clone`, you could clone the value
+  --> $DIR/union-borrow-move-parent-sibling.rs:43:1
+   |
+LL | union U {
+   | ^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     let a = u.x;
+   |             --- you could clone this value
 
 error[E0502]: cannot borrow `u` (via `u.x`) as immutable because it is also borrowed as mutable (via `u.y`)
   --> $DIR/union-borrow-move-parent-sibling.rs:81:13
diff --git a/tests/ui/issues/issue-7246.rs b/tests/ui/unreachable-code/unreachable-bool-read-7246.rs
index 7b16fa024f8..8bbaa102549 100644
--- a/tests/ui/issues/issue-7246.rs
+++ b/tests/ui/unreachable-code/unreachable-bool-read-7246.rs
@@ -9,3 +9,5 @@ pub unsafe fn g() {
 }
 
 pub fn main() {}
+
+// https://github.com/rust-lang/rust/issues/7246
diff --git a/tests/ui/issues/issue-7246.stderr b/tests/ui/unreachable-code/unreachable-bool-read-7246.stderr
index 1fb6ab14e64..6072160cb5f 100644
--- a/tests/ui/issues/issue-7246.stderr
+++ b/tests/ui/unreachable-code/unreachable-bool-read-7246.stderr
@@ -1,5 +1,5 @@
 error: unreachable statement
-  --> $DIR/issue-7246.rs:7:5
+  --> $DIR/unreachable-bool-read-7246.rs:7:5
    |
 LL |     return;
    |     ------ any code following this expression is unreachable
@@ -7,13 +7,13 @@ LL |     if *ptr::null() {};
    |     ^^^^^^^^^^^^^^^^^^^ unreachable statement
    |
 note: the lint level is defined here
-  --> $DIR/issue-7246.rs:1:9
+  --> $DIR/unreachable-bool-read-7246.rs:1:9
    |
 LL | #![deny(unreachable_code)]
    |         ^^^^^^^^^^^^^^^^
 
 warning: dereferencing a null pointer
-  --> $DIR/issue-7246.rs:7:8
+  --> $DIR/unreachable-bool-read-7246.rs:7:8
    |
 LL |     if *ptr::null() {};
    |        ^^^^^^^^^^^^ this code causes undefined behavior when executed
diff --git a/tests/ui/unsafe-binders/moves.stderr b/tests/ui/unsafe-binders/moves.stderr
index 0f976d9e845..bd480157077 100644
--- a/tests/ui/unsafe-binders/moves.stderr
+++ b/tests/ui/unsafe-binders/moves.stderr
@@ -16,6 +16,15 @@ LL |         let binder: unsafe<> NotCopy = wrap_binder!(base);
    |                                                     ---- value moved here
 LL |         drop(base);
    |              ^^^^ value used here after move
+   |
+note: if `NotCopyInner` implemented `Clone`, you could clone the value
+  --> $DIR/moves.rs:8:1
+   |
+LL | struct NotCopyInner;
+   | ^^^^^^^^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |         let binder: unsafe<> NotCopy = wrap_binder!(base);
+   |                                                     ---- you could clone this value
 
 error[E0382]: use of moved value: `binder`
   --> $DIR/moves.rs:24:14
diff --git a/tests/ui/issues/issue-41229-ref-str.rs b/tests/ui/unsized/unsized-function-argument-41229.rs
index fe5e6cd6ec5..9210431dc2f 100644
--- a/tests/ui/issues/issue-41229-ref-str.rs
+++ b/tests/ui/unsized/unsized-function-argument-41229.rs
@@ -2,3 +2,5 @@ pub fn example(ref s: str) {}
 //~^ ERROR the size for values of type
 
 fn main() {}
+
+// https://github.com/rust-lang/rust/issues/41229
diff --git a/tests/ui/issues/issue-41229-ref-str.stderr b/tests/ui/unsized/unsized-function-argument-41229.stderr
index d4ef2a77725..326e5681f70 100644
--- a/tests/ui/issues/issue-41229-ref-str.stderr
+++ b/tests/ui/unsized/unsized-function-argument-41229.stderr
@@ -1,5 +1,5 @@
 error[E0277]: the size for values of type `str` cannot be known at compilation time
-  --> $DIR/issue-41229-ref-str.rs:1:23
+  --> $DIR/unsized-function-argument-41229.rs:1:23
    |
 LL | pub fn example(ref s: str) {}
    |                       ^^^ doesn't have a size known at compile-time
diff --git a/tests/ui/use/use-after-move-implicity-coerced-object.stderr b/tests/ui/use/use-after-move-implicity-coerced-object.stderr
index 35ede21717e..defaeef361b 100644
--- a/tests/ui/use/use-after-move-implicity-coerced-object.stderr
+++ b/tests/ui/use/use-after-move-implicity-coerced-object.stderr
@@ -17,6 +17,14 @@ LL |     fn push(&mut self, n: Box<dyn ToString + 'static>) {
    |        ----               ^^^^^^^^^^^^^^^^^^^^^^^^^^^ this parameter takes ownership of the value
    |        |
    |        in this method
+note: if `Number` implemented `Clone`, you could clone the value
+  --> $DIR/use-after-move-implicity-coerced-object.rs:3:1
+   |
+LL | struct Number {
+   | ^^^^^^^^^^^^^ consider implementing `Clone` for this type
+...
+LL |     l.push(n);
+   |            - you could clone this value
 
 error: aborting due to 1 previous error