about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc_trait_selection/traits/error_reporting/suggestions.rs2
-rw-r--r--src/test/ui/traits/trait-suggest-deferences-multiple-0.fixed (renamed from src/test/ui/traits/trait-suggest-deferences-multiple.fixed)0
-rw-r--r--src/test/ui/traits/trait-suggest-deferences-multiple-0.rs (renamed from src/test/ui/traits/trait-suggest-deferences-multiple.rs)0
-rw-r--r--src/test/ui/traits/trait-suggest-deferences-multiple-0.stderr (renamed from src/test/ui/traits/trait-suggest-deferences-multiple.stderr)2
-rw-r--r--src/test/ui/traits/trait-suggest-deferences-multiple-1.rs54
-rw-r--r--src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr12
6 files changed, 68 insertions, 2 deletions
diff --git a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs
index 0c86e33884d..176bd90303d 100644
--- a/src/librustc_trait_selection/traits/error_reporting/suggestions.rs
+++ b/src/librustc_trait_selection/traits/error_reporting/suggestions.rs
@@ -500,7 +500,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> {
                     if let Ok(src) = self.tcx.sess.source_map().span_to_snippet(span) {
                         // Don't care about `&mut` because `DerefMut` is used less
                         // often and user will not expect autoderef happens.
-                        if src.starts_with("&") {
+                        if src.starts_with("&") && !src.starts_with("&mut ") {
                             let derefs = "*".repeat(steps);
                             err.span_suggestion(
                                 span,
diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple.fixed b/src/test/ui/traits/trait-suggest-deferences-multiple-0.fixed
index b7160b75c60..b7160b75c60 100644
--- a/src/test/ui/traits/trait-suggest-deferences-multiple.fixed
+++ b/src/test/ui/traits/trait-suggest-deferences-multiple-0.fixed
diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple.rs b/src/test/ui/traits/trait-suggest-deferences-multiple-0.rs
index 9ac55177ffa..9ac55177ffa 100644
--- a/src/test/ui/traits/trait-suggest-deferences-multiple.rs
+++ b/src/test/ui/traits/trait-suggest-deferences-multiple-0.rs
diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple.stderr b/src/test/ui/traits/trait-suggest-deferences-multiple-0.stderr
index f9b8bba4b41..add34a553bc 100644
--- a/src/test/ui/traits/trait-suggest-deferences-multiple.stderr
+++ b/src/test/ui/traits/trait-suggest-deferences-multiple-0.stderr
@@ -1,5 +1,5 @@
 error[E0277]: the trait bound `&Baz: Happy` is not satisfied
-  --> $DIR/trait-suggest-deferences-multiple.rs:34:9
+  --> $DIR/trait-suggest-deferences-multiple-0.rs:34:9
    |
 LL | fn foo<T>(_: T) where T: Happy {}
    |                          ----- required by this bound in `foo`
diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-1.rs b/src/test/ui/traits/trait-suggest-deferences-multiple-1.rs
new file mode 100644
index 00000000000..91c6c7924a4
--- /dev/null
+++ b/src/test/ui/traits/trait-suggest-deferences-multiple-1.rs
@@ -0,0 +1,54 @@
+use std::ops::{Deref, DerefMut};
+
+trait Happy {}
+struct LDM;
+impl Happy for &mut LDM {}
+
+struct Foo(LDM);
+struct Bar(Foo);
+struct Baz(Bar);
+impl Deref for Foo {
+    type Target = LDM;
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+impl Deref for Bar {
+    type Target = Foo;
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+impl Deref for Baz {
+    type Target = Bar;
+    fn deref(&self) -> &Self::Target {
+        &self.0
+    }
+}
+impl DerefMut for Foo {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.0
+    }
+}
+impl DerefMut for Bar {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.0
+    }
+}
+impl DerefMut for Baz {
+    fn deref_mut(&mut self) -> &mut Self::Target {
+        &mut self.0
+    }
+}
+
+
+fn foo<T>(_: T) where T: Happy {}
+
+fn main() {
+    // Currently the compiler doesn't try to suggest dereferences for situations
+    // where DerefMut involves. So this test is meant to ensure compiler doesn't
+    // generate incorrect help message.
+    let mut baz = Baz(Bar(Foo(LDM)));
+    foo(&mut baz);
+    //~^ ERROR the trait bound `&mut Baz: Happy` is not satisfied
+}
diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr b/src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr
new file mode 100644
index 00000000000..e90278fa16f
--- /dev/null
+++ b/src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr
@@ -0,0 +1,12 @@
+error[E0277]: the trait bound `&mut Baz: Happy` is not satisfied
+  --> $DIR/trait-suggest-deferences-multiple-1.rs:52:9
+   |
+LL | fn foo<T>(_: T) where T: Happy {}
+   |                          ----- required by this bound in `foo`
+...
+LL |     foo(&mut baz);
+   |         ^^^^^^^^ the trait `Happy` is not implemented for `&mut Baz`
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0277`.