Skip to content

Commit 7ab9345

Browse files
Improve error messages
1 parent 6aa3d0f commit 7ab9345

File tree

2 files changed

+18
-17
lines changed

2 files changed

+18
-17
lines changed

src/librustc/middle/lang_items.rs

Lines changed: 15 additions & 15 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::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,24 +179,24 @@ 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-
let span = self.ast_map.span_if_local(item_def_id).unwrap_or(span);
187+
let span = self.ast_map.span_if_local(item_def_id)
188+
.expect("we should have found local duplicate earlier");
189189
let mut err = struct_span_err!(self.session,
190-
span,
191-
E0152,
192-
"Duplicate lang item found: `{}`.",
193-
LanguageItems::item_name(item_index));
190+
span,
191+
E0152,
192+
"duplicate lang item found: `{}`.",
193+
LanguageItems::item_name(item_index));
194194
if let Some(span) = self.ast_map.span_if_local(original_def_id) {
195195
span_note!(&mut err, span,
196-
"First defined here.");
196+
"first defined here.");
197197
} else {
198-
span_note!(&mut err, span,
199-
"First defined in crate `{}`.",
200-
cstore.crate_name(original_def_id.krate));
198+
err.note(&format!("first defined in crate `{}`.",
199+
cstore.crate_name(original_def_id.krate)));
201200
}
202201
err.emit();
203202
}
@@ -214,18 +213,19 @@ impl<'a, 'tcx> LanguageItemCollector<'a, 'tcx> {
214213
krate.visit_all_items(self);
215214
}
216215

217-
pub fn collect_external_language_items(&mut self, krate: &hir::Crate) {
216+
pub fn collect_external_language_items(&mut self) {
218217
let cstore = &self.session.cstore;
218+
219219
for cnum in cstore.crates() {
220220
for (index, item_index) in cstore.lang_items(cnum) {
221221
let def_id = DefId { krate: cnum, index: index };
222-
self.collect_item(item_index, def_id, krate.span);
222+
self.collect_item(item_index, def_id);
223223
}
224224
}
225225
}
226226

227227
pub fn collect(&mut self, krate: &hir::Crate) {
228-
self.collect_external_language_items(krate);
228+
self.collect_external_language_items();
229229
self.collect_local_language_items(krate);
230230
}
231231
}

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+
// note-pattern: first defined in crate `std`.
12+
1113
// Test for issue #31788 and E0152
1214

1315
#![feature(lang_items)]
1416

1517
#[lang = "panic_fmt"]
1618
fn panic_fmt() -> ! {
17-
//~^ ERROR: Duplicate lang item found: `panic_fmt`.
18-
//~| NOTE First defined in crate `std`.
19+
//~^ ERROR: duplicate lang item found: `panic_fmt`.
1920
loop {}
2021
}
2122

0 commit comments

Comments
 (0)