Use root obligation on E0277 for some cases
When encountering trait bound errors that satisfy some heuristics that
tell us that the relevant trait for the user comes from the root
obligation and not the current obligation, we use the root predicate for
the main message.
This allows to talk about "X doesn't implement Pattern<'_>" over the
most specific case that just happened to fail, like "char doesn't
implement Fn(&mut char)" in
`tests/ui/traits/suggest-dereferences/root-obligation.rs`
The heuristics are:
- the type of the leaf predicate is (roughly) the same as the type
from the root predicate, as a proxy for "we care about the root"
- the leaf trait and the root trait are different, so as to avoid
talking about `&mut T: Trait` and instead remain talking about
`T: Trait` instead
- the root trait is not `Unsize`, as to avoid talking about it in
`tests/ui/coercion/coerce-issue-49593-box-never.rs`.
```
error[E0277]: the trait bound `&char: Pattern<'_>` is not satisfied
--> $DIR/root-obligation.rs:6:38
|
LL | .filter(|c| "aeiou".contains(c))
| -------- ^ the trait `Fn<(char,)>` is not implemented for `&char`, which is required by `&char: Pattern<'_>`
| |
| required by a bound introduced by this call
|
= note: required for `&char` to implement `FnOnce<(char,)>`
= note: required for `&char` to implement `Pattern<'_>`
note: required by a bound in `core::str::<impl str>::contains`
--> $SRC_DIR/core/src/str/mod.rs:LL:COL
help: consider dereferencing here
|
LL | .filter(|c| "aeiou".contains(*c))
| +
```
Fix #79359, fix #119983, fix #118779, cc #118415 (the suggestion needs
to change).
2024-02-29 00:35:59 +00:00
|
|
|
error[E0277]: `&'a (dyn Dummy + 'a)` cannot be sent between threads safely
|
2022-08-16 06:27:22 +00:00
|
|
|
--> $DIR/kindck-send-object1.rs:10:19
|
2019-01-27 11:03:21 +00:00
|
|
|
|
|
2019-05-28 18:46:13 +00:00
|
|
|
LL | assert_send::<&'a dyn Dummy>();
|
Use root obligation on E0277 for some cases
When encountering trait bound errors that satisfy some heuristics that
tell us that the relevant trait for the user comes from the root
obligation and not the current obligation, we use the root predicate for
the main message.
This allows to talk about "X doesn't implement Pattern<'_>" over the
most specific case that just happened to fail, like "char doesn't
implement Fn(&mut char)" in
`tests/ui/traits/suggest-dereferences/root-obligation.rs`
The heuristics are:
- the type of the leaf predicate is (roughly) the same as the type
from the root predicate, as a proxy for "we care about the root"
- the leaf trait and the root trait are different, so as to avoid
talking about `&mut T: Trait` and instead remain talking about
`T: Trait` instead
- the root trait is not `Unsize`, as to avoid talking about it in
`tests/ui/coercion/coerce-issue-49593-box-never.rs`.
```
error[E0277]: the trait bound `&char: Pattern<'_>` is not satisfied
--> $DIR/root-obligation.rs:6:38
|
LL | .filter(|c| "aeiou".contains(c))
| -------- ^ the trait `Fn<(char,)>` is not implemented for `&char`, which is required by `&char: Pattern<'_>`
| |
| required by a bound introduced by this call
|
= note: required for `&char` to implement `FnOnce<(char,)>`
= note: required for `&char` to implement `Pattern<'_>`
note: required by a bound in `core::str::<impl str>::contains`
--> $SRC_DIR/core/src/str/mod.rs:LL:COL
help: consider dereferencing here
|
LL | .filter(|c| "aeiou".contains(*c))
| +
```
Fix #79359, fix #119983, fix #118779, cc #118415 (the suggestion needs
to change).
2024-02-29 00:35:59 +00:00
|
|
|
| ^^^^^^^^^^^^^ `&'a (dyn Dummy + 'a)` cannot be sent between threads safely
|
2019-01-27 11:03:21 +00:00
|
|
|
|
|
Use root obligation on E0277 for some cases
When encountering trait bound errors that satisfy some heuristics that
tell us that the relevant trait for the user comes from the root
obligation and not the current obligation, we use the root predicate for
the main message.
This allows to talk about "X doesn't implement Pattern<'_>" over the
most specific case that just happened to fail, like "char doesn't
implement Fn(&mut char)" in
`tests/ui/traits/suggest-dereferences/root-obligation.rs`
The heuristics are:
- the type of the leaf predicate is (roughly) the same as the type
from the root predicate, as a proxy for "we care about the root"
- the leaf trait and the root trait are different, so as to avoid
talking about `&mut T: Trait` and instead remain talking about
`T: Trait` instead
- the root trait is not `Unsize`, as to avoid talking about it in
`tests/ui/coercion/coerce-issue-49593-box-never.rs`.
```
error[E0277]: the trait bound `&char: Pattern<'_>` is not satisfied
--> $DIR/root-obligation.rs:6:38
|
LL | .filter(|c| "aeiou".contains(c))
| -------- ^ the trait `Fn<(char,)>` is not implemented for `&char`, which is required by `&char: Pattern<'_>`
| |
| required by a bound introduced by this call
|
= note: required for `&char` to implement `FnOnce<(char,)>`
= note: required for `&char` to implement `Pattern<'_>`
note: required by a bound in `core::str::<impl str>::contains`
--> $SRC_DIR/core/src/str/mod.rs:LL:COL
help: consider dereferencing here
|
LL | .filter(|c| "aeiou".contains(*c))
| +
```
Fix #79359, fix #119983, fix #118779, cc #118415 (the suggestion needs
to change).
2024-02-29 00:35:59 +00:00
|
|
|
= help: the trait `Sync` is not implemented for `&'a (dyn Dummy + 'a)`, which is required by `&'a (dyn Dummy + 'a): Send`
|
2022-08-15 20:31:37 +00:00
|
|
|
= note: required for `&'a (dyn Dummy + 'a)` to implement `Send`
|
2021-07-31 16:26:55 +00:00
|
|
|
note: required by a bound in `assert_send`
|
2022-04-01 17:13:25 +00:00
|
|
|
--> $DIR/kindck-send-object1.rs:5:18
|
2021-07-31 16:26:55 +00:00
|
|
|
|
|
|
|
|
LL | fn assert_send<T:Send+'static>() { }
|
|
|
|
| ^^^^ required by this bound in `assert_send`
|
2019-01-27 11:03:21 +00:00
|
|
|
|
2024-03-07 14:23:52 +00:00
|
|
|
error: lifetime may not live long enough
|
|
|
|
--> $DIR/kindck-send-object1.rs:14:5
|
|
|
|
|
|
|
|
|
LL | fn test52<'a>() {
|
|
|
|
| -- lifetime `'a` defined here
|
|
|
|
LL | assert_send::<&'a (dyn Dummy + Sync)>();
|
|
|
|
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ requires that `'a` must outlive `'static`
|
|
|
|
|
2019-01-27 11:03:21 +00:00
|
|
|
error[E0277]: `(dyn Dummy + 'a)` cannot be sent between threads safely
|
2024-02-01 22:45:00 +00:00
|
|
|
--> $DIR/kindck-send-object1.rs:29:19
|
2019-01-27 11:03:21 +00:00
|
|
|
|
|
2019-05-28 18:46:13 +00:00
|
|
|
LL | assert_send::<Box<dyn Dummy + 'a>>();
|
2022-08-16 06:27:22 +00:00
|
|
|
| ^^^^^^^^^^^^^^^^^^^ `(dyn Dummy + 'a)` cannot be sent between threads safely
|
2019-01-27 11:03:21 +00:00
|
|
|
|
|
2024-01-29 18:31:02 +00:00
|
|
|
= help: the trait `Send` is not implemented for `(dyn Dummy + 'a)`, which is required by `Box<(dyn Dummy + 'a)>: Send`
|
2022-08-15 20:31:37 +00:00
|
|
|
= note: required for `Unique<(dyn Dummy + 'a)>` to implement `Send`
|
2023-11-27 20:25:45 +00:00
|
|
|
note: required because it appears within the type `Box<(dyn Dummy + 'a)>`
|
2023-05-03 16:27:29 +00:00
|
|
|
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
2021-07-31 16:26:55 +00:00
|
|
|
note: required by a bound in `assert_send`
|
2022-04-01 17:13:25 +00:00
|
|
|
--> $DIR/kindck-send-object1.rs:5:18
|
2021-07-31 16:26:55 +00:00
|
|
|
|
|
|
|
|
LL | fn assert_send<T:Send+'static>() { }
|
|
|
|
| ^^^^ required by this bound in `assert_send`
|
2019-01-27 11:03:21 +00:00
|
|
|
|
2024-02-01 22:45:00 +00:00
|
|
|
error: aborting due to 3 previous errors
|
2019-01-27 11:03:21 +00:00
|
|
|
|
|
|
|
For more information about this error, try `rustc --explain E0277`.
|