about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-06-05 20:59:41 +0000
committerMichael Goulet <michael@errs.io>2023-06-05 21:00:08 +0000
commit140c011ca6659e608833bdc31b66b0f53d11104e (patch)
treec406dacdd549b72253f4515a2eb19cc1c1f7bca6 /compiler
parent408bbd040613f6776e0a7d05d582c81f4ddc189a (diff)
downloadrust-140c011ca6659e608833bdc31b66b0f53d11104e.tar.gz
rust-140c011ca6659e608833bdc31b66b0f53d11104e.zip
Don't mention already set fields
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_hir_typeck/src/expr.rs23
1 files changed, 12 insertions, 11 deletions
diff --git a/compiler/rustc_hir_typeck/src/expr.rs b/compiler/rustc_hir_typeck/src/expr.rs
index 3c5feb1ba51..f03c7ca44ba 100644
--- a/compiler/rustc_hir_typeck/src/expr.rs
+++ b/compiler/rustc_hir_typeck/src/expr.rs
@@ -2081,13 +2081,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
             },
             _ => {
                 // prevent all specified fields from being suggested
-                let skip_fields = skip_fields.iter().map(|x| x.ident.name);
-                if let Some(field_name) = self.suggest_field_name(
-                    variant,
-                    field.ident.name,
-                    skip_fields.collect(),
-                    expr_span,
-                ) {
+                let skip_fields: Vec<_> = skip_fields.iter().map(|x| x.ident.name).collect();
+                if let Some(field_name) =
+                    self.suggest_field_name(variant, field.ident.name, &skip_fields, expr_span)
+                {
                     err.span_suggestion(
                         field.ident.span,
                         "a field with a similar name exists",
@@ -2108,9 +2105,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                                     format!("`{ty}` does not have this field"),
                                 );
                             }
-                            let available_field_names =
+                            let mut available_field_names =
                                 self.available_field_names(variant, expr_span);
-                            if !available_field_names.is_empty() {
+                            available_field_names
+                                .retain(|name| skip_fields.iter().all(|skip| name != skip));
+                            if available_field_names.is_empty() {
+                                err.note("all struct fields are already assigned");
+                            } else {
                                 err.note(format!(
                                     "available fields are: {}",
                                     self.name_series_display(available_field_names)
@@ -2130,7 +2131,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
         &self,
         variant: &'tcx ty::VariantDef,
         field: Symbol,
-        skip: Vec<Symbol>,
+        skip: &[Symbol],
         // The span where stability will be checked
         span: Span,
     ) -> Option<Symbol> {
@@ -2582,7 +2583,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
         access_span: Span,
     ) {
         if let Some(suggested_field_name) =
-            self.suggest_field_name(def.non_enum_variant(), field.name, vec![], access_span)
+            self.suggest_field_name(def.non_enum_variant(), field.name, &[], access_span)
         {
             err.span_suggestion(
                 field.span,