use rustc::hir::def_id::{CrateNum, DefId, LOCAL_CRATE};
use rustc::hir;
use rustc::hir::itemlikevisit::ItemLikeVisitor;
-use rustc::lint;
use rustc::traits::{self, Reveal};
use rustc::ty::{self, TyCtxt};
for &item2 in &impl_items2[..] {
if (name, namespace) == name_and_namespace(item2) {
- let msg = format!("duplicate definitions with name `{}`", name);
- let node_id = self.tcx.hir.as_local_node_id(item1).unwrap();
- self.tcx.sess.add_lint(lint::builtin::OVERLAPPING_INHERENT_IMPLS,
- node_id,
- self.tcx.span_of_impl(item1).unwrap(),
- msg);
+ struct_span_err!(self.tcx.sess,
+ self.tcx.span_of_impl(item1).unwrap(),
+ E0592,
+ "duplicate definitions with name `{}`",
+ name)
+ .span_label(self.tcx.span_of_impl(item1).unwrap(),
+ &format!("duplicate definitions for `{}`", name))
+ .span_label(self.tcx.span_of_impl(item2).unwrap(),
+ &format!("other definition for `{}`", name))
+ .emit();
}
}
}
+++ /dev/null
-// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-#![allow(dead_code)]
-
-trait C {}
-impl C { fn f() {} } //~ ERROR duplicate definitions with name `f`
-impl C { fn f() {} }
-fn main() { }
+++ /dev/null
-// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
-// file at the top-level directory of this distribution and at
-// http://rust-lang.org/COPYRIGHT.
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-// Test that you cannot define items with the same name in overlapping inherent
-// impl blocks.
-
-#![allow(unused)]
-
-struct Foo;
-
-impl Foo {
- fn id() {} //~ ERROR duplicate definitions
-}
-
-impl Foo {
- fn id() {}
-}
-
-struct Bar<T>(T);
-
-impl<T> Bar<T> {
- fn bar(&self) {} //~ ERROR duplicate definitions
-}
-
-impl Bar<u32> {
- fn bar(&self) {}
-}
-
-struct Baz<T>(T);
-
-impl<T: Copy> Baz<T> {
- fn baz(&self) {} //~ ERROR duplicate definitions
-}
-
-impl<T> Baz<Vec<T>> {
- fn baz(&self) {}
-}
-
-fn main() {}
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+#![allow(dead_code)]
+
+trait C {}
+impl C { fn f() {} }
+impl C { fn f() {} }
+fn main() { }
--- /dev/null
+error[E0592]: duplicate definitions with name `f`
+ --> $DIR/coherence-overlapping-inherent-impl-trait.rs:14:10
+ |
+14 | impl C { fn f() {} }
+ | ^^^^^^^^^ duplicate definitions for `f`
+15 | impl C { fn f() {} }
+ | --------- other definition for `f`
+
+error: aborting due to previous error
+
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// Test that you cannot define items with the same name in overlapping inherent
+// impl blocks.
+
+#![allow(unused)]
+
+struct Foo;
+
+impl Foo {
+ fn id() {}
+}
+
+impl Foo {
+ fn id() {}
+}
+
+struct Bar<T>(T);
+
+impl<T> Bar<T> {
+ fn bar(&self) {}
+}
+
+impl Bar<u32> {
+ fn bar(&self) {}
+}
+
+struct Baz<T>(T);
+
+impl<T: Copy> Baz<T> {
+ fn baz(&self) {}
+}
+
+impl<T> Baz<Vec<T>> {
+ fn baz(&self) {}
+}
+
+fn main() {}
--- /dev/null
+error[E0592]: duplicate definitions with name `id`
+ --> $DIR/overlapping_inherent_impls.rs:19:5
+ |
+19 | fn id() {}
+ | ^^^^^^^^^^ duplicate definitions for `id`
+...
+23 | fn id() {}
+ | ---------- other definition for `id`
+
+error[E0592]: duplicate definitions with name `bar`
+ --> $DIR/overlapping_inherent_impls.rs:29:5
+ |
+29 | fn bar(&self) {}
+ | ^^^^^^^^^^^^^^^^ duplicate definitions for `bar`
+...
+33 | fn bar(&self) {}
+ | ---------------- other definition for `bar`
+
+error[E0592]: duplicate definitions with name `baz`
+ --> $DIR/overlapping_inherent_impls.rs:39:5
+ |
+39 | fn baz(&self) {}
+ | ^^^^^^^^^^^^^^^^ duplicate definitions for `baz`
+...
+43 | fn baz(&self) {}
+ | ---------------- other definition for `baz`
+
+error: aborting due to 3 previous errors
+