diff options
| author | bors <bors@rust-lang.org> | 2013-07-01 04:37:59 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2013-07-01 04:37:59 -0700 |
| commit | 0bd67f68913288af7cb26cca796842e9c8514521 (patch) | |
| tree | e48644744ed35e1da912c8fb62004ac3cdd1121a | |
| parent | d324014c6cd2919333c330b5ae49739f287540b6 (diff) | |
| parent | 7bcde87d1baccc857f766d01444e3dd172d92226 (diff) | |
| download | rust-0bd67f68913288af7cb26cca796842e9c8514521.tar.gz rust-0bd67f68913288af7cb26cca796842e9c8514521.zip | |
auto merge of #7443 : yjh0502/rust/fix_field_dup, r=huonw
Check if there is duplicated field names in struct.
| -rw-r--r-- | src/librustc/middle/resolve.rs | 21 | ||||
| -rw-r--r-- | src/test/compile-fail/struct-fields-decl-dupe.rs | 17 |
2 files changed, 38 insertions, 0 deletions
diff --git a/src/librustc/middle/resolve.rs b/src/librustc/middle/resolve.rs index 06147894d44..0cbba6b1c36 100644 --- a/src/librustc/middle/resolve.rs +++ b/src/librustc/middle/resolve.rs @@ -3846,6 +3846,27 @@ impl Resolver { generics: &Generics, fields: &[@struct_field], visitor: ResolveVisitor) { + let mut ident_map = HashMap::new::<ast::ident, @struct_field>(); + 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 <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. + +struct BuildData { + foo: int, + foo: int, //~ ERROR field `foo` is already declared +} + +fn main() { +} |
