mirror of
https://github.com/rust-lang/rust.git
synced 2024-12-12 16:45:37 +00:00
f0c93117ed
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).
34 lines
961 B
Rust
34 lines
961 B
Rust
// Test which object types are considered sendable. This test
|
|
// is broken into two parts because some errors occur in distinct
|
|
// phases in the compiler. See kindck-send-object2.rs as well!
|
|
|
|
fn assert_send<T:Send+'static>() { }
|
|
trait Dummy { }
|
|
|
|
// careful with object types, who knows what they close over...
|
|
fn test51<'a>() {
|
|
assert_send::<&'a dyn Dummy>();
|
|
//~^ ERROR `&'a (dyn Dummy + 'a)` cannot be sent between threads safely [E0277]
|
|
}
|
|
fn test52<'a>() {
|
|
assert_send::<&'a (dyn Dummy + Sync)>();
|
|
//~^ ERROR: lifetime may not live long enough
|
|
}
|
|
|
|
// ...unless they are properly bounded
|
|
fn test60() {
|
|
assert_send::<&'static (dyn Dummy + Sync)>();
|
|
}
|
|
fn test61() {
|
|
assert_send::<Box<dyn Dummy + Send>>();
|
|
}
|
|
|
|
// closure and object types can have lifetime bounds which make
|
|
// them not ok
|
|
fn test_71<'a>() {
|
|
assert_send::<Box<dyn Dummy + 'a>>();
|
|
//~^ ERROR `(dyn Dummy + 'a)` cannot be sent between threads safely
|
|
}
|
|
|
|
fn main() { }
|