From c9010bff6c5d8ccc8d3009d377f1cb5826b25d69 Mon Sep 17 00:00:00 2001 From: Barosl Lee Date: Sun, 21 Dec 2014 05:28:49 +0900 Subject: [PATCH] Fix error message on invalid field names for a struct variant Fixes #19922. --- src/librustc_typeck/check/mod.rs | 34 ++++++++++++++++++++-------- src/test/compile-fail/issue-19922.rs | 18 +++++++++++++++ 2 files changed, 42 insertions(+), 10 deletions(-) create mode 100644 src/test/compile-fail/issue-19922.rs diff --git a/src/librustc_typeck/check/mod.rs b/src/librustc_typeck/check/mod.rs index bbc33826f3551..01819aff20681 100644 --- a/src/librustc_typeck/check/mod.rs +++ b/src/librustc_typeck/check/mod.rs @@ -3419,7 +3419,8 @@ fn check_expr_with_unifier<'a, 'tcx, F>(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) { let tcx = fcx.ccx.tcx; let mut class_field_map = FnvHashMap::new(); @@ -3438,13 +3439,24 @@ fn check_expr_with_unifier<'a, 'tcx, F>(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_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>, 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_expr_with_unifier<'a, 'tcx, F>(fcx: &FnCtxt<'a, 'tcx>, 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 index 0000000000000..e3ced3028098b --- /dev/null +++ b/src/test/compile-fail/issue-19922.rs @@ -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 or the MIT license +// , 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` +}