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();
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)) => {
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();
}
substitutions,
variant_fields.as_slice(),
fields,
- true);
+ true,
+ Some(enum_id));
fcx.write_ty(id, enum_type);
}
--- /dev/null
+// 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`
+}