rust/compiler/rustc_trait_selection/src/traits
Esteban Küber f0c93117ed 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-03-03 18:53:35 +00:00
..
error_reporting Use root obligation on E0277 for some cases 2024-03-03 18:53:35 +00:00
query Auto merge of #119989 - lcnr:sub_relations-bye-bye, r=compiler-errors 2024-02-22 20:45:24 +00:00
select Rollup merge of #121681 - jswrenn:nix-visibility-analysis, r=compiler-errors 2024-02-29 20:50:03 +01:00
specialize track overflowing goals for overfow errors 2024-02-29 10:28:22 +01:00
auto_trait.rs Bump indexmap 2024-02-13 21:03:34 +00:00
coherence.rs track overflowing goals for overfow errors 2024-02-29 10:28:22 +01:00
const_evaluatable.rs Convert bugs back to delayed_bugs. 2024-02-21 10:35:54 +11:00
engine.rs Get rid of some sub_exp and eq_exp 2024-03-01 01:20:49 +00:00
fulfill.rs distinguish recursion limit based overflow for diagnostics 2024-02-29 10:14:02 +01:00
misc.rs Deeply normalize when processing registered region obligations 2024-01-30 00:06:53 +00:00
mod.rs Revert some span_bugs to span_delayed_bug. 2024-02-23 08:35:18 +11:00
normalize.rs overflow errors: change source to a concrete enum 2024-02-22 17:43:57 +01:00
object_safety.rs Use fewer delayed bugs. 2024-02-14 20:30:37 +11:00
outlives_bounds.rs Convert delayed_bugs to bugs. 2024-02-21 10:20:05 +11:00
project.rs compiler: clippy::complexity fixes 2024-02-23 19:56:35 +01:00
structural_match.rs Use fewer delayed bugs. 2024-02-14 20:30:37 +11:00
structural_normalize.rs Move trait into attr so it's greppable 2024-02-16 15:07:37 +00:00
util.rs Rename DiagnosticBuilder as Diag. 2024-02-28 08:55:35 +11:00
vtable.rs Dejargnonize subst 2024-02-12 15:46:35 +09:00
wf.rs split project into multiple files 2024-02-19 09:17:00 +01:00