diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs index 403a436c1ac9b..970b61047137d 100644 --- a/src/librustc/traits/error_reporting.rs +++ b/src/librustc/traits/error_reporting.rs @@ -774,6 +774,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { &mut err, &trait_ref, points_at_arg, + have_alt_message, ) { self.note_obligation_cause(&mut err, obligation); err.emit(); @@ -1316,6 +1317,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { err: &mut DiagnosticBuilder<'tcx>, trait_ref: &ty::Binder>, points_at_arg: bool, + has_custom_message: bool, ) -> bool { if !points_at_arg { return false; @@ -1344,14 +1346,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { // original type obligation, not the last one that failed, which is arbitrary. // Because of this, we modify the error to refer to the original obligation and // return early in the caller. - err.message = vec![( - format!( - "the trait bound `{}: {}` is not satisfied", - found, - obligation.parent_trait_ref.skip_binder(), - ), - Style::NoStyle, - )]; + let msg = format!( + "the trait bound `{}: {}` is not satisfied", + found, + obligation.parent_trait_ref.skip_binder(), + ); + if has_custom_message { + err.note(&msg); + } else { + err.message = vec![(msg, Style::NoStyle)]; + } if snippet.starts_with('&') { // This is already a literal borrow and the obligation is failing // somewhere else in the obligation chain. Do not suggest non-sense. diff --git a/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr b/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr index 7c67c5f9e9596..f272f829ba600 100644 --- a/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr +++ b/src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr @@ -1,4 +1,4 @@ -error[E0277]: the trait bound `std::boxed::Box<{integer}>: std::marker::Copy` is not satisfied +error[E0277]: the trait bound `std::boxed::Box<{integer}>: Foo` is not satisfied --> $DIR/kindck-inherited-copy-bound.rs:21:16 | LL | fn take_param(foo: &T) { } diff --git a/src/test/ui/suggestions/issue-62843.stderr b/src/test/ui/suggestions/issue-62843.stderr index 1e0ae9bd06228..3b7f85c56689e 100644 --- a/src/test/ui/suggestions/issue-62843.stderr +++ b/src/test/ui/suggestions/issue-62843.stderr @@ -1,4 +1,4 @@ -error[E0277]: the trait bound `std::string::String: std::str::pattern::Pattern<'_>` is not satisfied +error[E0277]: expected a `std::ops::FnMut<(char,)>` closure, found `std::string::String` --> $DIR/issue-62843.rs:4:32 | LL | println!("{:?}", line.find(pattern)); @@ -7,6 +7,7 @@ LL | println!("{:?}", line.find(pattern)); | expected an implementor of trait `std::str::pattern::Pattern<'_>` | help: consider borrowing here: `&pattern` | + = note: the trait bound `std::string::String: std::str::pattern::Pattern<'_>` is not satisfied = note: required because of the requirements on the impl of `std::str::pattern::Pattern<'_>` for `std::string::String` error: aborting due to previous error diff --git a/src/test/ui/traits/traits-negative-impls.rs b/src/test/ui/traits/traits-negative-impls.rs index 8ed39986781cd..fb9a3a99748d0 100644 --- a/src/test/ui/traits/traits-negative-impls.rs +++ b/src/test/ui/traits/traits-negative-impls.rs @@ -46,7 +46,7 @@ fn dummy2() { impl !Send for TestType {} is_send(Box::new(TestType)); - //~^ ERROR the trait bound `dummy2::TestType: std::marker::Send` is not satisfied + //~^ ERROR `dummy2::TestType` cannot be sent between threads safely } fn dummy3() { @@ -64,5 +64,5 @@ fn main() { // This will complain about a missing Send impl because `Sync` is implement *just* // for T that are `Send`. Look at #20366 and #19950 is_sync(Outer2(TestType)); - //~^ ERROR the trait bound `main::TestType: std::marker::Sync` is not satisfied + //~^ ERROR `main::TestType` cannot be sent between threads safely } diff --git a/src/test/ui/traits/traits-negative-impls.stderr b/src/test/ui/traits/traits-negative-impls.stderr index f68cc6a370496..599bbfe222546 100644 --- a/src/test/ui/traits/traits-negative-impls.stderr +++ b/src/test/ui/traits/traits-negative-impls.stderr @@ -43,7 +43,7 @@ LL | is_send((8, TestType)); = help: within `({integer}, dummy1c::TestType)`, the trait `std::marker::Send` is not implemented for `dummy1c::TestType` = note: required because it appears within the type `({integer}, dummy1c::TestType)` -error[E0277]: the trait bound `dummy2::TestType: std::marker::Send` is not satisfied +error[E0277]: `dummy2::TestType` cannot be sent between threads safely --> $DIR/traits-negative-impls.rs:48:13 | LL | fn is_send(_: T) {} @@ -55,6 +55,7 @@ LL | is_send(Box::new(TestType)); | expected an implementor of trait `std::marker::Send` | help: consider borrowing here: `&Box::new(TestType)` | + = note: the trait bound `dummy2::TestType: std::marker::Send` is not satisfied = note: required because of the requirements on the impl of `std::marker::Send` for `std::ptr::Unique` = note: required because it appears within the type `std::boxed::Box` @@ -72,7 +73,7 @@ LL | is_send(Box::new(Outer2(TestType))); = note: required because of the requirements on the impl of `std::marker::Send` for `std::ptr::Unique>` = note: required because it appears within the type `std::boxed::Box>` -error[E0277]: the trait bound `main::TestType: std::marker::Sync` is not satisfied +error[E0277]: `main::TestType` cannot be sent between threads safely --> $DIR/traits-negative-impls.rs:66:13 | LL | fn is_sync(_: T) {} @@ -84,6 +85,7 @@ LL | is_sync(Outer2(TestType)); | expected an implementor of trait `std::marker::Sync` | help: consider borrowing here: `&Outer2(TestType)` | + = note: the trait bound `main::TestType: std::marker::Sync` is not satisfied = note: required because of the requirements on the impl of `std::marker::Sync` for `Outer2` error: aborting due to 7 previous errors