diff --git a/src/librustc/diagnostics.rs b/src/librustc/diagnostics.rs index 92db527ef9803..f474f7d4585f9 100644 --- a/src/librustc/diagnostics.rs +++ b/src/librustc/diagnostics.rs @@ -1962,6 +1962,23 @@ each method; it is not possible to annotate the entire impl with an `#[inline]` attribute. "##, +E0522: r##" +The lang attribute is intended for marking special items that are built-in to +Rust itself. This includes special traits (like `Copy` and `Sized`) that affect +how the compiler behaves, as well as special functions that may be automatically +invoked (such as the handler for out-of-bounds accesses when indexing a slice). +Erroneous code example: + +```compile_fail +#![feature(lang_items)] + +#[lang = "cookie"] +fn cookie() -> ! { // error: definition of an unknown language item: `cookie` + loop {} +} +``` +"##, + } diff --git a/src/librustc/middle/lang_items.rs b/src/librustc/middle/lang_items.rs index c432095ff0697..b08c2d6054c89 100644 --- a/src/librustc/middle/lang_items.rs +++ b/src/librustc/middle/lang_items.rs @@ -158,6 +158,11 @@ impl<'a, 'v, 'tcx> Visitor<'v> for LanguageItemCollector<'a, 'tcx> { if let Some(item_index) = item_index { self.collect_item(item_index, self.ast_map.local_def_id(item.id)) + } else { + let span = self.ast_map.span(item.id); + span_err!(self.session, span, E0522, + "definition of an unknown language item: `{}`.", + &value[..]); } } }