Skip to content

Commit 7f97dfe

Browse files
committed
Account for unmet T: !Copy in E0277 message
1 parent d89c2c5 commit 7f97dfe

File tree

2 files changed

+16
-9
lines changed

2 files changed

+16
-9
lines changed

compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs

+12-5
Original file line numberDiff line numberDiff line change
@@ -4773,11 +4773,18 @@ pub(super) fn get_explanation_based_on_obligation<'tcx>(
47734773
Some(desc) => format!(" {desc}"),
47744774
None => String::new(),
47754775
};
4776-
format!(
4777-
"{pre_message}the trait `{}` is not implemented for{desc} `{}`{post}",
4778-
trait_predicate.print_modifiers_and_trait_path(),
4779-
tcx.short_ty_string(trait_ref.skip_binder().self_ty(), &mut None),
4780-
)
4776+
if let ty::ImplPolarity::Positive = trait_predicate.polarity() {
4777+
format!(
4778+
"{pre_message}the trait `{}` is not implemented for{desc} `{}`{post}",
4779+
trait_predicate.print_modifiers_and_trait_path(),
4780+
tcx.short_ty_string(trait_ref.skip_binder().self_ty(), &mut None),
4781+
)
4782+
} else {
4783+
// "the trait bound `T: !Send` is not satisfied" reads better than "`!Send` is
4784+
// not implemented for `T`".
4785+
// FIXME: add note explaining explicit negative trait bounds.
4786+
format!("{pre_message}the trait bound `{trait_predicate}` is not satisfied{post}")
4787+
}
47814788
}
47824789
}
47834790

tests/ui/traits/negative-bounds/simple.stderr

+4-4
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ error[E0277]: the trait bound `T: !Copy` is not satisfied
22
--> $DIR/simple.rs:10:16
33
|
44
LL | not_copy::<T>();
5-
| ^ the trait `!Copy` is not implemented for `T`
5+
| ^ the trait bound `T: !Copy` is not satisfied
66
|
77
note: required by a bound in `not_copy`
88
--> $DIR/simple.rs:3:16
@@ -14,7 +14,7 @@ error[E0277]: the trait bound `T: !Copy` is not satisfied
1414
--> $DIR/simple.rs:15:16
1515
|
1616
LL | not_copy::<T>();
17-
| ^ the trait `!Copy` is not implemented for `T`
17+
| ^ the trait bound `T: !Copy` is not satisfied
1818
|
1919
note: required by a bound in `not_copy`
2020
--> $DIR/simple.rs:3:16
@@ -26,7 +26,7 @@ error[E0277]: the trait bound `Copyable: !Copy` is not satisfied
2626
--> $DIR/simple.rs:30:16
2727
|
2828
LL | not_copy::<Copyable>();
29-
| ^^^^^^^^ the trait `!Copy` is not implemented for `Copyable`
29+
| ^^^^^^^^ the trait bound `Copyable: !Copy` is not satisfied
3030
|
3131
= help: the trait `Copy` is implemented for `Copyable`
3232
note: required by a bound in `not_copy`
@@ -44,7 +44,7 @@ error[E0277]: the trait bound `NotNecessarilyCopyable: !Copy` is not satisfied
4444
--> $DIR/simple.rs:37:16
4545
|
4646
LL | not_copy::<NotNecessarilyCopyable>();
47-
| ^^^^^^^^^^^^^^^^^^^^^^ the trait `!Copy` is not implemented for `NotNecessarilyCopyable`
47+
| ^^^^^^^^^^^^^^^^^^^^^^ the trait bound `NotNecessarilyCopyable: !Copy` is not satisfied
4848
|
4949
note: required by a bound in `not_copy`
5050
--> $DIR/simple.rs:3:16

0 commit comments

Comments
 (0)