CC #86377.
// Convert the bounds into obligations.
let impl_obligations = traits::predicates_for_generics(
- |_, _| cause.clone(),
+ |_idx, span| {
+ let misc = traits::ObligationCause::misc(span, self.body_id);
+ let parent_trait_pred = ty::Binder::dummy(ty::TraitPredicate {
+ trait_ref: ty::TraitRef::from_method(self.tcx, impl_def_id, substs),
+ constness: ty::BoundConstness::NotConst,
+ polarity: ty::ImplPolarity::Positive,
+ });
+ misc.derived_cause(parent_trait_pred, |derived| {
+ traits::ImplDerivedObligation(Box::new(
+ traits::ImplDerivedObligationCause {
+ derived,
+ impl_def_id,
+ span,
+ },
+ ))
+ })
+ },
self.param_env,
impl_bounds,
);
self.autoderef(span, ty).any(|(ty, _)| matches!(ty.kind(), ty::Slice(..) | ty::Array(..)))
}
+ #[instrument(level = "debug", skip(self))]
pub fn report_method_error(
&self,
span: Span,
// Find all the requirements that come from a local `impl` block.
let mut skip_list: FxHashSet<_> = Default::default();
let mut spanned_predicates: FxHashMap<MultiSpan, _> = Default::default();
- for (data, p, parent_p, impl_def_id, cause) in unsatisfied_predicates
+ for (p, parent_p, impl_def_id, cause) in unsatisfied_predicates
.iter()
.filter_map(|(p, parent, c)| c.as_ref().map(|c| (p, parent, c)))
.filter_map(|(p, parent, c)| match c.code() {
- ObligationCauseCode::ImplDerivedObligation(data) => {
- Some((&data.derived, p, parent, data.impl_def_id, data))
+ ObligationCauseCode::ImplDerivedObligation(data)
+ if matches!(p.kind().skip_binder(), ty::PredicateKind::Clause(_)) =>
+ {
+ Some((p, parent, data.impl_def_id, data))
}
_ => None,
})
{
- let parent_trait_ref = data.parent_trait_pred;
- let path = parent_trait_ref.print_modifiers_and_trait_path();
- let tr_self_ty = parent_trait_ref.skip_binder().self_ty();
- let unsatisfied_msg = "unsatisfied trait bound introduced here";
- let derive_msg = "unsatisfied trait bound introduced in this `derive` macro";
match self.tcx.hir().get_if_local(impl_def_id) {
// Unmet obligation comes from a `derive` macro, point at it once to
// avoid multiple span labels pointing at the same place.
{
let span = self_ty.span.ctxt().outer_expn_data().call_site;
let mut spans: MultiSpan = span.into();
- spans.push_span_label(span, derive_msg);
+ spans.push_span_label(
+ span,
+ "unsatisfied trait bound introduced in this `derive` macro",
+ );
let entry = spanned_predicates.entry(spans);
- entry.or_insert_with(|| (path, tr_self_ty, Vec::new())).2.push(p);
+ entry.or_insert_with(|| Vec::new()).push(p);
}
// Unmet obligation coming from an `impl`.
};
err.span_suggestion_verbose(
sp,
- "consider relaxing the type parameter's implicit \
- `Sized` bound",
+ "consider relaxing the type parameter's implicit `Sized` bound",
sugg,
Applicability::MachineApplicable,
);
skip_list.insert(p);
let mut spans = if cause.span != *item_span {
let mut spans: MultiSpan = cause.span.into();
- spans.push_span_label(cause.span, unsatisfied_msg);
+ spans.push_span_label(
+ cause.span,
+ "unsatisfied trait bound introduced here",
+ );
spans
} else {
let mut spans = Vec::with_capacity(2);
spans.push_span_label(self_ty.span, "");
let entry = spanned_predicates.entry(spans);
- entry.or_insert_with(|| (path, tr_self_ty, Vec::new())).2.push(p);
+ entry.or_insert_with(|| Vec::new()).push(p);
}
Some(Node::Item(hir::Item {
kind: hir::ItemKind::Trait(rustc_ast::ast::IsAuto::Yes, ..),
}
}
let mut spanned_predicates: Vec<_> = spanned_predicates.into_iter().collect();
- spanned_predicates.sort_by_key(|(span, (_, _, _))| span.primary_span());
- for (span, (_path, _self_ty, preds)) in spanned_predicates {
- let mut preds: Vec<_> = preds
- .into_iter()
- .filter_map(|pred| format_pred(*pred))
+ spanned_predicates.sort_by_key(|(span, _)| span.primary_span());
+ for (span, predicates) in spanned_predicates {
+ let mut preds: Vec<_> = predicates
+ .iter()
+ .filter_map(|pred| format_pred(**pred))
.map(|(p, _)| format!("`{}`", p))
.collect();
preds.sort();
LL | Foo::foo();
| ^^^ function or associated item cannot be called on `Foo<_>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `[u8; _]: Bar<[(); _]>`
+note: trait bound `[u8; _]: Bar<[(); _]>` was not satisfied
+ --> $DIR/issue-69654.rs:11:14
+ |
+LL | impl<const N: usize> Foo<N>
+ | ------
+LL | where
+LL | [u8; N]: Bar<[(); N]>,
+ | ^^^^^^^^^^^^ unsatisfied trait bound introduced here
error: aborting due to 2 previous errors
|
= note: doesn't satisfy `dyn Debug: Sized`
|
- = note: the following trait bounds were not satisfied:
- `dyn Debug: Sized`
+note: trait bound `dyn Debug: Sized` was not satisfied
+ --> $DIR/issue-80742.rs:20:6
+ |
+LL | impl<T> Inline<T>
+ | ^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+help: consider relaxing the type parameter's implicit `Sized` bound
+ |
+LL | impl<T: ?Sized> Inline<T>
+ | ++++++++
error[E0080]: evaluation of `Inline::<dyn std::fmt::Debug>::{constant#0}` failed
--> $SRC_DIR/core/src/mem/mod.rs:LL:COL
LL | foo.use_clone();
| ^^^^^^^^^ method cannot be called on `Object<NoDerives, SomeDerives>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `NoDerives: Clone`
+note: trait bound `NoDerives: Clone` was not satisfied
+ --> $DIR/issue-91492.rs:18:9
+ |
+LL | impl<T: Clone, A: Default> Object<T, A> {
+ | ^^^^^ ------------
+ | |
+ | unsatisfied trait bound introduced here
help: consider annotating `NoDerives` with `#[derive(Clone)]`
|
LL | #[derive(Clone)]
LL | foo.use_eq();
| ^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `NoDerives: Eq`
+note: trait bound `NoDerives: Eq` was not satisfied
+ --> $DIR/issue-91550.rs:15:9
+ |
+LL | impl<T: Eq> Object<T> {
+ | ^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
help: consider annotating `NoDerives` with `#[derive(Eq, PartialEq)]`
|
LL | #[derive(Eq, PartialEq)]
LL | foo.use_ord();
| ^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `NoDerives: Ord`
+note: trait bound `NoDerives: Ord` was not satisfied
+ --> $DIR/issue-91550.rs:18:9
+ |
+LL | impl<T: Ord> Object<T> {
+ | ^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
help: consider annotating `NoDerives` with `#[derive(Eq, Ord, PartialEq, PartialOrd)]`
|
LL | #[derive(Eq, Ord, PartialEq, PartialOrd)]
LL | foo.use_ord_and_partial_ord();
| ^^^^^^^^^^^^^^^^^^^^^^^ method cannot be called on `Object<NoDerives>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `NoDerives: Ord`
- `NoDerives: PartialOrd`
+note: trait bound `NoDerives: Ord` was not satisfied
+ --> $DIR/issue-91550.rs:21:9
+ |
+LL | impl<T: Ord + PartialOrd> Object<T> {
+ | ^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `NoDerives: PartialOrd` was not satisfied
+ --> $DIR/issue-91550.rs:21:15
+ |
+LL | impl<T: Ord + PartialOrd> Object<T> {
+ | ^^^^^^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
help: consider annotating `NoDerives` with `#[derive(Eq, Ord, PartialEq, PartialOrd)]`
|
LL | #[derive(Eq, Ord, PartialEq, PartialOrd)]
impl<T: X<Y<i32> = i32>> M for T {}
//~^ NOTE trait bound `<S as X>::Y<i32> = i32` was not satisfied
-//~| NOTE unsatisfied trait bound introduced here
+//~| NOTE
//~| NOTE
//~| NOTE
LL | pub struct SafeImpl<T: ?Sized, A: Raw<T>>(PhantomData<(A, T)>);
| ----------------------------------------- function or associated item `foo` not found for this struct
|
- = note: the following trait bounds were not satisfied:
- `RawImpl<()>: Raw<()>`
+note: trait bound `RawImpl<()>: Raw<()>` was not satisfied
+ --> $DIR/issue-62742.rs:28:20
+ |
+LL | impl<T: ?Sized, A: Raw<T>> SafeImpl<T, A> {
+ | ^^^^^^ --------------
+ | |
+ | unsatisfied trait bound introduced here
note: the trait `Raw` must be implemented
--> $DIR/issue-62742.rs:12:1
|
LL | s.method();
| ^^^^^^ method cannot be called on `Struct<f64>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `f64: Eq`
- `f64: Ord`
+note: trait bound `f64: Eq` was not satisfied
+ --> $DIR/method-not-found-generic-arg-elision.rs:74:36
+ |
+LL | impl<T: Clone + Copy + PartialEq + Eq + PartialOrd + Ord> Struct<T> {
+ | ^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `f64: Ord` was not satisfied
+ --> $DIR/method-not-found-generic-arg-elision.rs:74:54
+ |
+LL | impl<T: Clone + Copy + PartialEq + Eq + PartialOrd + Ord> Struct<T> {
+ | ^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
error: aborting due to 9 previous errors
LL | let y = x.test();
| ^^^^ method cannot be called on `Foo<Enum, CloneEnum>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `Enum: Clone`
- `Enum: Default`
- `CloneEnum: Default`
+note: trait bound `Enum: Clone` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:9
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `Enum: Default` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:17
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `CloneEnum: Default` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:40
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
note: the trait `Default` must be implemented
--> $SRC_DIR/core/src/default.rs:LL:COL
help: consider annotating `Enum` with `#[derive(Clone)]`
LL | let y = x.test();
| ^^^^ method cannot be called on `Foo<Struct, CloneStruct>` due to unsatisfied trait bounds
|
- = note: the following trait bounds were not satisfied:
- `Struct: Clone`
- `Struct: Default`
- `CloneStruct: Default`
+note: trait bound `Struct: Clone` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:9
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `Struct: Default` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:17
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `CloneStruct: Default` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:40
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
help: consider annotating `CloneStruct` with `#[derive(Default)]`
|
LL | #[derive(Default)]
|
= note: doesn't satisfy `Vec<Enum>: Clone`
|
- = note: the following trait bounds were not satisfied:
- `Vec<Enum>: Clone`
- `Instant: Default`
+note: trait bound `Vec<Enum>: Clone` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:9
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
+note: trait bound `Instant: Default` was not satisfied
+ --> $DIR/derive-trait-for-method-call.rs:20:40
+ |
+LL | impl<X: Clone + Default + , Y: Clone + Default> Foo<X, Y> {
+ | ^^^^^^^ ---------
+ | |
+ | unsatisfied trait bound introduced here
error: aborting due to 3 previous errors