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:
commit
ba2e892249
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 @@ 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() {}
|
||||
|
Loading…
Reference in New Issue
Block a user