Skip to content

Commit 07bd459

Browse files
authored
Rollup merge of rust-lang#121875 - estebank:e0277-drive-by, r=compiler-errors
Account for unmet T: !Copy in E0277 message ``` error[E0277]: the trait bound `T: !Copy` is not satisfied --> $DIR/simple.rs:10:16 | LL | not_copy::<T>(); | ^ the trait bound `T: !Copy` is not satisfied ``` instead of the current ``` error[E0277]: the trait bound `T: !Copy` is not satisfied --> $DIR/simple.rs:10:16 | LL | not_copy::<T>(); | ^ the trait `!Copy` is not implemented for `T` ```
2 parents c95f485 + 7f97dfe commit 07bd459

File tree

2 files changed

+17
-16
lines changed

2 files changed

+17
-16
lines changed

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

+13-12
Original file line numberDiff line numberDiff line change
@@ -4752,20 +4752,21 @@ pub(super) fn get_explanation_based_on_obligation<'tcx>(
47524752
} else {
47534753
String::new()
47544754
};
4755-
match ty_desc {
4756-
Some(desc) => format!(
4757-
"{}the trait `{}` is not implemented for {} `{}`{post}",
4758-
pre_message,
4759-
trait_predicate.print_modifiers_and_trait_path(),
4760-
desc,
4761-
tcx.short_ty_string(trait_ref.skip_binder().self_ty(), &mut None),
4762-
),
4763-
None => format!(
4764-
"{}the trait `{}` is not implemented for `{}`{post}",
4765-
pre_message,
4755+
let desc = match ty_desc {
4756+
Some(desc) => format!(" {desc}"),
4757+
None => String::new(),
4758+
};
4759+
if let ty::ImplPolarity::Positive = trait_predicate.polarity() {
4760+
format!(
4761+
"{pre_message}the trait `{}` is not implemented for{desc} `{}`{post}",
47664762
trait_predicate.print_modifiers_and_trait_path(),
47674763
tcx.short_ty_string(trait_ref.skip_binder().self_ty(), &mut None),
4768-
),
4764+
)
4765+
} else {
4766+
// "the trait bound `T: !Send` is not satisfied" reads better than "`!Send` is
4767+
// not implemented for `T`".
4768+
// FIXME: add note explaining explicit negative trait bounds.
4769+
format!("{pre_message}the trait bound `{trait_predicate}` is not satisfied{post}")
47694770
}
47704771
}
47714772
}

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)