Stop mentioning internal lang items in no_std binary errors
When writing a no_std binary, you'll be greeted with nonsensical errors mentioning lang items like eh_personality and start. That's pretty bad because it makes you think that you need to define them somewhere! But oh no, now you're getting the `internal_features` lint telling you that you shouldn't use them! But you need a no_std binary! What now? No problem! Writing a no_std binary is super easy. Just use panic=abort and supply your own platform specific entrypoint symbol (like `main`) and you're good to go. Would be nice if the compiler told you that, right? This makes it so that it does do that.
This commit is contained in:
parent
a2d9d73e60
commit
da26317a8a
16 changed files with 85 additions and 16 deletions
|
@ -812,6 +812,12 @@ pub struct UnknownExternLangItem {
|
|||
#[diag(passes_missing_panic_handler)]
|
||||
pub struct MissingPanicHandler;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_panic_unwind_without_std)]
|
||||
#[help]
|
||||
#[note]
|
||||
pub struct PanicUnwindWithoutStd;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[diag(passes_missing_lang_item)]
|
||||
#[note]
|
||||
|
|
|
@ -9,7 +9,9 @@ use rustc_middle::middle::lang_items::required;
|
|||
use rustc_middle::ty::TyCtxt;
|
||||
use rustc_session::config::CrateType;
|
||||
|
||||
use crate::errors::{MissingLangItem, MissingPanicHandler, UnknownExternLangItem};
|
||||
use crate::errors::{
|
||||
MissingLangItem, MissingPanicHandler, PanicUnwindWithoutStd, UnknownExternLangItem,
|
||||
};
|
||||
|
||||
/// Checks the crate for usage of weak lang items, returning a vector of all the
|
||||
/// language items required by this crate, but not defined yet.
|
||||
|
@ -76,6 +78,8 @@ fn verify(tcx: TyCtxt<'_>, items: &lang_items::LanguageItems) {
|
|||
if missing.contains(&item) && required(tcx, item) && items.get(item).is_none() {
|
||||
if item == LangItem::PanicImpl {
|
||||
tcx.dcx().emit_err(MissingPanicHandler);
|
||||
} else if item == LangItem::EhPersonality {
|
||||
tcx.dcx().emit_err(PanicUnwindWithoutStd);
|
||||
} else {
|
||||
tcx.dcx().emit_err(MissingLangItem { name: item.name() });
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue