Skip to content

Commit 150ac06

Browse files
Provide more useful information for E0152
1 parent 095f5e7 commit 150ac06

File tree

2 files changed

+22
-11
lines changed

2 files changed

+22
-11
lines changed

src/librustc/middle/lang_items.rs

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use util::nodemap::FnvHashMap;
3232

3333
use syntax::ast;
3434
use syntax::attr::AttrMetaMethods;
35-
use syntax::codemap::{DUMMY_SP, Span};
35+
use syntax::codemap::Span;
3636
use syntax::parse::token::InternedString;
3737
use rustc_front::intravisit::Visitor;
3838
use rustc_front::hir;
@@ -185,10 +185,21 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
185185
match self.items.items[item_index] {
186186
Some(original_def_id) if original_def_id != item_def_id => {
187187
let cstore = &self.session.cstore;
188-
span_err!(self.session, span, E0152,
189-
"duplicate entry for `{}`, first definition found in `{}`",
190-
LanguageItems::item_name(item_index),
191-
cstore.crate_name(item_def_id.krate));
188+
let span = self.ast_map.span_if_local(original_def_id).unwrap_or(span);
189+
let mut err = struct_span_err!(self.session,
190+
span,
191+
E0152,
192+
"Duplicate lang item found: `{}`.",
193+
LanguageItems::item_name(item_index));
194+
if let Some(span) = self.ast_map.span_if_local(item_def_id) {
195+
span_note!(&mut err, span,
196+
"First defined here.");
197+
} else {
198+
span_note!(&mut err, span,
199+
"First defined in crate `{}`.",
200+
cstore.crate_name(item_def_id.krate));
201+
}
202+
err.emit();
192203
}
193204
_ => {
194205
// OK.
@@ -203,19 +214,19 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
203214
krate.visit_all_items(self);
204215
}
205216

206-
pub fn collect_external_language_items(&mut self) {
217+
pub fn collect_external_language_items(&mut self, krate: &hir::Crate) {
207218
let cstore = &self.session.cstore;
208219
for cnum in cstore.crates() {
209220
for (index, item_index) in cstore.lang_items(cnum) {
210221
let def_id = DefId { krate: cnum, index: index };
211-
self.collect_item(item_index, def_id, DUMMY_SP);
222+
self.collect_item(item_index, def_id, krate.span);
212223
}
213224
}
214225
}
215226

216227
pub fn collect(&mut self, krate: &hir::Crate) {
217228
self.collect_local_language_items(krate);
218-
self.collect_external_language_items();
229+
self.collect_external_language_items(krate);
219230
}
220231
}
221232

src/test/compile-fail/duplicate_entry_error.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,14 @@
88
// option. This file may not be copied, modified, or distributed
99
// except according to those terms.
1010

11-
// Test for issue #31788
12-
13-
// error-pattern: duplicate entry for `panic_fmt`, first definition found in `std`
11+
// Test for issue #31788 and E0152
1412

1513
#![feature(lang_items)]
1614

1715
#[lang = "panic_fmt"]
1816
fn panic_fmt() -> ! {
17+
//~^ ERROR: Duplicate lang item found: `panic_fmt`.
18+
//~| NOTE First defined in crate `std`.
1919
loop {}
2020
}
2121

0 commit comments

Comments
 (0)