From 7bcde87d1baccc857f766d01444e3dd172d92226 Mon Sep 17 00:00:00 2001 From: jihyun Date: Fri, 28 Jun 2013 09:27:56 +0900 Subject: [PATCH] Fixes #7377 --- src/librustc/middle/resolve.rs | 21 +++++++++++++++++++ .../compile-fail/struct-fields-decl-dupe.rs | 17 +++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 src/test/compile-fail/struct-fields-decl-dupe.rs diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index e06fd8f9717..78fb924452a 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -3886,6 +3886,27 @@ impl Resolver { generics: &Generics, fields: &[@struct_field], visitor: ResolveVisitor) { + let mut ident_map = HashMap::new::(); + for fields.iter().advance |&field| { + match field.node.kind { + named_field(ident, _) => { + match ident_map.find(&ident) { + Some(&prev_field) => { + let ident_str = self.session.str_of(ident); + self.session.span_err(field.span, + fmt!("field `%s` is already declared", ident_str)); + self.session.span_note(prev_field.span, + "Previously declared here"); + }, + None => { + ident_map.insert(ident, field); + } + } + } + _ => () + } + } + // If applicable, create a rib for the type parameters. do self.with_type_parameter_rib(HasTypeParameters (generics, id, 0, diff --git a/src/test/compile-fail/struct-fields-decl-dupe.rs b/src/test/compile-fail/struct-fields-decl-dupe.rs new file mode 100644 index 00000000000..78216d5f4af --- /dev/null +++ b/src/test/compile-fail/struct-fields-decl-dupe.rs @@ -0,0 +1,17 @@ +// Copyright 2013 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. + +struct BuildData { + foo: int, + foo: int, //~ ERROR field `foo` is already declared +} + +fn main() { +}