// it's a actual definition. According to the comments (e.g. in
// librustc_typeck/check/compare_method.rs:compare_predicate_entailment) the latter
// is relied upon by some other code. This might (or might not) need cleanup.
- let body_owner_def_id = match self.tcx.hir().opt_local_def_id(cause.body_id) {
- Some(def_id) => def_id,
- None => self.tcx.hir().body_owner_def_id(hir::BodyId{hir_id: cause.body_id}),
- };
+ let body_owner_def_id = self.tcx.hir().opt_local_def_id(cause.body_id)
+ .unwrap_or_else(|| {
+ self.tcx.hir().body_owner_def_id(hir::BodyId { hir_id: cause.body_id })
+ });
self.check_and_note_conflicting_crates(diag, terr, span);
self.tcx.note_and_explain_type_err(diag, terr, span, body_owner_def_id);
},
(ty::Param(expected), ty::Param(found)) => {
let generics = self.generics_of(body_owner_def_id);
- db.span_label(
- self.def_span(generics.type_param(expected, self).def_id),
- "expected type parameter"
- );
- db.span_label(
- self.def_span(generics.type_param(found, self).def_id),
- "found type parameter"
- );
+ let e_span = self.def_span(generics.type_param(expected, self).def_id);
+ if !sp.contains(e_span) {
+ db.span_label(e_span, "expected type parameter");
+ }
+ let f_span = self.def_span(generics.type_param(found, self).def_id);
+ if !sp.contains(f_span) {
+ db.span_label(f_span, "found type parameter");
+ }
db.note("a type parameter was expected, but a different one was found; \
you might be missing a type parameter or trait bound");
db.note("for more information, visit \
}
(ty::Param(p), _) | (_, ty::Param(p)) => {
let generics = self.generics_of(body_owner_def_id);
- db.span_label(
- self.def_span(generics.type_param(p, self).def_id),
- "this type parameter"
- );
+ let p_span = self.def_span(generics.type_param(p, self).def_id);
+ if !sp.contains(p_span) {
+ db.span_label(p_span, "this type parameter");
+ }
db.help("type parameters must be constrained to match other types");
if self.sess.teach(&db.get_code().unwrap()) {
db.help("given a type parameter `T` and a method `foo`:
| -- type in trait
...
LL | fn foo<B: Debug>(&self, a: &impl Debug, b: &B) { }
- | - ^----------
- | | ||
- | | |found type parameter
- | | expected type parameter `B`, found type parameter `impl Debug`
+ | - ^^^^^^^^^^^ expected type parameter `B`, found type parameter `impl Debug`
+ | |
| expected type parameter
|
= note: expected type `fn(&(), &B, &impl Debug)`