Change:
With a single typo in a match arm, we generate three separate errors: We should collect all these errors into a single diagnostic:
could you share sample code to exactly reproduce above diagnostic?
I will raise another PR to address the case where we are unnecessarily throwing .

Discussion:
use syntax::ast; use syntax::source_map::Spanned; use syntax::ptr::P; <ins> use syntax::util::lev_distance::find_best_match_for_name; </ins> use syntax_pos::Span; impl<'a, 'gcx, 'tcx> FnCtxt<'a, 'gcx, 'tcx> {

self.check_pat_walk(&field.pat, field_ty, def_bm, true); } <ins> let mut unmentioned_fields = variant.fields .iter() .map(|field| field.ident.modern()) .filter(|ident| !used_fields.contains_key(&ident)) .collect::<Vec<_>>(); </ins> if inexistent_fields.len() > 0 { let (field_names, t, plural) = if inexistent_fields.len() == 1 { (format!("a field named `{}`", inexistent_fields[0].1), "this", "")

kind_name, tcx.item_path_str(variant.did), field_names); <del> if let Some((span, _)) = inexistent_fields.last() { </del> <ins> if let Some((span, ident)) = inexistent_fields.last() { </ins> err.span_label(*span, format!("{} `{}` does not have {} field{}", kind_name, tcx.item_path_str(variant.did), t, plural)); <ins> if plural == "" { let input = unmentioned_fields.iter().map(|field| &field.name); let suggested_name = find_best_match_for_name(input, &ident.name.as_str(), None); if let Some(suggested_name) = suggested_name { err.span_suggestion(*span, "did you mean", suggested_name.to_string()); // we don't want to throw `E0027` in case we have thrown `E0026` for them unmentioned_fields.retain(|&x| x.as_str() != suggested_name.as_str()); } } </ins> } if tcx.sess.teach(&err.get_code().unwrap()) { err.note(

tcx.sess.span_err(span, "`..` cannot be used in union patterns"); } } else if !etc { <del> let unmentioned_fields = variant.fields .iter() .map(|field| field.ident.modern()) .filter(|ident| !used_fields.contains_key(&ident)) .collect::<Vec<_>>(); </del> if unmentioned_fields.len() > 0 { let field_names = if unmentioned_fields.len() == 1 { format!("field `{}`", unmentioned_fields[0])

<ins> // Copyright 2018 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or // http://www.apache.org/licenses/LICENSE-2.0> or the MIT license // <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your // option. This file may not be copied, modified, or distributed // except according to those terms. enum A { A { foo: usize, } } fn main() { let x = A::A { foo: 3 }; match x { A::A { fob } => { println!("{}", fob); } } } </ins>

<ins> error[E0026]: variant `A::A` does not have a field named `fob` --> $DIR/issue-52717.rs:19:12 | LL |     A::A { fob } => { println!("{}", fob); } |            ^^^ |            | |            variant `A::A` does not have this field |            help: did you mean: `foo` error: aborting due to previous error For more information about this error, try `rustc --explain E0026`. </ins>

match MyOption::MySome(42) { MyOption::MySome { x: 42 } => (), //~^ ERROR variant `MyOption::MySome` does not have a field named `x` <del> //~| ERROR pattern does not mention field `0` </del> _ => (), } }

--> $DIR/issue-17800.rs:18:28 | LL |         MyOption::MySome { x: 42 } => (), <del> |                            ^^^^^ variant `MyOption::MySome` does not have this field </del> <ins> |                            ^^^^^ |                            | |                            variant `MyOption::MySome` does not have this field |                            help: did you mean: `0` </ins> <del> error[E0027]: pattern does not mention field `0` --> $DIR/issue-17800.rs:18:9 | LL |         MyOption::MySome { x: 42 } => (), |         ^^^^^^^^^^^^^^^^^^^^^^^^^^ missing field `0` | = note: trying to match a tuple variant with a struct variant pattern error: aborting due to 2 previous errors </del> <ins> error: aborting due to previous error </ins> <del> Some errors occurred: E0026, E0027. For more information about an error, try `rustc --explain E0026`. </del> <ins> For more information about this error, try `rustc --explain E0026`. </ins>