提交 43aed325 编写于 作者: E Esteban Küber

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
```
上级 da2ce227
......@@ -1081,6 +1081,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> {
......@@ -1270,6 +1273,7 @@ pub fn new(session: &'a Session,
builtin_macros: FxHashMap(),
lexical_macro_resolutions: Vec::new(),
invocations: invocations,
name_already_seen: FxHashMap(),
}
}
......@@ -3396,7 +3400,7 @@ fn report_shadowing_errors(&mut self) {
}
}
fn report_conflict(&self,
fn report_conflict(&mut self,
parent: Module,
name: Name,
ns: Namespace,
......@@ -3420,6 +3424,13 @@ fn report_conflict(&self,
};
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",
......@@ -3471,6 +3482,7 @@ fn report_conflict(&self,
err.span_label(old_binding.span, &format!("previous {} of `{}` here", noun, name));
}
err.emit();
self.name_already_seen.insert(name, span);
}
}
......
......@@ -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 () {
}
......@@ -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
}
}
......@@ -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;
......
......@@ -33,17 +33,11 @@ enum E {
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() {}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册