Skip to content

Commit

Permalink
Account for rustc_on_unimplemented
Browse files Browse the repository at this point in the history
  • Loading branch information
estebank committed Nov 9, 2019
1 parent 1ef6d93 commit 024f8b9
Show file tree
Hide file tree
Showing 5 changed files with 21 additions and 14 deletions.
20 changes: 12 additions & 8 deletions src/librustc/traits/error_reporting.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down Expand Up @@ -1316,6 +1317,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;
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
@@ -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) { }
Expand Down
3 changes: 2 additions & 1 deletion src/test/ui/suggestions/issue-62843.stderr
Original file line number Diff line number Diff line change
@@ -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));
Expand All @@ -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
Expand Down
4 changes: 2 additions & 2 deletions src/test/ui/traits/traits-negative-impls.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {
Expand All @@ -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
}
6 changes: 4 additions & 2 deletions src/test/ui/traits/traits-negative-impls.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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) {}
Expand All @@ -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>`

Expand All @@ -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) {}
Expand All @@ -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
Expand Down

0 comments on commit 024f8b9

Please sign in to comment.