Account for negative bounds in E0277 note and suggestion
Do not suggest `#[derive(Copy)]` when we wanted a `!Copy` type. Do not say "`Copy` is not implemented for `T` but `Copy` is". Do not talk about `Trait` having no implementations when `!Trait` was desired.
This commit is contained in:
parent
1a0c502183
commit
143b072c62
@ -2540,12 +2540,16 @@ fn try_to_add_help_message(
|
||||
&& self.tcx.trait_impls_of(trait_def_id).is_empty()
|
||||
&& !self.tcx.trait_is_auto(trait_def_id)
|
||||
&& !self.tcx.trait_is_alias(trait_def_id)
|
||||
&& trait_predicate.polarity() == ty::PredicatePolarity::Positive
|
||||
{
|
||||
err.span_help(
|
||||
self.tcx.def_span(trait_def_id),
|
||||
crate::fluent_generated::trait_selection_trait_has_no_impls,
|
||||
);
|
||||
} else if !suggested && !unsatisfied_const {
|
||||
} else if !suggested
|
||||
&& !unsatisfied_const
|
||||
&& trait_predicate.polarity() == ty::PredicatePolarity::Positive
|
||||
{
|
||||
// Can't show anything else useful, try to find similar impls.
|
||||
let impl_candidates = self.find_similar_impl_candidates(trait_predicate);
|
||||
if !self.report_similar_impl_candidates(
|
||||
|
@ -3697,6 +3697,9 @@ pub fn suggest_derive(
|
||||
err: &mut Diag<'_>,
|
||||
trait_pred: ty::PolyTraitPredicate<'tcx>,
|
||||
) {
|
||||
if trait_pred.polarity() == ty::PredicatePolarity::Negative {
|
||||
return;
|
||||
}
|
||||
let Some(diagnostic_name) = self.tcx.get_diagnostic_name(trait_pred.def_id()) else {
|
||||
return;
|
||||
};
|
||||
|
@ -6,12 +6,6 @@ LL | fn hello() -> impl !Foo {
|
||||
LL |
|
||||
LL | NotFoo
|
||||
| ------ return type was inferred to be `NotFoo` here
|
||||
|
|
||||
help: this trait has no implementations, consider adding one
|
||||
--> $DIR/on-unimplemented.rs:4:1
|
||||
|
|
||||
LL | trait Foo {}
|
||||
| ^^^^^^^^^
|
||||
|
||||
error: aborting due to 1 previous error
|
||||
|
||||
|
@ -28,18 +28,11 @@ error[E0277]: the trait bound `Copyable: !Copy` is not satisfied
|
||||
LL | not_copy::<Copyable>();
|
||||
| ^^^^^^^^ the trait bound `Copyable: !Copy` is not satisfied
|
||||
|
|
||||
= help: the trait `Copy` is not implemented for `Copyable`
|
||||
but trait `Copy` is implemented for it
|
||||
note: required by a bound in `not_copy`
|
||||
--> $DIR/simple.rs:3:16
|
||||
|
|
||||
LL | fn not_copy<T: !Copy>() {}
|
||||
| ^^^^^ required by this bound in `not_copy`
|
||||
help: consider annotating `Copyable` with `#[derive(Copy)]`
|
||||
|
|
||||
LL + #[derive(Copy)]
|
||||
LL | struct Copyable;
|
||||
|
|
||||
|
||||
error[E0277]: the trait bound `NotNecessarilyCopyable: !Copy` is not satisfied
|
||||
--> $DIR/simple.rs:37:16
|
||||
@ -52,11 +45,6 @@ note: required by a bound in `not_copy`
|
||||
|
|
||||
LL | fn not_copy<T: !Copy>() {}
|
||||
| ^^^^^ required by this bound in `not_copy`
|
||||
help: consider annotating `NotNecessarilyCopyable` with `#[derive(Copy)]`
|
||||
|
|
||||
LL + #[derive(Copy)]
|
||||
LL | struct NotNecessarilyCopyable;
|
||||
|
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user