about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2017-01-15 05:48:34 +0000
committerbors <bors@rust-lang.org>2017-01-15 05:48:34 +0000
commit4f0508af90cfe4fac018b1a464ed94a828811600 (patch)
treed795bef67c0d54fe193fca200ca6f593842d51dd /src
parentbf6d7b665b85506dac663945229f00a406904fa5 (diff)
parentd04c027e9333d632a9ee0dcfbdf0d79dfddf0318 (diff)
downloadrust-4f0508af90cfe4fac018b1a464ed94a828811600.tar.gz
rust-4f0508af90cfe4fac018b1a464ed94a828811600.zip
Auto merge of #39040 - estebank:relevant-impl-multiline, r=nikomatsakis
Use multiline Diagnostic for "relevant impl" list

Provide the following output:

```
error[E0277]: the trait bound `Bar: Foo<usize>` is not satisfied
  --> $DIR/issue-21659-show-relevant-trait-impls-2.rs:38:8
   |
38 |     f1.foo(1usize);
   |        ^^^ the trait `Foo<usize>` is not implemented for `Bar`
   |
   = help: the following implementations were found:
             <Bar as Foo<i8>>
             <Bar as Foo<i16>>
             <Bar as Foo<i32>>
             <Bar as Foo<u8>>
           and 2 others

error: aborting due to previous error
```

instead of

```
error[E0277]: the trait bound `Bar: Foo<usize>` is not satisfied
  --> $DIR/issue-21659-show-relevant-trait-impls-2.rs:38:8
   |
38 |     f1.foo(1usize);
   |        ^^^ the trait `Foo<usize>` is not implemented for `Bar`
   |
   = help: the following implementations were found:
   = help:   <Bar as Foo<i8>>
   = help:   <Bar as Foo<i16>>
   = help:   <Bar as Foo<i32>>
   = help:   <Bar as Foo<u8>>
   = help: and 2 others

error: aborting due to previous error
```
Diffstat (limited to 'src')
-rw-r--r--src/librustc/traits/error_reporting.rs18
-rw-r--r--src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.rs (renamed from src/test/compile-fail/issue-21659-show-relevant-trait-impls-1.rs)0
-rw-r--r--src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.stderr12
-rw-r--r--src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.rs (renamed from src/test/compile-fail/issue-21659-show-relevant-trait-impls-2.rs)0
-rw-r--r--src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr15
-rw-r--r--src/test/ui/span/multiline-span-simple.stderr8
6 files changed, 41 insertions, 12 deletions
diff --git a/src/librustc/traits/error_reporting.rs b/src/librustc/traits/error_reporting.rs
index ab8c552d561..5cc9875e801 100644
--- a/src/librustc/traits/error_reporting.rs
+++ b/src/librustc/traits/error_reporting.rs
@@ -366,15 +366,17 @@ impl<'a, 'gcx, 'tcx> InferCtxt<'a, 'gcx, 'tcx> {
             return;
         }
 
-        err.help(&format!("the following implementations were found:"));
-
         let end = cmp::min(4, impl_candidates.len());
-        for candidate in &impl_candidates[0..end] {
-            err.help(&format!("  {:?}", candidate));
-        }
-        if impl_candidates.len() > 4 {
-            err.help(&format!("and {} others", impl_candidates.len()-4));
-        }
+        err.help(&format!("the following implementations were found:{}{}",
+                          &impl_candidates[0..end].iter().map(|candidate| {
+                              format!("\n  {:?}", candidate)
+                          }).collect::<String>(),
+                          if impl_candidates.len() > 4 {
+                              format!("\nand {} others", impl_candidates.len() - 4)
+                          } else {
+                              "".to_owned()
+                          }
+                          ));
     }
 
     /// Reports that an overflow has occurred and halts compilation. We
diff --git a/src/test/compile-fail/issue-21659-show-relevant-trait-impls-1.rs b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.rs
index 99035209e14..99035209e14 100644
--- a/src/test/compile-fail/issue-21659-show-relevant-trait-impls-1.rs
+++ b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.rs
diff --git a/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.stderr b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.stderr
new file mode 100644
index 00000000000..9010de081da
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-1.stderr
@@ -0,0 +1,12 @@
+error[E0277]: the trait bound `Bar: Foo<usize>` is not satisfied
+  --> $DIR/issue-21659-show-relevant-trait-impls-1.rs:34:8
+   |
+34 |     f1.foo(1usize);
+   |        ^^^ the trait `Foo<usize>` is not implemented for `Bar`
+   |
+   = help: the following implementations were found:
+             <Bar as Foo<i32>>
+             <Bar as Foo<u8>>
+
+error: aborting due to previous error
+
diff --git a/src/test/compile-fail/issue-21659-show-relevant-trait-impls-2.rs b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.rs
index 2009c32c854..2009c32c854 100644
--- a/src/test/compile-fail/issue-21659-show-relevant-trait-impls-2.rs
+++ b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.rs
diff --git a/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr
new file mode 100644
index 00000000000..e9591a64784
--- /dev/null
+++ b/src/test/ui/did_you_mean/issue-21659-show-relevant-trait-impls-2.stderr
@@ -0,0 +1,15 @@
+error[E0277]: the trait bound `Bar: Foo<usize>` is not satisfied
+  --> $DIR/issue-21659-show-relevant-trait-impls-2.rs:38:8
+   |
+38 |     f1.foo(1usize);
+   |        ^^^ the trait `Foo<usize>` is not implemented for `Bar`
+   |
+   = help: the following implementations were found:
+             <Bar as Foo<i8>>
+             <Bar as Foo<i16>>
+             <Bar as Foo<i32>>
+             <Bar as Foo<u8>>
+           and 2 others
+
+error: aborting due to previous error
+
diff --git a/src/test/ui/span/multiline-span-simple.stderr b/src/test/ui/span/multiline-span-simple.stderr
index b801325114c..85c11c05b9f 100644
--- a/src/test/ui/span/multiline-span-simple.stderr
+++ b/src/test/ui/span/multiline-span-simple.stderr
@@ -10,10 +10,10 @@ error[E0277]: the trait bound `u32: std::ops::Add<()>` is not satisfied
    | |______________^ ...ending here: the trait `std::ops::Add<()>` is not implemented for `u32`
    |
    = help: the following implementations were found:
-   = help:   <u32 as std::ops::Add>
-   = help:   <&'a u32 as std::ops::Add<u32>>
-   = help:   <u32 as std::ops::Add<&'a u32>>
-   = help:   <&'b u32 as std::ops::Add<&'a u32>>
+             <u32 as std::ops::Add>
+             <&'a u32 as std::ops::Add<u32>>
+             <u32 as std::ops::Add<&'a u32>>
+             <&'b u32 as std::ops::Add<&'a u32>>
 
 error: aborting due to previous error