Skip to content

Commit 81e0323

Browse files
committed
Auto merge of #31957 - GuillaumeGomez:error_display, r=brson
Add error file for E0152 It completes #31818. However it is not complete yet: * test will need to be updated * the file name displayed is a bit too unclear. I'm not sure yet what's the "correct" file name to display. If anyone has an idea on this, it'd be very appreciated. r? @brson
2 parents 3af60f8 + 7ab9345 commit 81e0323

File tree

2 files changed

+23
-11
lines changed

2 files changed

+23
-11
lines changed

src/librustc/middle/lang_items.rs

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

3333
use syntax::ast;
3434
use syntax::attr::AttrMetaMethods;
35-
use syntax::codemap::{DUMMY_SP, Span};
3635
use syntax::parse::token::InternedString;
3736
use rustc_front::intravisit::Visitor;
3837
use rustc_front::hir;
@@ -158,7 +157,7 @@ impl<'a, 'v, 'tcx> Visitor<'v> for LanguageItemCollector<'a, 'tcx> {
158157
let item_index = self.item_refs.get(&value[..]).cloned();
159158

160159
if let Some(item_index) = item_index {
161-
self.collect_item(item_index, self.ast_map.local_def_id(item.id), item.span)
160+
self.collect_item(item_index, self.ast_map.local_def_id(item.id))
162161
}
163162
}
164163
}
@@ -180,15 +179,26 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
180179
}
181180

182181
pub fn collect_item(&mut self, item_index: usize,
183-
item_def_id: DefId, span: Span) {
182+
item_def_id: DefId) {
184183
// Check for duplicates.
185184
match self.items.items[item_index] {
186185
Some(original_def_id) if original_def_id != item_def_id => {
187186
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));
187+
let span = self.ast_map.span_if_local(item_def_id)
188+
.expect("we should have found local duplicate earlier");
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(original_def_id) {
195+
span_note!(&mut err, span,
196+
"first defined here.");
197+
} else {
198+
err.note(&format!("first defined in crate `{}`.",
199+
cstore.crate_name(original_def_id.krate)));
200+
}
201+
err.emit();
192202
}
193203
_ => {
194204
// OK.
@@ -205,17 +215,18 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
205215

206216
pub fn collect_external_language_items(&mut self) {
207217
let cstore = &self.session.cstore;
218+
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);
212223
}
213224
}
214225
}
215226

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

src/test/compile-fail/duplicate_entry_error.rs

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

11-
// Test for issue #31788
11+
// note-pattern: first defined in crate `std`.
1212

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

1515
#![feature(lang_items)]
1616

1717
#[lang = "panic_fmt"]
1818
fn panic_fmt() -> ! {
19+
//~^ ERROR: duplicate lang item found: `panic_fmt`.
1920
loop {}
2021
}
2122

0 commit comments

Comments
 (0)