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.
|
// Maps the `Mark` of an expansion to its containing module or block.
|
||||||
invocations: FxHashMap<Mark, &'a InvocationData<'a>>,
|
invocations: FxHashMap<Mark, &'a InvocationData<'a>>,
|
||||||
|
|
||||||
|
// Avoid duplicated errors for "name already defined".
|
||||||
|
name_already_seen: FxHashMap<Name, Span>,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct ResolverArenas<'a> {
|
pub struct ResolverArenas<'a> {
|
||||||
@ -1310,6 +1313,7 @@ impl<'a> Resolver<'a> {
|
|||||||
macro_map: FxHashMap(),
|
macro_map: FxHashMap(),
|
||||||
macro_exports: Vec::new(),
|
macro_exports: Vec::new(),
|
||||||
invocations: invocations,
|
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,
|
parent: Module,
|
||||||
name: Name,
|
name: Name,
|
||||||
ns: Namespace,
|
ns: Namespace,
|
||||||
@ -3420,6 +3424,13 @@ impl<'a> Resolver<'a> {
|
|||||||
};
|
};
|
||||||
|
|
||||||
let span = binding.span;
|
let span = binding.span;
|
||||||
|
|
||||||
|
if let Some(s) = self.name_already_seen.get(&name) {
|
||||||
|
if s == &span {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let msg = {
|
let msg = {
|
||||||
let kind = match (ns, old_binding.module()) {
|
let kind = match (ns, old_binding.module()) {
|
||||||
(ValueNS, _) => "a value",
|
(ValueNS, _) => "a value",
|
||||||
@ -3472,6 +3483,7 @@ impl<'a> Resolver<'a> {
|
|||||||
err.span_label(old_binding.span, &format!("previous {} of `{}` here", noun, name));
|
err.span_label(old_binding.span, &format!("previous {} of `{}` here", noun, name));
|
||||||
}
|
}
|
||||||
err.emit();
|
err.emit();
|
||||||
|
self.name_already_seen.insert(name, span);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -9,11 +9,8 @@
|
|||||||
// except according to those terms.
|
// except according to those terms.
|
||||||
|
|
||||||
struct Bar; //~ previous definition of `Bar` here
|
struct Bar; //~ previous definition of `Bar` here
|
||||||
//~| previous definition of `Bar` here
|
|
||||||
struct Bar; //~ ERROR E0428
|
struct Bar; //~ ERROR E0428
|
||||||
//~| NOTE already defined
|
//~| NOTE already defined
|
||||||
//~| ERROR E0428
|
|
||||||
//~| NOTE already defined
|
|
||||||
|
|
||||||
fn main () {
|
fn main () {
|
||||||
}
|
}
|
||||||
|
@ -14,7 +14,6 @@ fn main() {
|
|||||||
{
|
{
|
||||||
struct Bar;
|
struct Bar;
|
||||||
use foo::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;
|
pub use self::bar::X;
|
||||||
use self::bar::X;
|
use self::bar::X;
|
||||||
//~^ ERROR a value named `X` has already been imported in this module
|
//~^ 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 {
|
mod bar {
|
||||||
pub struct X;
|
pub struct X;
|
||||||
|
@ -33,17 +33,11 @@ const XUnit: u8 = 0;
|
|||||||
extern crate variant_namespacing;
|
extern crate variant_namespacing;
|
||||||
pub use variant_namespacing::XE::*;
|
pub use variant_namespacing::XE::*;
|
||||||
//~^ ERROR `XStruct` has already been defined
|
//~^ 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 `XTuple` has already been defined
|
|
||||||
//~| ERROR `XUnit` has already been defined
|
|
||||||
//~| ERROR `XUnit` has already been defined
|
//~| ERROR `XUnit` has already been defined
|
||||||
pub use E::*;
|
pub use E::*;
|
||||||
//~^ ERROR `Struct` has already been defined
|
//~^ 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 `Tuple` has already been defined
|
|
||||||
//~| ERROR `Unit` has already been defined
|
|
||||||
//~| ERROR `Unit` has already been defined
|
//~| ERROR `Unit` has already been defined
|
||||||
|
|
||||||
fn main() {}
|
fn main() {}
|
||||||
|
Loading…
Reference in New Issue
Block a user