about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2019-10-27 13:42:20 -0700
committerEsteban Küber <esteban@kuber.com.ar>2019-11-16 13:23:19 -0800
commit7a2f3ee73f6286744ff7b36324ddb9fb5dca62ac (patch)
tree69bdac588f859afdff37a85c4fcb25e89459be86
parent0f7f2346a688466624d10bfa8310b8d6aedd0ede (diff)
downloadrust-7a2f3ee73f6286744ff7b36324ddb9fb5dca62ac.tar.gz
rust-7a2f3ee73f6286744ff7b36324ddb9fb5dca62ac.zip
Account for `rustc_on_unimplemented`
-rw-r--r--src/librustc/traits/error_reporting.rs20
-rw-r--r--src/test/ui/kindck/kindck-inherited-copy-bound.object_safe_for_dispatch.stderr2
-rw-r--r--src/test/ui/suggestions/issue-62843.stderr3
-rw-r--r--src/test/ui/traits/traits-negative-impls.rs4
-rw-r--r--src/test/ui/traits/traits-negative-impls.stderr6
5 files changed, 21 insertions, 14 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index ffd4560d32d..1321d5348a2 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -776,6 +776,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();
@@ -1318,6 +1319,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> {
         err: &mut DiagnosticBuilder<'tcx>,
         trait_ref: &ty::Binder<ty::TraitRef<'tcx>>,
         points_at_arg: bool,
+        has_custom_message: bool,
     ) -> bool {
         if !points_at_arg {
             return false;
@@ -1346,14 +1348,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 7c67c5f9e95..f272f829ba6 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<T:Foo>(foo: &T) { }
diff --git a/src/test/ui/suggestions/issue-62843.stderr b/src/test/ui/suggestions/issue-62843.stderr
index 1e0ae9bd062..3b7f85c5668 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 8ed39986781..fb9a3a99748 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 f68cc6a3704..599bbfe2225 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: 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<dummy2::TestType>`
    = note: required because it appears within the type `std::boxed::Box<dummy2::TestType>`
 
@@ -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<Outer2<dummy3::TestType>>`
    = note: required because it appears within the type `std::boxed::Box<Outer2<dummy3::TestType>>`
 
-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: 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<main::TestType>`
 
 error: aborting due to 7 previous errors