From 125e69e862b79a2943a68c7dd03bea224073cdf1 Mon Sep 17 00:00:00 2001 From: Zalathar Date: Mon, 16 Feb 2026 17:05:13 +1100 Subject: [PATCH] Suppress unstable-trait notes under `-Zforce-unstable-if-unmarked` --- .../src/error_reporting/traits/suggestions.rs | 18 ++++++++++-------- .../traits/nightly-only-unstable.force.stderr | 4 ++-- tests/ui/traits/nightly-only-unstable.rs | 4 ++-- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs b/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs index 63fd61cb257b..434c8caae7dc 100644 --- a/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs +++ b/compiler/rustc_trait_selection/src/error_reporting/traits/suggestions.rs @@ -5608,15 +5608,17 @@ pub(super) fn get_explanation_based_on_obligation<'tcx>( None => String::new(), }; if let ty::PredicatePolarity::Positive = trait_predicate.polarity() { + // If the trait in question is unstable, mention that fact in the diagnostic. + // But if we're building with `-Zforce-unstable-if-unmarked` then _any_ trait + // not explicitly marked stable is considered unstable, so the extra text is + // unhelpful noise. See . + let mention_unstable = !tcx.sess.opts.unstable_opts.force_unstable_if_unmarked + && try { tcx.lookup_stability(trait_predicate.def_id())?.level.is_stable() } + == Some(false); + let unstable = if mention_unstable { "nightly-only, unstable " } else { "" }; + format!( - "{pre_message}the {}trait `{}` is not implemented for{desc} `{}`", - if tcx.lookup_stability(trait_predicate.def_id()).map(|s| s.level.is_stable()) - == Some(false) - { - "nightly-only, unstable " - } else { - "" - }, + "{pre_message}the {unstable}trait `{}` is not implemented for{desc} `{}`", trait_predicate.print_modifiers_and_trait_path(), tcx.short_string(trait_predicate.self_ty().skip_binder(), long_ty_path), ) diff --git a/tests/ui/traits/nightly-only-unstable.force.stderr b/tests/ui/traits/nightly-only-unstable.force.stderr index b24e2867a304..c1b5a45dc827 100644 --- a/tests/ui/traits/nightly-only-unstable.force.stderr +++ b/tests/ui/traits/nightly-only-unstable.force.stderr @@ -2,7 +2,7 @@ error[E0277]: the trait bound `(): LocalTrait` is not satisfied --> $DIR/nightly-only-unstable.rs:25:21 | LL | use_local_trait(()); - | --------------- ^^ the nightly-only, unstable trait `LocalTrait` is not implemented for `()` + | --------------- ^^ the trait `LocalTrait` is not implemented for `()` | | | required by a bound introduced by this call | @@ -21,7 +21,7 @@ error[E0277]: the trait bound `(): ForeignTrait` is not satisfied --> $DIR/nightly-only-unstable.rs:31:23 | LL | use_foreign_trait(()); - | ----------------- ^^ the nightly-only, unstable trait `ForeignTrait` is not implemented for `()` + | ----------------- ^^ the trait `ForeignTrait` is not implemented for `()` | | | required by a bound introduced by this call | diff --git a/tests/ui/traits/nightly-only-unstable.rs b/tests/ui/traits/nightly-only-unstable.rs index c3fa5df944b6..94f300074390 100644 --- a/tests/ui/traits/nightly-only-unstable.rs +++ b/tests/ui/traits/nightly-only-unstable.rs @@ -25,12 +25,12 @@ fn main() { use_local_trait(()); //~^ ERROR the trait bound `(): LocalTrait` is not satisfied //[normal]~| NOTE the trait `LocalTrait` is not implemented for `()` - //[force]~| NOTE the nightly-only, unstable trait `LocalTrait` is not implemented for `()` + //[force]~| NOTE the trait `LocalTrait` is not implemented for `()` //~| NOTE required by a bound introduced by this call use_foreign_trait(()); //~^ ERROR the trait bound `(): ForeignTrait` is not satisfied //[normal]~| NOTE the nightly-only, unstable trait `ForeignTrait` is not implemented for `()` - //[force]~| NOTE the nightly-only, unstable trait `ForeignTrait` is not implemented for `()` + //[force]~| NOTE the trait `ForeignTrait` is not implemented for `()` //~| NOTE required by a bound introduced by this call }