diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs index 6cbb90627eab..9c890c76aa08 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 d39553a7267e..0c649b1b4126 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 {} }