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.
This commit is contained in:
bors 2016-11-11 05:55:04 -08:00 committed by GitHub
commit ba2e892249
5 changed files with 14 additions and 13 deletions

View File

@ -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);
}
}

View File

@ -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 () {
}

View File

@ -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
}
}

View File

@ -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;

View File

@ -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() {}