1
Fork 0

Elaborate unmet obligations in E0599 for more context

This commit is contained in:
Esteban Küber 2023-01-12 19:53:01 +00:00
parent 0b90256ada
commit f6e6d2a035
4 changed files with 53 additions and 12 deletions

View file

@ -1587,14 +1587,32 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> {
let o = self.resolve_vars_if_possible(o); let o = self.resolve_vars_if_possible(o);
if !self.predicate_may_hold(&o) { if !self.predicate_may_hold(&o) {
result = ProbeResult::NoMatch; result = ProbeResult::NoMatch;
let parent_o = o.clone();
let implied_obligations =
traits::elaborate_obligations(self.tcx, vec![o]);
for o in implied_obligations {
let parent = if o == parent_o {
None
} else {
if o.predicate.to_opt_poly_trait_pred().map(|p| p.def_id())
== self.tcx.lang_items().sized_trait()
{
// We don't care to talk about implicit `Sized` bounds.
continue;
}
Some(parent_o.predicate)
};
if !self.predicate_may_hold(&o) {
possibly_unsatisfied_predicates.push(( possibly_unsatisfied_predicates.push((
o.predicate, o.predicate,
None, parent,
Some(o.cause), Some(o.cause),
)); ));
} }
} }
} }
}
}
ObjectCandidate | WhereClauseCandidate(..) => { ObjectCandidate | WhereClauseCandidate(..) => {
// These have no additional conditions to check. // These have no additional conditions to check.

View file

@ -6,12 +6,15 @@ LL | struct Value(u32);
| | | |
| doesn't satisfy `Value: Eq` | doesn't satisfy `Value: Eq`
| doesn't satisfy `Value: Hash` | doesn't satisfy `Value: Hash`
| doesn't satisfy `Value: PartialEq`
... ...
LL | hs.insert(Value(0)); LL | hs.insert(Value(0));
| ^^^^^^ | ^^^^^^
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`Value: Eq` `Value: Eq`
`Value: PartialEq`
which is required by `Value: Eq`
`Value: Hash` `Value: Hash`
help: consider annotating `Value` with `#[derive(Eq, Hash, PartialEq)]` help: consider annotating `Value` with `#[derive(Eq, Hash, PartialEq)]`
| |
@ -22,7 +25,10 @@ error[E0599]: the method `use_eq` exists for struct `Object<NoDerives>`, but its
--> $DIR/issue-91550.rs:26:9 --> $DIR/issue-91550.rs:26:9
| |
LL | pub struct NoDerives; LL | pub struct NoDerives;
| -------------------- doesn't satisfy `NoDerives: Eq` | --------------------
| |
| doesn't satisfy `NoDerives: Eq`
| doesn't satisfy `NoDerives: PartialEq`
LL | LL |
LL | struct Object<T>(T); LL | struct Object<T>(T);
| ---------------- method `use_eq` not found for this struct | ---------------- method `use_eq` not found for this struct
@ -30,7 +36,9 @@ LL | struct Object<T>(T);
LL | foo.use_eq(); LL | foo.use_eq();
| ^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds | ^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
| |
note: trait bound `NoDerives: Eq` was not satisfied note: the following trait bounds were not satisfied:
`NoDerives: Eq`
`NoDerives: PartialEq`
--> $DIR/issue-91550.rs:15:9 --> $DIR/issue-91550.rs:15:9
| |
LL | impl<T: Eq> Object<T> { LL | impl<T: Eq> Object<T> {
@ -46,7 +54,12 @@ error[E0599]: the method `use_ord` exists for struct `Object<NoDerives>`, but it
--> $DIR/issue-91550.rs:27:9 --> $DIR/issue-91550.rs:27:9
| |
LL | pub struct NoDerives; LL | pub struct NoDerives;
| -------------------- doesn't satisfy `NoDerives: Ord` | --------------------
| |
| doesn't satisfy `NoDerives: Eq`
| doesn't satisfy `NoDerives: Ord`
| doesn't satisfy `NoDerives: PartialEq`
| doesn't satisfy `NoDerives: PartialOrd`
LL | LL |
LL | struct Object<T>(T); LL | struct Object<T>(T);
| ---------------- method `use_ord` not found for this struct | ---------------- method `use_ord` not found for this struct
@ -54,7 +67,11 @@ LL | struct Object<T>(T);
LL | foo.use_ord(); LL | foo.use_ord();
| ^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds | ^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
| |
note: trait bound `NoDerives: Ord` was not satisfied note: the following trait bounds were not satisfied:
`NoDerives: Eq`
`NoDerives: Ord`
`NoDerives: PartialEq`
`NoDerives: PartialOrd`
--> $DIR/issue-91550.rs:18:9 --> $DIR/issue-91550.rs:18:9
| |
LL | impl<T: Ord> Object<T> { LL | impl<T: Ord> Object<T> {
@ -72,7 +89,9 @@ error[E0599]: the method `use_ord_and_partial_ord` exists for struct `Object<NoD
LL | pub struct NoDerives; LL | pub struct NoDerives;
| -------------------- | --------------------
| | | |
| doesn't satisfy `NoDerives: Eq`
| doesn't satisfy `NoDerives: Ord` | doesn't satisfy `NoDerives: Ord`
| doesn't satisfy `NoDerives: PartialEq`
| doesn't satisfy `NoDerives: PartialOrd` | doesn't satisfy `NoDerives: PartialOrd`
LL | LL |
LL | struct Object<T>(T); LL | struct Object<T>(T);
@ -82,7 +101,9 @@ LL | foo.use_ord_and_partial_ord();
| ^^^^^^^^^^^^^^^^^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds | ^^^^^^^^^^^^^^^^^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
| |
note: the following trait bounds were not satisfied: note: the following trait bounds were not satisfied:
`NoDerives: Eq`
`NoDerives: Ord` `NoDerives: Ord`
`NoDerives: PartialEq`
`NoDerives: PartialOrd` `NoDerives: PartialOrd`
--> $DIR/issue-91550.rs:21:9 --> $DIR/issue-91550.rs:21:9
| |

View file

@ -3,7 +3,7 @@
use std::collections::HashSet; use std::collections::HashSet;
use std::hash::Hash; use std::hash::Hash;
fn is_subset<T>(this: &HashSet<T>, other: &HashSet<T>) -> bool where T: Eq, T: Hash { fn is_subset<T>(this: &HashSet<T>, other: &HashSet<T>) -> bool where T: Eq, T: Hash, T: PartialEq {
this.is_subset(other) this.is_subset(other)
//~^ ERROR the method //~^ ERROR the method
} }

View file

@ -6,11 +6,13 @@ LL | this.is_subset(other)
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`T: Eq` `T: Eq`
`T: PartialEq`
which is required by `T: Eq`
`T: Hash` `T: Hash`
help: consider restricting the type parameters to satisfy the trait bounds help: consider restricting the type parameters to satisfy the trait bounds
| |
LL | fn is_subset<T>(this: &HashSet<T>, other: &HashSet<T>) -> bool where T: Eq, T: Hash { LL | fn is_subset<T>(this: &HashSet<T>, other: &HashSet<T>) -> bool where T: Eq, T: Hash, T: PartialEq {
| ++++++++++++++++++++ | ++++++++++++++++++++++++++++++++++
error: aborting due to previous error error: aborting due to previous error