about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2018-11-08 18:11:37 -0800
committerEsteban Küber <esteban@kuber.com.ar>2018-11-22 14:14:27 -0800
commit286f7ae1dde03478fc0f36b7d1f3dc97cb47b730 (patch)
tree0a164e55cbc0dc07c1e5d935ebefb6619ba1d448 /src
parentabdcb868ff69a5f6a96dd188ff845a1ec67335f8 (diff)
downloadrust-286f7ae1dde03478fc0f36b7d1f3dc97cb47b730.tar.gz
rust-286f7ae1dde03478fc0f36b7d1f3dc97cb47b730.zip
Join multiple E0191 errors in the same location under a single diagnostic
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/astconv.rs27
-rw-r--r--src/test/ui/associated-types/associated-types-incomplete-object.rs3
-rw-r--r--src/test/ui/associated-types/associated-types-incomplete-object.stderr15
-rw-r--r--src/test/ui/error-codes/E0107-b.stderr15
4 files changed, 33 insertions, 27 deletions
diff --git a/src/librustc_typeck/astconv.rs b/src/librustc_typeck/astconv.rs
index 277f7d34546..906b800ee44 100644
--- a/src/librustc_typeck/astconv.rs
+++ b/src/librustc_typeck/astconv.rs
@@ -1029,18 +1029,31 @@ impl<'o, 'gcx: 'tcx, 'tcx> dyn AstConv<'gcx, 'tcx>+'o {
             associated_types.remove(&projection_bound.projection_def_id());
         }
 
-        for item_def_id in associated_types {
-            let assoc_item = tcx.associated_item(item_def_id);
-            let trait_def_id = assoc_item.container.id();
+        if !associated_types.is_empty() {
+            let names = associated_types.iter().map(|item_def_id| {
+                let assoc_item = tcx.associated_item(*item_def_id);
+                let trait_def_id = assoc_item.container.id();
+                format!(
+                    "`{}` (from the trait `{}`)",
+                    assoc_item.ident,
+                    tcx.item_path_str(trait_def_id),
+                )
+            }).collect::<Vec<_>>().join(", ");
             let mut err = struct_span_err!(
                 tcx.sess,
                 span,
                 E0191,
-                "the value of the associated type `{}` (from the trait `{}`) must be specified",
-                assoc_item.ident,
-                tcx.item_path_str(trait_def_id),
+                "the value of the associated type{} {} must be specified",
+                if associated_types.len() == 1 { "" } else { "s" },
+                names,
             );
-            err.span_label(span, format!("missing associated type `{}` value", assoc_item.ident));
+            for item_def_id in associated_types {
+                let assoc_item = tcx.associated_item(item_def_id);
+                err.span_label(
+                    span,
+                    format!("missing associated type `{}` value", assoc_item.ident),
+                );
+            }
             err.emit();
         }
 
diff --git a/src/test/ui/associated-types/associated-types-incomplete-object.rs b/src/test/ui/associated-types/associated-types-incomplete-object.rs
index 9f1df14605b..e575fd695b2 100644
--- a/src/test/ui/associated-types/associated-types-incomplete-object.rs
+++ b/src/test/ui/associated-types/associated-types-incomplete-object.rs
@@ -37,6 +37,5 @@ pub fn main() {
     //~^ ERROR the value of the associated type `A` (from the trait `Foo`) must be specified
 
     let d = &42isize as &Foo;
-    //~^ ERROR the value of the associated type `A` (from the trait `Foo`) must be specified
-    //~| ERROR the value of the associated type `B` (from the trait `Foo`) must be specified
+    //~^ ERROR the value of the associated types `A` (from the trait `Foo`), `B` (from the trait
 }
diff --git a/src/test/ui/associated-types/associated-types-incomplete-object.stderr b/src/test/ui/associated-types/associated-types-incomplete-object.stderr
index 95b1c631250..5a3c243efd0 100644
--- a/src/test/ui/associated-types/associated-types-incomplete-object.stderr
+++ b/src/test/ui/associated-types/associated-types-incomplete-object.stderr
@@ -10,18 +10,15 @@ error[E0191]: the value of the associated type `A` (from the trait `Foo`) must b
 LL |     let c = &42isize as &Foo<B=char>;
    |                          ^^^^^^^^^^^ missing associated type `A` value
 
-error[E0191]: the value of the associated type `A` (from the trait `Foo`) must be specified
-  --> $DIR/associated-types-incomplete-object.rs:39:26
-   |
-LL |     let d = &42isize as &Foo;
-   |                          ^^^ missing associated type `A` value
-
-error[E0191]: the value of the associated type `B` (from the trait `Foo`) must be specified
+error[E0191]: the value of the associated types `A` (from the trait `Foo`), `B` (from the trait `Foo`) must be specified
   --> $DIR/associated-types-incomplete-object.rs:39:26
    |
 LL |     let d = &42isize as &Foo;
-   |                          ^^^ missing associated type `B` value
+   |                          ^^^
+   |                          |
+   |                          missing associated type `A` value
+   |                          missing associated type `B` value
 
-error: aborting due to 4 previous errors
+error: aborting due to 3 previous errors
 
 For more information about this error, try `rustc --explain E0191`.
diff --git a/src/test/ui/error-codes/E0107-b.stderr b/src/test/ui/error-codes/E0107-b.stderr
index 28b957dc91e..f779ca1e0b1 100644
--- a/src/test/ui/error-codes/E0107-b.stderr
+++ b/src/test/ui/error-codes/E0107-b.stderr
@@ -6,19 +6,16 @@ LL |  pub struct Foo { i: Box<T<usize, usize, usize, usize, B=usize>> }
    |                                          |
    |                                          unexpected type argument
 
-error[E0191]: the value of the associated type `A` (from the trait `T`) must be specified
+error[E0191]: the value of the associated types `A` (from the trait `T`), `C` (from the trait `T`) must be specified
   --> $DIR/E0107-b.rs:6:26
    |
 LL |  pub struct Foo { i: Box<T<usize, usize, usize, usize, B=usize>> }
-   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing associated type `A` value
+   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+   |                          |
+   |                          missing associated type `A` value
+   |                          missing associated type `C` value
 
-error[E0191]: the value of the associated type `C` (from the trait `T`) must be specified
-  --> $DIR/E0107-b.rs:6:26
-   |
-LL |  pub struct Foo { i: Box<T<usize, usize, usize, usize, B=usize>> }
-   |                          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing associated type `C` value
-
-error: aborting due to 3 previous errors
+error: aborting due to 2 previous errors
 
 Some errors occurred: E0107, E0191.
 For more information about an error, try `rustc --explain E0107`.