Rollup merge of #120400 - estebank:bound-error-cleanup, r=oli-obk

Bound errors span label cleanup

Consolidate span labels for "this type doesn't satisfy a bound" for more compact diagnostic output.
This commit is contained in:
Guillaume Gomez 2024-01-30 11:19:15 +01:00 committed by GitHub
commit f7043a41ce
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 100 additions and 176 deletions

View file

@ -6,6 +6,7 @@ use crate::errors::{
use crate::fluent_generated as fluent; use crate::fluent_generated as fluent;
use crate::traits::error_reporting::report_object_safety_error; use crate::traits::error_reporting::report_object_safety_error;
use rustc_data_structures::fx::{FxHashMap, FxIndexMap, FxIndexSet}; use rustc_data_structures::fx::{FxHashMap, FxIndexMap, FxIndexSet};
use rustc_data_structures::sorted_map::SortedMap;
use rustc_data_structures::unord::UnordMap; use rustc_data_structures::unord::UnordMap;
use rustc_errors::{ use rustc_errors::{
codes::*, pluralize, struct_span_code_err, Applicability, Diagnostic, ErrorGuaranteed, codes::*, pluralize, struct_span_code_err, Applicability, Diagnostic, ErrorGuaranteed,
@ -463,22 +464,23 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
return err.emit(); return err.emit();
} }
let mut bound_spans = Vec::new(); let mut bound_spans: SortedMap<Span, Vec<String>> = Default::default();
let mut bound_span_label = |self_ty: Ty<'_>, obligation: &str, quiet: &str| { let mut bound_span_label = |self_ty: Ty<'_>, obligation: &str, quiet: &str| {
let msg = format!( let msg = format!("`{}`", if obligation.len() > 50 { quiet } else { obligation });
"doesn't satisfy `{}`",
if obligation.len() > 50 { quiet } else { obligation }
);
match &self_ty.kind() { match &self_ty.kind() {
// Point at the type that couldn't satisfy the bound. // Point at the type that couldn't satisfy the bound.
ty::Adt(def, _) => bound_spans.push((tcx.def_span(def.did()), msg)), ty::Adt(def, _) => {
bound_spans.get_mut_or_insert_default(tcx.def_span(def.did())).push(msg)
}
// Point at the trait object that couldn't satisfy the bound. // Point at the trait object that couldn't satisfy the bound.
ty::Dynamic(preds, _, _) => { ty::Dynamic(preds, _, _) => {
for pred in preds.iter() { for pred in preds.iter() {
match pred.skip_binder() { match pred.skip_binder() {
ty::ExistentialPredicate::Trait(tr) => { ty::ExistentialPredicate::Trait(tr) => {
bound_spans.push((tcx.def_span(tr.def_id), msg.clone())) bound_spans
.get_mut_or_insert_default(tcx.def_span(tr.def_id))
.push(msg.clone());
} }
ty::ExistentialPredicate::Projection(_) ty::ExistentialPredicate::Projection(_)
| ty::ExistentialPredicate::AutoTrait(_) => {} | ty::ExistentialPredicate::AutoTrait(_) => {}
@ -487,7 +489,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
} }
// Point at the closure that couldn't satisfy the bound. // Point at the closure that couldn't satisfy the bound.
ty::Closure(def_id, _) => { ty::Closure(def_id, _) => {
bound_spans.push((tcx.def_span(*def_id), format!("doesn't satisfy `{quiet}`"))) bound_spans
.get_mut_or_insert_default(tcx.def_span(*def_id))
.push(format!("`{quiet}`"));
} }
_ => {} _ => {}
} }
@ -556,12 +560,18 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o {
format!("associated type cannot be referenced on `{self_ty}` due to unsatisfied trait bounds") format!("associated type cannot be referenced on `{self_ty}` due to unsatisfied trait bounds")
); );
bound_spans.sort(); for (span, mut bounds) in bound_spans {
bound_spans.dedup();
for (span, msg) in bound_spans {
if !tcx.sess.source_map().is_span_accessible(span) { if !tcx.sess.source_map().is_span_accessible(span) {
continue; continue;
} }
bounds.sort();
bounds.dedup();
let msg = match &bounds[..] {
[bound] => format!("doesn't satisfy {bound}"),
bounds if bounds.len() > 4 => format!("doesn't satisfy {} bounds", bounds.len()),
[bounds @ .., last] => format!("doesn't satisfy {} or {last}", bounds.join(", ")),
[] => unreachable!(),
};
err.span_label(span, msg); err.span_label(span, msg);
} }
add_def_label(&mut err); add_def_label(&mut err);

View file

@ -9,6 +9,7 @@ use crate::FnCtxt;
use rustc_ast::ast::Mutability; use rustc_ast::ast::Mutability;
use rustc_attr::parse_confusables; use rustc_attr::parse_confusables;
use rustc_data_structures::fx::{FxIndexMap, FxIndexSet}; use rustc_data_structures::fx::{FxIndexMap, FxIndexSet};
use rustc_data_structures::sorted_map::SortedMap;
use rustc_data_structures::unord::UnordSet; use rustc_data_structures::unord::UnordSet;
use rustc_errors::{ use rustc_errors::{
codes::*, pluralize, struct_span_code_err, Applicability, Diagnostic, DiagnosticBuilder, codes::*, pluralize, struct_span_code_err, Applicability, Diagnostic, DiagnosticBuilder,
@ -458,22 +459,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
); );
} }
let ty_span = match rcvr_ty.kind() { let mut ty_span = match rcvr_ty.kind() {
ty::Param(param_type) => { ty::Param(param_type) => {
Some(param_type.span_from_generics(self.tcx, self.body_id.to_def_id())) Some(param_type.span_from_generics(self.tcx, self.body_id.to_def_id()))
} }
ty::Adt(def, _) if def.did().is_local() => Some(tcx.def_span(def.did())), ty::Adt(def, _) if def.did().is_local() => Some(tcx.def_span(def.did())),
_ => None, _ => None,
}; };
if let Some(span) = ty_span {
err.span_label(
span,
format!(
"{item_kind} `{item_name}` not found for this {}",
rcvr_ty.prefix_string(self.tcx)
),
);
}
if let SelfSource::MethodCall(rcvr_expr) = source { if let SelfSource::MethodCall(rcvr_expr) = source {
self.suggest_fn_call(&mut err, rcvr_expr, rcvr_ty, |output_ty| { self.suggest_fn_call(&mut err, rcvr_expr, rcvr_ty, |output_ty| {
@ -546,7 +538,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
); );
} }
let mut bound_spans = vec![]; let mut bound_spans: SortedMap<Span, Vec<String>> = Default::default();
let mut restrict_type_params = false; let mut restrict_type_params = false;
let mut unsatisfied_bounds = false; let mut unsatisfied_bounds = false;
if item_name.name == sym::count && self.is_slice_ty(rcvr_ty, span) { if item_name.name == sym::count && self.is_slice_ty(rcvr_ty, span) {
@ -641,19 +633,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
false false
}; };
let mut bound_span_label = |self_ty: Ty<'_>, obligation: &str, quiet: &str| { let mut bound_span_label = |self_ty: Ty<'_>, obligation: &str, quiet: &str| {
let msg = format!( let msg = format!("`{}`", if obligation.len() > 50 { quiet } else { obligation });
"doesn't satisfy `{}`",
if obligation.len() > 50 { quiet } else { obligation }
);
match &self_ty.kind() { match &self_ty.kind() {
// Point at the type that couldn't satisfy the bound. // Point at the type that couldn't satisfy the bound.
ty::Adt(def, _) => bound_spans.push((self.tcx.def_span(def.did()), msg)), ty::Adt(def, _) => {
bound_spans.get_mut_or_insert_default(tcx.def_span(def.did())).push(msg)
}
// Point at the trait object that couldn't satisfy the bound. // Point at the trait object that couldn't satisfy the bound.
ty::Dynamic(preds, _, _) => { ty::Dynamic(preds, _, _) => {
for pred in preds.iter() { for pred in preds.iter() {
match pred.skip_binder() { match pred.skip_binder() {
ty::ExistentialPredicate::Trait(tr) => { ty::ExistentialPredicate::Trait(tr) => {
bound_spans.push((self.tcx.def_span(tr.def_id), msg.clone())) bound_spans
.get_mut_or_insert_default(tcx.def_span(tr.def_id))
.push(msg.clone());
} }
ty::ExistentialPredicate::Projection(_) ty::ExistentialPredicate::Projection(_)
| ty::ExistentialPredicate::AutoTrait(_) => {} | ty::ExistentialPredicate::AutoTrait(_) => {}
@ -661,8 +654,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
} }
} }
// Point at the closure that couldn't satisfy the bound. // Point at the closure that couldn't satisfy the bound.
ty::Closure(def_id, _) => bound_spans ty::Closure(def_id, _) => {
.push((tcx.def_span(*def_id), format!("doesn't satisfy `{quiet}`"))), bound_spans
.get_mut_or_insert_default(tcx.def_span(*def_id))
.push(format!("`{quiet}`"));
}
_ => {} _ => {}
} }
}; };
@ -1169,11 +1165,40 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
self.suggest_unwrapping_inner_self(&mut err, source, rcvr_ty, item_name); self.suggest_unwrapping_inner_self(&mut err, source, rcvr_ty, item_name);
bound_spans.sort(); for (span, mut bounds) in bound_spans {
bound_spans.dedup(); if !tcx.sess.source_map().is_span_accessible(span) {
for (span, msg) in bound_spans.into_iter() { continue;
}
bounds.sort();
bounds.dedup();
let pre = if Some(span) == ty_span {
ty_span.take();
format!(
"{item_kind} `{item_name}` not found for this {} because it ",
rcvr_ty.prefix_string(self.tcx)
)
} else {
String::new()
};
let msg = match &bounds[..] {
[bound] => format!("{pre}doesn't satisfy {bound}"),
bounds if bounds.len() > 4 => format!("doesn't satisfy {} bounds", bounds.len()),
[bounds @ .., last] => {
format!("{pre}doesn't satisfy {} or {last}", bounds.join(", "))
}
[] => unreachable!(),
};
err.span_label(span, msg); err.span_label(span, msg);
} }
if let Some(span) = ty_span {
err.span_label(
span,
format!(
"{item_kind} `{item_name}` not found for this {}",
rcvr_ty.prefix_string(self.tcx)
),
);
}
if rcvr_ty.is_numeric() && rcvr_ty.is_fresh() || restrict_type_params { if rcvr_ty.is_numeric() && rcvr_ty.is_fresh() || restrict_type_params {
} else { } else {

View file

@ -4,10 +4,7 @@ error: the associated type `X` exists for `S<Featureless, Featureless>`, but its
LL | struct S<A, B>(A, B); LL | struct S<A, B>(A, B);
| -------------- associated item `X` not found for this struct | -------------- associated item `X` not found for this struct
LL | struct Featureless; LL | struct Featureless;
| ------------------ | ------------------ doesn't satisfy `Featureless: One` or `Featureless: Two`
| |
| doesn't satisfy `Featureless: One`
| doesn't satisfy `Featureless: Two`
... ...
LL | let _: S::<Featureless, Featureless>::X; LL | let _: S::<Featureless, Featureless>::X;
| ^ associated type cannot be referenced on `S<Featureless, Featureless>` due to unsatisfied trait bounds | ^ associated type cannot be referenced on `S<Featureless, Featureless>` due to unsatisfied trait bounds

View file

@ -1,18 +1,11 @@
error[E0599]: the method `clone` exists for struct `Box<dyn Foo>`, but its trait bounds were not satisfied error[E0599]: the method `clone` exists for struct `Box<dyn Foo>`, but its trait bounds were not satisfied
--> $DIR/unique-object-noncopyable.rs:24:16 --> $DIR/unique-object-noncopyable.rs:24:16
| |
LL | trait Foo { LL | trait Foo {
| --------- | --------- doesn't satisfy `dyn Foo: Clone` or `dyn Foo: Sized`
| |
| doesn't satisfy `dyn Foo: Clone`
| doesn't satisfy `dyn Foo: Sized`
... ...
LL | let _z = y.clone(); LL | let _z = y.clone();
| ^^^^^ method cannot be called on `Box<dyn Foo>` due to unsatisfied trait bounds | ^^^^^ method cannot be called on `Box<dyn Foo>` due to unsatisfied trait bounds
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
::: $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
= note: doesn't satisfy `Box<dyn Foo>: Clone`
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`dyn Foo: Sized` `dyn Foo: Sized`

View file

@ -1,15 +1,11 @@
error[E0599]: the method `clone` exists for struct `Box<R>`, but its trait bounds were not satisfied error[E0599]: the method `clone` exists for struct `Box<R>`, but its trait bounds were not satisfied
--> $DIR/unique-pinned-nocopy.rs:12:16 --> $DIR/unique-pinned-nocopy.rs:12:16
| |
LL | struct R { LL | struct R {
| -------- doesn't satisfy `R: Clone` | -------- doesn't satisfy `R: Clone`
... ...
LL | let _j = i.clone(); LL | let _j = i.clone();
| ^^^^^ method cannot be called on `Box<R>` due to unsatisfied trait bounds | ^^^^^ method cannot be called on `Box<R>` due to unsatisfied trait bounds
--> $SRC_DIR/alloc/src/boxed.rs:LL:COL
::: $SRC_DIR/alloc/src/boxed.rs:LL:COL
|
= note: doesn't satisfy `Box<R>: Clone`
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`R: Clone` `R: Clone`

View file

@ -2,10 +2,7 @@ error[E0599]: the method `clone` exists for struct `Bar<NotClone>`, but its trai
--> $DIR/derive-assoc-type-not-impl.rs:18:30 --> $DIR/derive-assoc-type-not-impl.rs:18:30
| |
LL | struct Bar<T: Foo> { LL | struct Bar<T: Foo> {
| ------------------ | ------------------ method `clone` not found for this struct because it doesn't satisfy `Bar<NotClone>: Clone`
| |
| method `clone` not found for this struct
| doesn't satisfy `Bar<NotClone>: Clone`
... ...
LL | struct NotClone; LL | struct NotClone;
| --------------- doesn't satisfy `NotClone: Clone` | --------------- doesn't satisfy `NotClone: Clone`

View file

@ -2,16 +2,10 @@ error[E0599]: the method `clone` exists for struct `Foo<NonCopy>`, but its trait
--> $DIR/deriving-with-repr-packed-2.rs:18:11 --> $DIR/deriving-with-repr-packed-2.rs:18:11
| |
LL | pub struct Foo<T>(T, T, T); LL | pub struct Foo<T>(T, T, T);
| ----------------- | ----------------- method `clone` not found for this struct because it doesn't satisfy `Foo<NonCopy>: Clone`
| |
| method `clone` not found for this struct
| doesn't satisfy `Foo<NonCopy>: Clone`
LL | LL |
LL | struct NonCopy; LL | struct NonCopy;
| -------------- | -------------- doesn't satisfy `NonCopy: Clone` or `NonCopy: Copy`
| |
| doesn't satisfy `NonCopy: Clone`
| doesn't satisfy `NonCopy: Copy`
... ...
LL | _ = x.clone(); LL | _ = x.clone();
| ^^^^^ method cannot be called on `Foo<NonCopy>` due to unsatisfied trait bounds | ^^^^^ method cannot be called on `Foo<NonCopy>` due to unsatisfied trait bounds

View file

@ -2,11 +2,7 @@ error[E0599]: the method `insert` exists for struct `HashSet<Value>`, but its tr
--> $DIR/issue-91550.rs:8:8 --> $DIR/issue-91550.rs:8:8
| |
LL | struct Value(u32); LL | struct Value(u32);
| ------------ | ------------ doesn't satisfy `Value: Eq`, `Value: Hash` or `Value: PartialEq`
| |
| doesn't satisfy `Value: Eq`
| doesn't satisfy `Value: Hash`
| doesn't satisfy `Value: PartialEq`
... ...
LL | hs.insert(Value(0)); LL | hs.insert(Value(0));
| ^^^^^^ | ^^^^^^
@ -26,10 +22,7 @@ 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` or `NoDerives: PartialEq`
| |
| 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
@ -57,12 +50,7 @@ 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: Eq`, `NoDerives: Ord`, `NoDerives: PartialEq` or `NoDerives: PartialOrd`
| |
| 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
@ -94,12 +82,7 @@ error[E0599]: the method `use_ord_and_partial_ord` exists for struct `Object<NoD
--> $DIR/issue-91550.rs:28:9 --> $DIR/issue-91550.rs:28:9
| |
LL | pub struct NoDerives; LL | pub struct NoDerives;
| -------------------- | -------------------- doesn't satisfy `NoDerives: Eq`, `NoDerives: Ord`, `NoDerives: PartialEq` or `NoDerives: PartialOrd`
| |
| 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_and_partial_ord` not found for this struct | ---------------- method `use_ord_and_partial_ord` not found for this struct

View file

@ -19,16 +19,10 @@ error[E0599]: the size for values of type `Node<i32, RcFamily>` cannot be known
--> $DIR/issue-119942-unsatisified-gat-bound-during-assoc-ty-selection.rs:31:35 --> $DIR/issue-119942-unsatisified-gat-bound-during-assoc-ty-selection.rs:31:35
| |
LL | enum Node<T, P: PointerFamily> { LL | enum Node<T, P: PointerFamily> {
| ------------------------------ | ------------------------------ variant or associated item `new` not found for this enum because it doesn't satisfy `Node<i32, RcFamily>: Sized`
| |
| variant or associated item `new` not found for this enum
| doesn't satisfy `Node<i32, RcFamily>: Sized`
... ...
LL | let mut list = RcNode::<i32>::new(); LL | let mut list = RcNode::<i32>::new();
| ^^^ doesn't have a size known at compile-time | ^^^ doesn't have a size known at compile-time
--> $SRC_DIR/core/src/ops/deref.rs:LL:COL
|
= note: doesn't satisfy `_: Sized`
| |
note: trait bound `Node<i32, RcFamily>: Sized` was not satisfied note: trait bound `Node<i32, RcFamily>: Sized` was not satisfied
--> $DIR/issue-119942-unsatisified-gat-bound-during-assoc-ty-selection.rs:4:18 --> $DIR/issue-119942-unsatisified-gat-bound-during-assoc-ty-selection.rs:4:18

View file

@ -16,9 +16,7 @@ impl<T: X<Y<i32> = i32>> M for T {}
//~| NOTE //~| NOTE
struct S; struct S;
//~^ NOTE method `f` not found for this //~^ NOTE method `f` not found for this struct because it doesn't satisfy `<S as X>::Y<i32> = i32` or `S: M`
//~| NOTE doesn't satisfy `<S as X>::Y<i32> = i32`
//~| NOTE doesn't satisfy `S: M`
impl X for S { impl X for S {
type Y<T> = bool; type Y<T> = bool;

View file

@ -1,12 +1,8 @@
error[E0599]: the method `f` exists for struct `S`, but its trait bounds were not satisfied error[E0599]: the method `f` exists for struct `S`, but its trait bounds were not satisfied
--> $DIR/method-unsatisfied-assoc-type-predicate.rs:28:7 --> $DIR/method-unsatisfied-assoc-type-predicate.rs:26:7
| |
LL | struct S; LL | struct S;
| -------- | -------- method `f` not found for this struct because it doesn't satisfy `<S as X>::Y<i32> = i32` or `S: M`
| |
| method `f` not found for this struct
| doesn't satisfy `<S as X>::Y<i32> = i32`
| doesn't satisfy `S: M`
... ...
LL | a.f(); LL | a.f();
| ^ method cannot be called on `S` due to unsatisfied trait bounds | ^ method cannot be called on `S` due to unsatisfied trait bounds

View file

@ -2,10 +2,7 @@ error[E0599]: the method `filterx` exists for struct `Map<Repeat, {closure@issue
--> $DIR/issue-30786.rs:120:22 --> $DIR/issue-30786.rs:120:22
| |
LL | pub struct Map<S, F> { LL | pub struct Map<S, F> {
| -------------------- | -------------------- method `filterx` not found for this struct because it doesn't satisfy `_: StreamExt`
| |
| method `filterx` not found for this struct
| doesn't satisfy `_: StreamExt`
... ...
LL | let filter = map.filterx(|x: &_| true); LL | let filter = map.filterx(|x: &_| true);
| ^^^^^^^ method cannot be called on `Map<Repeat, {closure@issue-30786.rs:119:27}>` due to unsatisfied trait bounds | ^^^^^^^ method cannot be called on `Map<Repeat, {closure@issue-30786.rs:119:27}>` due to unsatisfied trait bounds
@ -23,10 +20,7 @@ error[E0599]: the method `countx` exists for struct `Filter<Map<Repeat, fn(&u64)
--> $DIR/issue-30786.rs:132:24 --> $DIR/issue-30786.rs:132:24
| |
LL | pub struct Filter<S, F> { LL | pub struct Filter<S, F> {
| ----------------------- | ----------------------- method `countx` not found for this struct because it doesn't satisfy `_: StreamExt`
| |
| method `countx` not found for this struct
| doesn't satisfy `_: StreamExt`
... ...
LL | let count = filter.countx(); LL | let count = filter.countx();
| ^^^^^^ method cannot be called due to unsatisfied trait bounds | ^^^^^^ method cannot be called due to unsatisfied trait bounds

View file

@ -3,9 +3,6 @@ error[E0599]: `Vec<bool>` is not an iterator
| |
LL | vec![true, false].map(|v| !v).collect::<Vec<_>>(); LL | vec![true, false].map(|v| !v).collect::<Vec<_>>();
| ^^^ `Vec<bool>` is not an iterator; try calling `.into_iter()` or `.iter()` | ^^^ `Vec<bool>` is not an iterator; try calling `.into_iter()` or `.iter()`
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
= note: doesn't satisfy `Vec<bool>: Iterator`
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`Vec<bool>: Iterator` `Vec<bool>: Iterator`

View file

@ -49,10 +49,7 @@ error[E0599]: `Foo` is not an iterator
--> $DIR/method-call-err-msg.rs:19:7 --> $DIR/method-call-err-msg.rs:19:7
| |
LL | pub struct Foo; LL | pub struct Foo;
| -------------- | -------------- method `take` not found for this struct because it doesn't satisfy `Foo: Iterator`
| |
| method `take` not found for this struct
| doesn't satisfy `Foo: Iterator`
... ...
LL | / y.zero() LL | / y.zero()
LL | | .take() LL | | .take()

View file

@ -21,11 +21,7 @@ error[E0599]: the method `count` exists for struct `Filter<Fuse<Once<&str>>, {cl
LL | once::<&str>("str").fuse().filter(|a: &str| true).count(); LL | once::<&str>("str").fuse().filter(|a: &str| true).count();
| --------- ^^^^^ method cannot be called due to unsatisfied trait bounds | --------- ^^^^^ method cannot be called due to unsatisfied trait bounds
| | | |
| doesn't satisfy `<_ as FnOnce<(&&str,)>>::Output = bool` | doesn't satisfy `<_ as FnOnce<(&&str,)>>::Output = bool` or `_: FnMut<(&&str,)>`
| doesn't satisfy `_: FnMut<(&&str,)>`
--> $SRC_DIR/core/src/iter/adapters/filter.rs:LL:COL
|
= note: doesn't satisfy `_: Iterator`
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`<{closure@$DIR/issue-36053-2.rs:7:39: 7:48} as FnOnce<(&&str,)>>::Output = bool` `<{closure@$DIR/issue-36053-2.rs:7:39: 7:48} as FnOnce<(&&str,)>>::Output = bool`

View file

@ -12,10 +12,7 @@ error[E0599]: the method `foo_one` exists for struct `MyStruct`, but its trait b
--> $DIR/specialization-trait-not-implemented.rs:22:29 --> $DIR/specialization-trait-not-implemented.rs:22:29
| |
LL | struct MyStruct; LL | struct MyStruct;
| --------------- | --------------- method `foo_one` not found for this struct because it doesn't satisfy `MyStruct: Foo`
| |
| method `foo_one` not found for this struct
| doesn't satisfy `MyStruct: Foo`
... ...
LL | println!("{}", MyStruct.foo_one()); LL | println!("{}", MyStruct.foo_one());
| ^^^^^^^ method cannot be called on `MyStruct` due to unsatisfied trait bounds | ^^^^^^^ method cannot be called on `MyStruct` due to unsatisfied trait bounds

View file

@ -2,10 +2,7 @@ error[E0599]: the method `test` exists for struct `Foo<Enum, CloneEnum>`, but it
--> $DIR/derive-trait-for-method-call.rs:28:15 --> $DIR/derive-trait-for-method-call.rs:28:15
| |
LL | enum Enum { LL | enum Enum {
| --------- | --------- doesn't satisfy `Enum: Clone` or `Enum: Default`
| |
| doesn't satisfy `Enum: Clone`
| doesn't satisfy `Enum: Default`
... ...
LL | enum CloneEnum { LL | enum CloneEnum {
| -------------- doesn't satisfy `CloneEnum: Default` | -------------- doesn't satisfy `CloneEnum: Default`
@ -40,10 +37,7 @@ error[E0599]: the method `test` exists for struct `Foo<Struct, CloneStruct>`, bu
--> $DIR/derive-trait-for-method-call.rs:34:15 --> $DIR/derive-trait-for-method-call.rs:34:15
| |
LL | struct Struct { LL | struct Struct {
| ------------- | ------------- doesn't satisfy `Struct: Clone` or `Struct: Default`
| |
| doesn't satisfy `Struct: Clone`
| doesn't satisfy `Struct: Default`
... ...
LL | struct CloneStruct { LL | struct CloneStruct {
| ------------------ doesn't satisfy `CloneStruct: Default` | ------------------ doesn't satisfy `CloneStruct: Default`
@ -85,12 +79,6 @@ LL | struct Foo<X, Y> (X, Y);
... ...
LL | let y = x.test(); LL | let y = x.test();
| ^^^^ method cannot be called on `Foo<Vec<Enum>, Instant>` due to unsatisfied trait bounds | ^^^^ method cannot be called on `Foo<Vec<Enum>, Instant>` due to unsatisfied trait bounds
--> $SRC_DIR/std/src/time.rs:LL:COL
|
= note: doesn't satisfy `Instant: Default`
--> $SRC_DIR/alloc/src/vec/mod.rs:LL:COL
|
= note: doesn't satisfy `Vec<Enum>: Clone`
| |
note: the following trait bounds were not satisfied: note: the following trait bounds were not satisfied:
`Instant: Default` `Instant: Default`

View file

@ -25,9 +25,6 @@ error[E0599]: the method `write_fmt` exists for struct `BufWriter<&dyn Write>`,
| |
LL | writeln!(fp, "hello world").unwrap(); LL | writeln!(fp, "hello world").unwrap();
| ---------^^---------------- method cannot be called on `BufWriter<&dyn Write>` due to unsatisfied trait bounds | ---------^^---------------- method cannot be called on `BufWriter<&dyn Write>` due to unsatisfied trait bounds
--> $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL
|
= note: doesn't satisfy `BufWriter<&dyn std::io::Write>: std::io::Write`
| |
note: must implement `io::Write`, `fmt::Write`, or have a `write_fmt` method note: must implement `io::Write`, `fmt::Write`, or have a `write_fmt` method
--> $DIR/mut-borrow-needed-by-trait.rs:21:14 --> $DIR/mut-borrow-needed-by-trait.rs:21:14

View file

@ -27,9 +27,6 @@ error[E0599]: the method `read_until` exists for struct `BufReader<&T>`, but its
| |
LL | stream_reader.read_until(b'\n', &mut buffer).expect("Reading into buffer failed"); LL | stream_reader.read_until(b'\n', &mut buffer).expect("Reading into buffer failed");
| ^^^^^^^^^^ method cannot be called on `BufReader<&T>` due to unsatisfied trait bounds | ^^^^^^^^^^ method cannot be called on `BufReader<&T>` due to unsatisfied trait bounds
--> $SRC_DIR/std/src/io/buffered/bufreader.rs:LL:COL
|
= note: doesn't satisfy `BufReader<&T>: BufRead`
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`&T: std::io::Read` `&T: std::io::Read`

View file

@ -2,10 +2,7 @@ error[E0599]: the method `get` exists for struct `Victim<'_, Self>`, but its tra
--> $DIR/impl-derived-implicit-sized-bound-2.rs:28:19 --> $DIR/impl-derived-implicit-sized-bound-2.rs:28:19
| |
LL | struct Victim<'a, T: Perpetrator + ?Sized> { LL | struct Victim<'a, T: Perpetrator + ?Sized> {
| ------------------------------------------ | ------------------------------------------ method `get` not found for this struct because it doesn't satisfy `Victim<'_, Self>: VictimTrait`
| |
| method `get` not found for this struct
| doesn't satisfy `Victim<'_, Self>: VictimTrait`
... ...
LL | self.getter().get(); LL | self.getter().get();
| ^^^ method cannot be called on `Victim<'_, Self>` due to unsatisfied trait bounds | ^^^ method cannot be called on `Victim<'_, Self>` due to unsatisfied trait bounds

View file

@ -2,10 +2,7 @@ error[E0599]: the method `get` exists for struct `Victim<'_, Self>`, but its tra
--> $DIR/impl-derived-implicit-sized-bound.rs:31:19 --> $DIR/impl-derived-implicit-sized-bound.rs:31:19
| |
LL | struct Victim<'a, T: Perpetrator + ?Sized> LL | struct Victim<'a, T: Perpetrator + ?Sized>
| ------------------------------------------ | ------------------------------------------ method `get` not found for this struct because it doesn't satisfy `Victim<'_, Self>: VictimTrait`
| |
| method `get` not found for this struct
| doesn't satisfy `Victim<'_, Self>: VictimTrait`
... ...
LL | self.getter().get(); LL | self.getter().get();
| ^^^ method cannot be called on `Victim<'_, Self>` due to unsatisfied trait bounds | ^^^ method cannot be called on `Victim<'_, Self>` due to unsatisfied trait bounds

View file

@ -2,10 +2,7 @@ error[E0599]: the method `check` exists for struct `Client<()>`, but its trait b
--> $DIR/track-obligations.rs:83:16 --> $DIR/track-obligations.rs:83:16
| |
LL | struct ALayer<C>(C); LL | struct ALayer<C>(C);
| ---------------- | ---------------- doesn't satisfy `<_ as Layer<()>>::Service = <ALayer<()> as ParticularServiceLayer<()>>::Service` or `ALayer<()>: ParticularServiceLayer<()>`
| |
| doesn't satisfy `<_ as Layer<()>>::Service = <ALayer<()> as ParticularServiceLayer<()>>::Service`
| doesn't satisfy `ALayer<()>: ParticularServiceLayer<()>`
... ...
LL | struct Client<C>(C); LL | struct Client<C>(C);
| ---------------- method `check` not found for this struct | ---------------- method `check` not found for this struct

View file

@ -2,11 +2,7 @@ error[E0599]: the function or associated item `partial_cmp` exists for struct `A
--> $DIR/derive-sugg-arg-arity.rs:5:23 --> $DIR/derive-sugg-arg-arity.rs:5:23
| |
LL | pub struct A; LL | pub struct A;
| ------------ | ------------ function or associated item `partial_cmp` not found for this struct because it doesn't satisfy `A: Iterator` or `A: PartialOrd<_>`
| |
| function or associated item `partial_cmp` not found for this struct
| doesn't satisfy `A: Iterator`
| doesn't satisfy `A: PartialOrd<_>`
... ...
LL | _ => match A::partial_cmp() {}, LL | _ => match A::partial_cmp() {},
| ^^^^^^^^^^^ function or associated item cannot be called on `A` due to unsatisfied trait bounds | ^^^^^^^^^^^ function or associated item cannot be called on `A` due to unsatisfied trait bounds

View file

@ -35,12 +35,6 @@ LL | | .collect();
| | -^^^^^^^ method cannot be called due to unsatisfied trait bounds | | -^^^^^^^ method cannot be called due to unsatisfied trait bounds
| |_________| | |_________|
| |
--> $SRC_DIR/core/src/iter/adapters/take_while.rs:LL:COL
|
= note: doesn't satisfy `<_ as Iterator>::Item = &_`
--> $SRC_DIR/core/src/iter/adapters/cloned.rs:LL:COL
|
= note: doesn't satisfy `_: Iterator`
| |
= note: the following trait bounds were not satisfied: = note: the following trait bounds were not satisfied:
`<TakeWhile<&mut std::vec::IntoIter<u8>, {closure@$DIR/issue-31173.rs:7:21: 7:25}> as Iterator>::Item = &_` `<TakeWhile<&mut std::vec::IntoIter<u8>, {closure@$DIR/issue-31173.rs:7:21: 7:25}> as Iterator>::Item = &_`

View file

@ -17,10 +17,7 @@ error[E0599]: the method `clone` exists for union `U5<CloneNoCopy>`, but its tra
--> $DIR/union-derive-clone.rs:35:15 --> $DIR/union-derive-clone.rs:35:15
| |
LL | union U5<T> { LL | union U5<T> {
| ----------- | ----------- method `clone` not found for this union because it doesn't satisfy `U5<CloneNoCopy>: Clone`
| |
| method `clone` not found for this union
| doesn't satisfy `U5<CloneNoCopy>: Clone`
... ...
LL | struct CloneNoCopy; LL | struct CloneNoCopy;
| ------------------ doesn't satisfy `CloneNoCopy: Copy` | ------------------ doesn't satisfy `CloneNoCopy: Copy`