about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-11-11 05:55:04 -0800
committerGitHub <noreply@github.com>2016-11-11 05:55:04 -0800
commitba2e892249d51cce0980e95e0b4daabb7710ad82 (patch)
treecccda5050f72382601cc98c141ab6e2b260dd813
parent4da129d98419733bb408141ca53610bb77368cf0 (diff)
parent43aed325aacfbe592fef2acffcf4f888155fb9bf (diff)
downloadrust-ba2e892249d51cce0980e95e0b4daabb7710ad82.tar.gz
rust-ba2e892249d51cce0980e95e0b4daabb7710ad82.zip
Auto merge of #37447 - estebank:non-duplicate-definition-error, r=nrc
Show one error for duplicated type definitions

For the following code:

``` rustc
struct Bar;
struct Bar;

fn main () {
}
```

show

``` nocode
error[E0428]: a type named `Bar` has already been defined in this module
  --> src/test/compile-fail/E0428.rs:12:1
   |
11 | struct Bar;
   | ----------- previous definition of `Bar` here
12 | struct Bar;
   | ^^^^^^^^^^^

error: aborting due to previous error
```

instead of

``` nocode
error[E0428]: a type named `Bar` has already been defined in this module
  --> src/test/compile-fail/E0428.rs:12:1
   |
11 | struct Bar;
   | ----------- previous definition of `Bar` here
12 | struct Bar;
   | ^^^^^^^^^^^

error[E0428]: a value named `Bar` has already been defined in this module
  --> src/test/compile-fail/E0428.rs:12:1
   |
11 | struct Bar;
   | ----------- previous definition of `Bar` here
12 | struct Bar;
   | ^^^^^^^^^^^

error: aborting due to 2 previous errors
```

Fixes #35767.
-rw-r--r--src/librustc_resolve/lib.rs14
-rw-r--r--src/test/compile-fail/E0428.rs3
-rw-r--r--src/test/compile-fail/blind-item-block-item-shadow.rs3
-rw-r--r--src/test/compile-fail/double-type-import.rs1
-rw-r--r--src/test/compile-fail/variant-namespacing.rs6
5 files changed, 14 insertions, 13 deletions
diff --git a/src/librustc_resolve/lib.rs b/src/librustc_resolve/lib.rs
index fe90cd34687..73b7b185b24 100644
--- a/src/librustc_resolve/lib.rs
+++ b/src/librustc_resolve/lib.rs
@@ -1118,6 +1118,9 @@ pub struct Resolver<'a> {
 
     // Maps the `Mark` of an expansion to its containing module or block.
     invocations: FxHashMap<Mark, &'a InvocationData<'a>>,
+
+    // Avoid duplicated errors for "name already defined".
+    name_already_seen: FxHashMap<Name, Span>,
 }
 
 pub struct ResolverArenas<'a> {
@@ -1310,6 +1313,7 @@ impl<'a> Resolver<'a> {
             macro_map: FxHashMap(),
             macro_exports: Vec::new(),
             invocations: invocations,
+            name_already_seen: FxHashMap(),
         }
     }
 
@@ -3396,7 +3400,7 @@ impl<'a> Resolver<'a> {
         }
     }
 
-    fn report_conflict(&self,
+    fn report_conflict(&mut self,
                        parent: Module,
                        name: Name,
                        ns: Namespace,
@@ -3420,6 +3424,13 @@ impl<'a> Resolver<'a> {
         };
 
         let span = binding.span;
+
+        if let Some(s) = self.name_already_seen.get(&name) {
+            if s == &span {
+                return;
+            }
+        }
+
         let msg = {
             let kind = match (ns, old_binding.module()) {
                 (ValueNS, _) => "a value",
@@ -3472,6 +3483,7 @@ impl<'a> Resolver<'a> {
             err.span_label(old_binding.span, &format!("previous {} of `{}` here", noun, name));
         }
         err.emit();
+        self.name_already_seen.insert(name, span);
     }
 }
 
diff --git a/src/test/compile-fail/E0428.rs b/src/test/compile-fail/E0428.rs
index 63b4efb73f0..f8502140c44 100644
--- a/src/test/compile-fail/E0428.rs
+++ b/src/test/compile-fail/E0428.rs
@@ -9,11 +9,8 @@
 // except according to those terms.
 
 struct Bar; //~ previous definition of `Bar` here
-            //~| previous definition of `Bar` here
 struct Bar; //~ ERROR E0428
             //~| NOTE already defined
-            //~| ERROR E0428
-            //~| NOTE already defined
 
 fn main () {
 }
diff --git a/src/test/compile-fail/blind-item-block-item-shadow.rs b/src/test/compile-fail/blind-item-block-item-shadow.rs
index 03af0d51ec2..a26b9e3c7aa 100644
--- a/src/test/compile-fail/blind-item-block-item-shadow.rs
+++ b/src/test/compile-fail/blind-item-block-item-shadow.rs
@@ -14,7 +14,6 @@ fn main() {
     {
         struct Bar;
         use foo::Bar;
-        //~^ ERROR a type named `Bar` has already been defined in this block
-        //~^^ ERROR a value named `Bar` has already been defined in this block
+        //~^ ERROR a value named `Bar` has already been defined in this block
     }
 }
diff --git a/src/test/compile-fail/double-type-import.rs b/src/test/compile-fail/double-type-import.rs
index 923f95e69d1..e51ef5e32e8 100644
--- a/src/test/compile-fail/double-type-import.rs
+++ b/src/test/compile-fail/double-type-import.rs
@@ -12,7 +12,6 @@ mod foo {
     pub use self::bar::X;
     use self::bar::X;
     //~^ ERROR a value named `X` has already been imported in this module
-    //~| ERROR a type named `X` has already been imported in this module
 
     mod bar {
         pub struct X;
diff --git a/src/test/compile-fail/variant-namespacing.rs b/src/test/compile-fail/variant-namespacing.rs
index a8bb94b78fc..3d8e2daaa15 100644
--- a/src/test/compile-fail/variant-namespacing.rs
+++ b/src/test/compile-fail/variant-namespacing.rs
@@ -33,17 +33,11 @@ const XUnit: u8 = 0;
 extern crate variant_namespacing;
 pub use variant_namespacing::XE::*;
 //~^ ERROR `XStruct` has already been defined
-//~| ERROR `XStruct` has already been defined
 //~| ERROR `XTuple` has already been defined
-//~| ERROR `XTuple` has already been defined
-//~| ERROR `XUnit` has already been defined
 //~| ERROR `XUnit` has already been defined
 pub use E::*;
 //~^ ERROR `Struct` has already been defined
-//~| ERROR `Struct` has already been defined
 //~| ERROR `Tuple` has already been defined
-//~| ERROR `Tuple` has already been defined
-//~| ERROR `Unit` has already been defined
 //~| ERROR `Unit` has already been defined
 
 fn main() {}