about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2020-12-02 07:37:40 +0000
committerbors <bors@rust-lang.org>2020-12-02 07:37:40 +0000
commitd37afad0cc87bf709ad10c85319296ac53030f03 (patch)
tree6b948a91442c6d872af5b7ef1b835b2760cfd254 /src
parent92e4fb073245a42559e357a3002c596b8b38edf6 (diff)
parentb287806d389d3bc94470c27568ad16dc015769a5 (diff)
downloadrust-d37afad0cc87bf709ad10c85319296ac53030f03.tar.gz
rust-d37afad0cc87bf709ad10c85319296ac53030f03.zip
Auto merge of #79606 - ThePuzzlemaker:issue-79458-fix, r=scottmcm
Do not show negative polarity trait implementations in diagnostic messages for similar implementations

This fixes #79458.

Previously, this code:
```rust
#[derive(Clone)]
struct Foo<'a, T> {
    x: &'a mut T,
}
```
would have suggested that `<&mut T as Clone>` was an implementation that was found. This is due to the fact that the standard library now has `impl<'_, T> !Clone for &'_ mut T`, and explicit negative polarity implementations were not filtered out in diagnostic output when suggesting similar implementations.

This PR fixes this issue by filtering out negative polarity trait implementations in `find_similar_impl_candidates` within `rustc_trait_selection::traits::error_reporting::InferCtxtPrivExt<'tcx>`. It also adds a UI regression test for this issue and fixes UI tests that had incorrectly been modified to expect the invalid output.

