Account for rustc_on_unimplemented

This commit is contained in:
Esteban Küber 2019-10-27 13:42:20 -07:00
parent 0f7f2346a6
commit 7a2f3ee73f
5 changed files with 21 additions and 14 deletions

View file

@ -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.

View file

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

View file

@ -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

View file

@ -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
}

View file

@ -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