about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-01 04:37:59 -0700
committerbors <bors@rust-lang.org>2013-07-01 04:37:59 -0700
commit0bd67f68913288af7cb26cca796842e9c8514521 (patch)
treee48644744ed35e1da912c8fb62004ac3cdd1121a
parentd324014c6cd2919333c330b5ae49739f287540b6 (diff)
parent7bcde87d1baccc857f766d01444e3dd172d92226 (diff)
downloadrust-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.rs21
-rw-r--r--src/test/compile-fail/struct-fields-decl-dupe.rs17
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() {
+}