]> git.lizzy.rs Git - rust.git/commitdiff
Fix error message on invalid field names for a struct variant
authorBarosl Lee <vcs@barosl.com>
Sat, 20 Dec 2014 20:28:49 +0000 (05:28 +0900)
committerBarosl Lee <vcs@barosl.com>
Sun, 21 Dec 2014 01:20:54 +0000 (10:20 +0900)
Fixes #19922.

src/librustc_typeck/check/mod.rs
src/test/compile-fail/issue-19922.rs [new file with mode: 0644]

index bbc33826f35519af565553491638aadb448ff99b..01819aff20681e3fb12a4789da496ffe4004e111 100644 (file)
@@ -3419,7 +3419,8 @@ fn check_struct_or_variant_fields<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
                                                 substitutions: subst::Substs<'tcx>,
                                                 field_types: &[ty::field_ty],
                                                 ast_fields: &[ast::Field],
-                                                check_completeness: bool)  {
+                                                check_completeness: bool,
+                                                enum_id_opt: Option<ast::DefId>)  {
         let tcx = fcx.ccx.tcx;
 
         let mut class_field_map = FnvHashMap::new();
@@ -3438,13 +3439,24 @@ fn check_struct_or_variant_fields<'a, 'tcx>(fcx: &FnCtxt<'a, 'tcx>,
             match pair {
                 None => {
                     fcx.type_error_message(
-                      field.ident.span,
-                      |actual| {
-                          format!("structure `{}` has no field named `{}`",
-                                  actual, token::get_ident(field.ident.node))
-                      },
-                      struct_ty,
-                      None);
+                        field.ident.span,
+                        |actual| match enum_id_opt {
+                            Some(enum_id) => {
+                                let variant_type = ty::enum_variant_with_id(tcx,
+                                                                            enum_id,
+                                                                            class_id);
+                                format!("struct variant `{}::{}` has no field named `{}`",
+                                        actual, variant_type.name.as_str(),
+                                        token::get_ident(field.ident.node))
+                            }
+                            None => {
+                                format!("structure `{}` has no field named `{}`",
+                                        actual,
+                                        token::get_ident(field.ident.node))
+                            }
+                        },
+                        struct_ty,
+                        None);
                     error_happened = true;
                 }
                 Some((_, true)) => {
@@ -3525,7 +3537,8 @@ fn check_struct_constructor(fcx: &FnCtxt,
                                        struct_substs,
                                        class_fields.as_slice(),
                                        fields,
-                                       base_expr.is_none());
+                                       base_expr.is_none(),
+                                       None);
         if ty::type_is_error(fcx.node_ty(id)) {
             struct_type = ty::mk_err();
         }
@@ -3567,7 +3580,8 @@ fn check_struct_enum_variant(fcx: &FnCtxt,
                                        substitutions,
                                        variant_fields.as_slice(),
                                        fields,
-                                       true);
+                                       true,
+                                       Some(enum_id));
         fcx.write_ty(id, enum_type);
     }
 
diff --git a/src/test/compile-fail/issue-19922.rs b/src/test/compile-fail/issue-19922.rs
new file mode 100644 (file)
index 0000000..e3ced30
--- /dev/null
@@ -0,0 +1,18 @@
+// Copyright 2014 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 Homura {
+    Akemi { madoka: () }
+}
+
+fn main() {
+    let homura = Homura::Akemi { kaname: () };
+    //~^ ERROR struct variant `Homura::Akemi` has no field named `kaname`
+}