about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authortrixnz <mtatrix@gmail.com>2016-08-04 22:52:16 +0200
committertrixnz <mtatrix@gmail.com>2016-08-04 22:52:16 +0200
commit0214ec248b2835a17c845c742d0e7697262ca72e (patch)
tree7de3911957cfd076aae098d7347c72a37be191e2 /src
parente804a3cf256106c097d44f6e0212cd183122da07 (diff)
downloadrust-0214ec248b2835a17c845c742d0e7697262ca72e.tar.gz
rust-0214ec248b2835a17c845c742d0e7697262ca72e.zip
Update error format for E0062
Diffstat (limited to 'src')
-rw-r--r--src/librustc_typeck/check/mod.rs20
-rw-r--r--src/test/compile-fail/E0062.rs4
2 files changed, 20 insertions, 4 deletions
diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs
index 6062bd048b3..4d3dda81993 100644
--- a/src/librustc_typeck/check/mod.rs
+++ b/src/librustc_typeck/check/mod.rs
@@ -3063,6 +3063,8 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
             remaining_fields.insert(field.name, field);
         }
 
+        let mut seen_fields = FnvHashMap();
+
         let mut error_happened = false;
 
         // Typecheck each field.
@@ -3071,13 +3073,25 @@ impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {
 
             if let Some(v_field) = remaining_fields.remove(&field.name.node) {
                 expected_field_type = self.field_ty(field.span, v_field, substs);
+
+                seen_fields.insert(field.name.node, field.span);
             } else {
                 error_happened = true;
                 expected_field_type = tcx.types.err;
                 if let Some(_) = variant.find_field_named(field.name.node) {
-                    span_err!(self.tcx.sess, field.name.span, E0062,
-                        "field `{}` specified more than once",
-                        field.name.node);
+                    let mut err = struct_span_err!(self.tcx.sess,
+                                                field.name.span,
+                                                E0062,
+                                                "field `{}` specified more than once",
+                                                field.name.node);
+
+                    err.span_label(field.name.span, &format!("used more than once"));
+
+                    if let Some(prev_span) = seen_fields.get(&field.name.node) {
+                        err.span_label(*prev_span, &format!("first use of `{}`", field.name.node));
+                    }
+
+                    err.emit();
                 } else {
                     self.report_unknown_field(adt_ty, variant, field, ast_fields);
                 }
diff --git a/src/test/compile-fail/E0062.rs b/src/test/compile-fail/E0062.rs
index 86ec7db14b5..822d93e52d5 100644
--- a/src/test/compile-fail/E0062.rs
+++ b/src/test/compile-fail/E0062.rs
@@ -14,7 +14,9 @@ struct Foo {
 
 fn main() {
     let x = Foo {
+        x: 0, //~ NOTE first use of `x`
         x: 0,
-        x: 0, //~ ERROR E0062
+        //~^ ERROR E0062
+        //~| NOTE used more than once
     };
 }