about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/librustc/middle/lang_items.rs27
-rw-r--r--src/test/compile-fail/duplicate_entry_error.rs6
2 files changed, 22 insertions, 11 deletions
diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs
index 6cbb90627ea..9c890c76aa0 100644
--- a/src/librustc/middle/lang_items.rs
+++ b/src/librustc/middle/lang_items.rs
@@ -32,7 +32,7 @@ use util::nodemap::FnvHashMap;
 
 use syntax::ast;
 use syntax::attr::AttrMetaMethods;
-use syntax::codemap::{DUMMY_SP, Span};
+use syntax::codemap::Span;
 use syntax::parse::token::InternedString;
 use rustc_front::intravisit::Visitor;
 use rustc_front::hir;
@@ -185,10 +185,21 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
         match self.items.items[item_index] {
             Some(original_def_id) if original_def_id != item_def_id => {
                 let cstore = &self.session.cstore;
-                span_err!(self.session, span, E0152,
-                          "duplicate entry for `{}`, first definition found in `{}`",
-                          LanguageItems::item_name(item_index),
-                          cstore.crate_name(item_def_id.krate));
+                let span = self.ast_map.span_if_local(original_def_id).unwrap_or(span);
+                let mut err = struct_span_err!(self.session,
+                                                span,
+                                                E0152,
+                                                "Duplicate lang item found: `{}`.",
+                                                LanguageItems::item_name(item_index));
+                if let Some(span) = self.ast_map.span_if_local(item_def_id) {
+                    span_note!(&mut err, span,
+                               "First defined here.");
+                } else {
+                    span_note!(&mut err, span,
+                               "First defined in crate `{}`.",
+                               cstore.crate_name(item_def_id.krate));
+                }
+                err.emit();
             }
             _ => {
                 // OK.
@@ -203,19 +214,19 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
         krate.visit_all_items(self);
     }
 
-    pub fn collect_external_language_items(&mut self) {
+    pub fn collect_external_language_items(&mut self, krate: &hir::Crate) {
         let cstore = &self.session.cstore;
         for cnum in cstore.crates() {
             for (index, item_index) in cstore.lang_items(cnum) {
                 let def_id = DefId { krate: cnum, index: index };
-                self.collect_item(item_index, def_id, DUMMY_SP);
+                self.collect_item(item_index, def_id, krate.span);
             }
         }
     }
 
     pub fn collect(&mut self, krate: &hir::Crate) {
         self.collect_local_language_items(krate);
-        self.collect_external_language_items();
+        self.collect_external_language_items(krate);
     }
 }
 
diff --git a/src/test/compile-fail/duplicate_entry_error.rs b/src/test/compile-fail/duplicate_entry_error.rs
index d39553a7267..0c649b1b412 100644
--- a/src/test/compile-fail/duplicate_entry_error.rs
+++ b/src/test/compile-fail/duplicate_entry_error.rs
@@ -8,14 +8,14 @@
 // option. This file may not be copied, modified, or distributed
 // except according to those terms.
 
-// Test for issue #31788
-
-// error-pattern: duplicate entry for `panic_fmt`, first definition found in `std`
+// Test for issue #31788 and E0152
 
 #![feature(lang_items)]
 
 #[lang = "panic_fmt"]
 fn panic_fmt() -> ! {
+//~^ ERROR: Duplicate lang item found: `panic_fmt`.
+//~| NOTE First defined in crate `std`.
     loop {}
 }