r? `@scottmcm`
Diffstat (limited to 'src')
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-1.stderr1
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-object.stderr1
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-param-1.stderr1
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-param-2.stderr3
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-param-3.stderr1
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-param-4.stderr1
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-param-5.stderr4
-rw-r--r--src/test/ui/associated-types/hr-associated-type-bound-param-6.stderr1
-rw-r--r--src/test/ui/async-await/issue-64130-3-other.stderr2
-rw-r--r--src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types-2.stderr2
-rw-r--r--src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types.stderr3
-rw-r--r--src/test/ui/auto-traits/typeck-default-trait-impl-negation.stderr6
-rw-r--r--src/test/ui/traits/issue-79458.rs10
-rw-r--r--src/test/ui/traits/issue-79458.stderr15
14 files changed, 25 insertions, 26 deletions
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-1.stderr b/src/test/ui/associated-types/hr-associated-type-bound-1.stderr
index c9255c91d2d..042223f3e95 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-1.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-1.stderr
@@ -12,7 +12,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-object.stderr b/src/test/ui/associated-types/hr-associated-type-bound-object.stderr
index 225b18a3b04..848924bf58e 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-object.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-object.stderr
@@ -12,7 +12,6 @@ LL | fn f<'a, T: X<'a> + ?Sized>(x: &<T as X<'a>>::U) {
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-param-1.stderr b/src/test/ui/associated-types/hr-associated-type-bound-param-1.stderr
index 7af261e4b3d..d35c1279264 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-param-1.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-param-1.stderr
@@ -12,7 +12,6 @@ LL |     type V = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-param-2.stderr b/src/test/ui/associated-types/hr-associated-type-bound-param-2.stderr
index b48ff97f121..0afa340f7a1 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-param-2.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-param-2.stderr
@@ -12,7 +12,6 @@ LL |     for<'b> <T as Z<'b, u16>>::W: Clone,
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error[E0277]: the trait bound `for<'b> <u16 as Z<'b, u16>>::W: Clone` is not satisfied
   --> $DIR/hr-associated-type-bound-param-2.rs:16:14
@@ -28,7 +27,6 @@ LL |     type W = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error[E0277]: the trait bound `for<'b> <u16 as Z<'b, u16>>::W: Clone` is not satisfied
   --> $DIR/hr-associated-type-bound-param-2.rs:4:8
@@ -44,7 +42,6 @@ LL |     for<'b> <T as Z<'b, u16>>::W: Clone,
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to 3 previous errors
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-param-3.stderr b/src/test/ui/associated-types/hr-associated-type-bound-param-3.stderr
index 48c4d77dcc7..79e1e00e98d 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-param-3.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-param-3.stderr
@@ -12,7 +12,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-param-4.stderr b/src/test/ui/associated-types/hr-associated-type-bound-param-4.stderr
index 111ca8566b1..e23ac5f5650 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-param-4.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-param-4.stderr
@@ -12,7 +12,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-param-5.stderr b/src/test/ui/associated-types/hr-associated-type-bound-param-5.stderr
index df25f7ac953..38909be59f2 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-param-5.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-param-5.stderr
@@ -12,7 +12,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error[E0277]: the trait bound `for<'b> <Vec<T> as X<'b, Vec<T>>>::U: Clone` is not satisfied
   --> $DIR/hr-associated-type-bound-param-5.rs:27:14
@@ -28,7 +27,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error[E0277]: the trait bound `for<'b> <Vec<T> as X<'b, Vec<T>>>::U: Clone` is not satisfied
   --> $DIR/hr-associated-type-bound-param-5.rs:33:14
@@ -44,7 +42,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error[E0277]: the trait bound `for<'b> <Box<T> as X<'b, Box<T>>>::U: Clone` is not satisfied
   --> $DIR/hr-associated-type-bound-param-5.rs:33:14
@@ -60,7 +57,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error: aborting due to 4 previous errors
 
diff --git a/src/test/ui/associated-types/hr-associated-type-bound-param-6.stderr b/src/test/ui/associated-types/hr-associated-type-bound-param-6.stderr
index 2efdb2445af..6e02b42e514 100644
--- a/src/test/ui/associated-types/hr-associated-type-bound-param-6.stderr
+++ b/src/test/ui/associated-types/hr-associated-type-bound-param-6.stderr
@@ -12,7 +12,6 @@ LL |     type U = str;
    |
    = help: the following implementations were found:
              <&T as Clone>
-             <&mut T as Clone>
 
 error[E0277]: the trait bound `for<'b> T: X<'b, T>` is not satisfied
   --> $DIR/hr-associated-type-bound-param-6.rs:12:12
diff --git a/src/test/ui/async-await/issue-64130-3-other.stderr b/src/test/ui/async-await/issue-64130-3-other.stderr
index 4bf43f14cc1..9ffdd0524c6 100644
--- a/src/test/ui/async-await/issue-64130-3-other.stderr
+++ b/src/test/ui/async-await/issue-64130-3-other.stderr
@@ -10,8 +10,6 @@ LL | async fn bar() {
 LL |     is_qux(bar());
    |     ^^^^^^ within `impl Future`, the trait `Qux` is not implemented for `Foo`
    |
-   = help: the following implementations were found:
-             <Foo as Qux>
 note: future does not implement `Qux` as this value is used across an await
   --> $DIR/issue-64130-3-other.rs:18:5
    |
diff --git a/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types-2.stderr b/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types-2.stderr
index 53ba9b8a3f6..c2eab1a33b9 100644
--- a/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types-2.stderr
+++ b/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types-2.stderr
@@ -7,8 +7,6 @@ LL | fn is_mytrait<T: MyTrait>() {}
 LL |     is_mytrait::<(MyS2, MyS)>();
    |     ^^^^^^^^^^^^^^^^^^^^^^^^^ within `(MyS2, MyS)`, the trait `MyTrait` is not implemented for `MyS2`
    |
-   = help: the following implementations were found:
-             <MyS2 as MyTrait>
    = note: required because it appears within the type `(MyS2, MyS)`
 
 error: aborting due to previous error
diff --git a/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types.stderr b/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types.stderr
index bc500004984..efb6bde1799 100644
--- a/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types.stderr
+++ b/src/test/ui/auto-traits/typeck-default-trait-impl-constituent-types.stderr
@@ -6,9 +6,6 @@ LL | fn is_mytrait<T: MyTrait>() {}
 ...
 LL |     is_mytrait::<MyS2>();
    |                  ^^^^ the trait `MyTrait` is not implemented for `MyS2`
-   |
-   = help: the following implementations were found:
-             <MyS2 as MyTrait>
 
 error: aborting due to previous error
 
diff --git a/src/test/ui/auto-traits/typeck-default-trait-impl-negation.stderr b/src/test/ui/auto-traits/typeck-default-trait-impl-negation.stderr
index 76a6994cb00..dae87bc221a 100644
--- a/src/test/ui/auto-traits/typeck-default-trait-impl-negation.stderr
+++ b/src/test/ui/auto-traits/typeck-default-trait-impl-negation.stderr
@@ -6,9 +6,6 @@ LL | fn is_my_trait<T: MyTrait>() {}
 ...
 LL |     is_my_trait::<ThisImplsUnsafeTrait>();
    |                   ^^^^^^^^^^^^^^^^^^^^ the trait `MyTrait` is not implemented for `ThisImplsUnsafeTrait`
-   |
-   = help: the following implementations were found:
-             <ThisImplsUnsafeTrait as MyTrait>
 
 error[E0277]: the trait bound `ThisImplsTrait: MyUnsafeTrait` is not satisfied
   --> $DIR/typeck-default-trait-impl-negation.rs:25:26
@@ -18,9 +15,6 @@ LL | fn is_my_unsafe_trait<T: MyUnsafeTrait>() {}
 ...
 LL |     is_my_unsafe_trait::<ThisImplsTrait>();
    |                          ^^^^^^^^^^^^^^ the trait `MyUnsafeTrait` is not implemented for `ThisImplsTrait`
-   |
-   = help: the following implementations were found:
-             <ThisImplsTrait as MyUnsafeTrait>
 
 error: aborting due to 2 previous errors
 
diff --git a/src/test/ui/traits/issue-79458.rs b/src/test/ui/traits/issue-79458.rs
new file mode 100644
index 00000000000..a41add6a1cc
--- /dev/null
+++ b/src/test/ui/traits/issue-79458.rs
@@ -0,0 +1,10 @@
+// Negative implementations should not be shown in trait suggestions.
+// This is a regression test of #79458.
+
+#[derive(Clone)]
+struct Foo<'a, T> {
+    bar: &'a mut T
+    //~^ ERROR the trait bound `&mut T: Clone` is not satisfied
+}
+
+fn main() {}
diff --git a/src/test/ui/traits/issue-79458.stderr b/src/test/ui/traits/issue-79458.stderr
new file mode 100644
index 00000000000..54947b57c03
--- /dev/null
+++ b/src/test/ui/traits/issue-79458.stderr
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `&mut T: Clone` is not satisfied
+  --> $DIR/issue-79458.rs:6:5
+   |
+LL |     bar: &'a mut T
+   |     ^^^^^^^^^^^^^^ the trait `Clone` is not implemented for `&mut T`
+   |
+   = help: the following implementations were found:
+             <&T as Clone>
+   = note: `Clone` is implemented for `&T`, but not for `&mut T`
+   = note: required by `clone`
+   = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.