| use std::io::Error; |
| use std::path::{Path, PathBuf}; |
| |
| use rustc_errors::codes::*; |
| use rustc_errors::{Diag, DiagCtxtHandle, Diagnostic, EmissionGuarantee, Level, msg}; |
| use rustc_macros::{Diagnostic, Subdiagnostic}; |
| use rustc_span::{Span, Symbol, sym}; |
| use rustc_target::spec::{PanicStrategy, TargetTuple}; |
| |
| use crate::locator::CrateFlavor; |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "crate `{$crate_name}` required to be available in rlib format, but was not found in this form" |
| )] |
| pub struct RlibRequired { |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "crate `{$crate_name}` required to be available in {$kind} format, but was not found in this form" |
| )] |
| pub struct LibRequired<'a> { |
| pub crate_name: Symbol, |
| pub kind: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "crate `{$crate_name}` required to be available in {$kind} format, but was not found in this form" |
| )] |
| #[help("try adding `extern crate rustc_driver;` at the top level of this crate")] |
| pub struct RustcLibRequired<'a> { |
| pub crate_name: Symbol, |
| pub kind: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("cannot satisfy dependencies so `{$crate_name}` only shows up once")] |
| #[help("having upstream crates all available in one format will likely make this go away")] |
| pub struct CrateDepMultiple { |
| pub crate_name: Symbol, |
| #[subdiagnostic] |
| pub non_static_deps: Vec<NonStaticCrateDep>, |
| #[help("`feature(rustc_private)` is needed to link to the compiler's `rustc_driver` library")] |
| pub rustc_driver_help: bool, |
| } |
| |
| #[derive(Subdiagnostic)] |
| #[note("`{$crate_name}` was unavailable as a static crate, preventing fully static linking")] |
| pub struct NonStaticCrateDep { |
| /// It's different from `crate_name` in main Diagnostic. |
| pub crate_name_: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("cannot link together two panic runtimes: {$prev_name} and {$cur_name}")] |
| pub struct TwoPanicRuntimes { |
| pub prev_name: Symbol, |
| pub cur_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the linked panic runtime `{$runtime}` is not compiled with this crate's panic strategy `{$strategy}`" |
| )] |
| pub struct BadPanicStrategy { |
| pub runtime: Symbol, |
| pub strategy: PanicStrategy, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the crate `{$crate_name}` requires panic strategy `{$found_strategy}` which is incompatible with this crate's strategy of `{$desired_strategy}`" |
| )] |
| pub struct RequiredPanicStrategy { |
| pub crate_name: Symbol, |
| pub found_strategy: PanicStrategy, |
| pub desired_strategy: PanicStrategy, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the crate `{$crate_name}` was compiled with a panic strategy which is incompatible with `immediate-abort`" |
| )] |
| pub struct IncompatibleWithImmediateAbort { |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the crate `core` was compiled with a panic strategy which is incompatible with `immediate-abort`" |
| )] |
| pub struct IncompatibleWithImmediateAbortCore; |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the crate `{$crate_name}` is compiled with the panic-in-drop strategy `{$found_strategy}` which is incompatible with this crate's strategy of `{$desired_strategy}`" |
| )] |
| pub struct IncompatiblePanicInDropStrategy { |
| pub crate_name: Symbol, |
| pub found_strategy: PanicStrategy, |
| pub desired_strategy: PanicStrategy, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("`#[link_ordinal]` is only supported if link kind is `raw-dylib`")] |
| pub struct LinkOrdinalRawDylib { |
| #[primary_span] |
| pub span: Span, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("library kind `framework` is only supported on Apple targets")] |
| pub struct LibFrameworkApple; |
| |
| #[derive(Diagnostic)] |
| #[diag("an empty renaming target was specified for library `{$lib_name}`")] |
| pub struct EmptyRenamingTarget<'a> { |
| pub lib_name: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "renaming of the library `{$lib_name}` was specified, however this crate contains no `#[link(...)]` attributes referencing this library" |
| )] |
| pub struct RenamingNoLink<'a> { |
| pub lib_name: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("multiple renamings were specified for library `{$lib_name}`")] |
| pub struct MultipleRenamings<'a> { |
| pub lib_name: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("overriding linking modifiers from command line is not supported")] |
| pub struct NoLinkModOverride { |
| #[primary_span] |
| pub span: Option<Span>, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("ABI not supported by `#[link(kind = \"raw-dylib\")]` on this architecture")] |
| pub struct RawDylibUnsupportedAbi { |
| #[primary_span] |
| pub span: Span, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("failed to create file encoder: {$err}")] |
| pub struct FailCreateFileEncoder { |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("failed to write to `{$path}`: {$err}")] |
| pub struct FailWriteFile<'a> { |
| pub path: &'a Path, |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("the crate `{$crate_name}` is not a panic runtime")] |
| pub struct CrateNotPanicRuntime { |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the crate `{$crate_name}` resolved as `compiler_builtins` but is not `#![compiler_builtins]`" |
| )] |
| pub struct CrateNotCompilerBuiltins { |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("the crate `{$crate_name}` does not have the panic strategy `{$strategy}`")] |
| pub struct NoPanicStrategy { |
| pub crate_name: Symbol, |
| pub strategy: PanicStrategy, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("the crate `{$crate_name}` is not a profiler runtime")] |
| pub struct NotProfilerRuntime { |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("cannot define multiple global allocators")] |
| pub struct NoMultipleGlobalAlloc { |
| #[primary_span] |
| #[label("cannot define a new global allocator")] |
| pub span2: Span, |
| #[label("previous global allocator defined here")] |
| pub span1: Span, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("cannot define multiple allocation error handlers")] |
| pub struct NoMultipleAllocErrorHandler { |
| #[primary_span] |
| #[label("cannot define a new allocation error handler")] |
| pub span2: Span, |
| #[label("previous allocation error handler defined here")] |
| pub span1: Span, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the `#[global_allocator]` in {$other_crate_name} conflicts with global allocator in: {$crate_name}" |
| )] |
| pub struct ConflictingGlobalAlloc { |
| pub crate_name: Symbol, |
| pub other_crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the `#[alloc_error_handler]` in {$other_crate_name} conflicts with allocation error handler in: {$crate_name}" |
| )] |
| pub struct ConflictingAllocErrorHandler { |
| pub crate_name: Symbol, |
| pub other_crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "no global memory allocator found but one is required; link to std or add `#[global_allocator]` to a static item that implements the GlobalAlloc trait" |
| )] |
| pub struct GlobalAllocRequired; |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "the crate `{$crate_name}` cannot depend on a crate that needs {$needs_crate_name}, but it depends on `{$deps_crate_name}`" |
| )] |
| pub struct NoTransitiveNeedsDep<'a> { |
| pub crate_name: Symbol, |
| pub needs_crate_name: &'a str, |
| pub deps_crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("failed to write {$filename}: {$err}")] |
| pub struct FailedWriteError { |
| pub filename: PathBuf, |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("failed to copy {$filename} to stdout: {$err}")] |
| pub struct FailedCopyToStdout { |
| pub filename: PathBuf, |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "option `-o` or `--emit` is used to write binary output type `metadata` to stdout, but stdout is a tty" |
| )] |
| pub struct BinaryOutputToTty; |
| |
| #[derive(Diagnostic)] |
| #[diag("could not find native static library `{$libname}`, perhaps an -L flag is missing?")] |
| pub struct MissingNativeLibrary<'a> { |
| libname: &'a str, |
| #[subdiagnostic] |
| suggest_name: Option<SuggestLibraryName<'a>>, |
| } |
| |
| impl<'a> MissingNativeLibrary<'a> { |
| pub fn new(libname: &'a str, verbatim: bool) -> Self { |
| // if it looks like the user has provided a complete filename rather just the bare lib name, |
| // then provide a note that they might want to try trimming the name |
| let suggested_name = if !verbatim { |
| if let Some(libname) = libname.strip_circumfix("lib", ".a") { |
| // this is a unix style filename so trim prefix & suffix |
| Some(libname) |
| } else if let Some(libname) = libname.strip_suffix(".lib") { |
| // this is a Windows style filename so just trim the suffix |
| Some(libname) |
| } else { |
| None |
| } |
| } else { |
| None |
| }; |
| |
| Self { |
| libname, |
| suggest_name: suggested_name |
| .map(|suggested_name| SuggestLibraryName { suggested_name }), |
| } |
| } |
| } |
| |
| #[derive(Subdiagnostic)] |
| #[help("only provide the library name `{$suggested_name}`, not the full filename")] |
| pub struct SuggestLibraryName<'a> { |
| suggested_name: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("couldn't create a temp dir: {$err}")] |
| pub struct FailedCreateTempdir { |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("failed to create the file {$filename}: {$err}")] |
| pub struct FailedCreateFile<'a> { |
| pub filename: &'a Path, |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("failed to create encoded metadata from file: {$err}")] |
| pub struct FailedCreateEncodedMetadata { |
| pub err: Error, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("cannot load a crate with a non-ascii name `{$crate_name}`")] |
| pub struct NonAsciiName { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("extern location for {$crate_name} does not exist: {$location}")] |
| pub struct ExternLocationNotExist<'a> { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub location: &'a Path, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("extern location for {$crate_name} is not a file: {$location}")] |
| pub struct ExternLocationNotFile<'a> { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub location: &'a Path, |
| } |
| |
| pub(crate) struct MultipleCandidates { |
| pub span: Span, |
| pub flavor: CrateFlavor, |
| pub crate_name: Symbol, |
| pub candidates: Vec<PathBuf>, |
| } |
| |
| impl<G: EmissionGuarantee> Diagnostic<'_, G> for MultipleCandidates { |
| fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> { |
| let mut diag = Diag::new( |
| dcx, |
| level, |
| msg!("multiple candidates for `{$flavor}` dependency `{$crate_name}` found"), |
| ); |
| diag.arg("crate_name", self.crate_name); |
| diag.arg("flavor", self.flavor); |
| diag.code(E0464); |
| diag.span(self.span); |
| for (i, candidate) in self.candidates.iter().enumerate() { |
| diag.note(format!("candidate #{}: {}", i + 1, candidate.display())); |
| } |
| diag |
| } |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "only metadata stub found for `{$flavor}` dependency `{$crate_name}` please provide path to the corresponding .rmeta file with full metadata" |
| )] |
| pub(crate) struct FullMetadataNotFound { |
| #[primary_span] |
| pub span: Span, |
| pub flavor: CrateFlavor, |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("the current crate is indistinguishable from one of its dependencies: it has the same crate-name `{$crate_name}` and was compiled with the same `-C metadata` arguments, so this will result in symbol conflicts between the two", code = E0519)] |
| pub struct SymbolConflictsCurrent { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("found crates (`{$crate_name0}` and `{$crate_name1}`) with colliding StableCrateId values")] |
| pub struct StableCrateIdCollision { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name0: Symbol, |
| pub crate_name1: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("{$path}{$err}")] |
| pub struct DlError { |
| #[primary_span] |
| pub span: Span, |
| pub path: String, |
| pub err: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("found possibly newer version of crate `{$crate_name}`{$add_info}", code = E0460)] |
| #[note("perhaps that crate needs to be recompiled?")] |
| #[note("the following crate versions were found:{$found_crates}")] |
| pub struct NewerCrateVersion { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub add_info: String, |
| pub found_crates: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("couldn't find crate `{$crate_name}` with expected target triple {$locator_triple}{$add_info}", code = E0461)] |
| #[note("the following crate versions were found:{$found_crates}")] |
| pub struct NoCrateWithTriple<'a> { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub locator_triple: &'a str, |
| pub add_info: String, |
| pub found_crates: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("found staticlib `{$crate_name}` instead of rlib or dylib{$add_info}", code = E0462)] |
| #[note("the following crate versions were found:{$found_crates}")] |
| #[help("please recompile that crate using --crate-type lib")] |
| pub struct FoundStaticlib { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub add_info: String, |
| pub found_crates: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("found crate `{$crate_name}` compiled by an incompatible version of rustc{$add_info}", code = E0514)] |
| #[note("the following crate versions were found:{$found_crates}")] |
| #[help( |
| "please recompile that crate using this compiler ({$rustc_version}) (consider running `cargo clean` first)" |
| )] |
| pub struct IncompatibleRustc { |
| #[primary_span] |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub add_info: String, |
| pub found_crates: String, |
| pub rustc_version: String, |
| } |
| |
| pub struct InvalidMetadataFiles { |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub add_info: String, |
| pub crate_rejections: Vec<String>, |
| } |
| |
| impl<G: EmissionGuarantee> Diagnostic<'_, G> for InvalidMetadataFiles { |
| #[track_caller] |
| fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> { |
| let mut diag = Diag::new( |
| dcx, |
| level, |
| msg!("found invalid metadata files for crate `{$crate_name}`{$add_info}"), |
| ); |
| diag.arg("crate_name", self.crate_name); |
| diag.arg("add_info", self.add_info); |
| diag.code(E0786); |
| diag.span(self.span); |
| for crate_rejection in self.crate_rejections { |
| diag.note(crate_rejection); |
| } |
| diag |
| } |
| } |
| |
| pub struct CannotFindCrate { |
| pub span: Span, |
| pub crate_name: Symbol, |
| pub add_info: String, |
| pub missing_core: bool, |
| pub current_crate: String, |
| pub is_nightly_build: bool, |
| pub profiler_runtime: Symbol, |
| pub locator_triple: TargetTuple, |
| pub is_ui_testing: bool, |
| pub is_tier_3: bool, |
| } |
| |
| impl<G: EmissionGuarantee> Diagnostic<'_, G> for CannotFindCrate { |
| #[track_caller] |
| fn into_diag(self, dcx: DiagCtxtHandle<'_>, level: Level) -> Diag<'_, G> { |
| let mut diag = |
| Diag::new(dcx, level, msg!("can't find crate for `{$crate_name}`{$add_info}")); |
| diag.arg("crate_name", self.crate_name); |
| diag.arg("current_crate", self.current_crate); |
| diag.arg("add_info", self.add_info); |
| diag.arg("locator_triple", self.locator_triple.tuple()); |
| diag.code(E0463); |
| diag.span(self.span); |
| if self.crate_name == sym::std || self.crate_name == sym::core { |
| if self.missing_core { |
| diag.note(msg!("the `{$locator_triple}` target may not be installed")); |
| } else { |
| diag.note(msg!( |
| "the `{$locator_triple}` target may not support the standard library" |
| )); |
| } |
| |
| let has_precompiled_std = !self.is_tier_3; |
| |
| if self.missing_core { |
| if env!("CFG_RELEASE_CHANNEL") == "dev" && !self.is_ui_testing { |
| // Note: Emits the nicer suggestion only for the dev channel. |
| diag.help(msg!("consider adding the standard library to the sysroot with `x build library --target {$locator_triple}`")); |
| } else if has_precompiled_std { |
| // NOTE: this suggests using rustup, even though the user may not have it installed. |
| // That's because they could choose to install it; or this may give them a hint which |
| // target they need to install from their distro. |
| diag.help(msg!( |
| "consider downloading the target with `rustup target add {$locator_triple}`" |
| )); |
| } |
| } |
| |
| // Suggest using #![no_std]. #[no_core] is unstable and not really supported anyway. |
| // NOTE: this is a dummy span if `extern crate std` was injected by the compiler. |
| // If it's not a dummy, that means someone added `extern crate std` explicitly and |
| // `#![no_std]` won't help. |
| if !self.missing_core && self.span.is_dummy() { |
| diag.note(msg!("`std` is required by `{$current_crate}` because it does not declare `#![no_std]`")); |
| } |
| // Recommend -Zbuild-std even on stable builds for Tier 3 targets because |
| // it's the recommended way to use the target, the user should switch to nightly. |
| if self.is_nightly_build || !has_precompiled_std { |
| diag.help(msg!("consider building the standard library from source with `cargo build -Zbuild-std`")); |
| } |
| } else if self.crate_name == self.profiler_runtime { |
| diag.note(msg!("the compiler may have been built without the profiler runtime")); |
| } else if self.crate_name.as_str().starts_with("rustc_") { |
| diag.help(msg!("maybe you need to install the missing components with: `rustup component add rust-src rustc-dev llvm-tools-preview`")); |
| } |
| diag.span_label(self.span, msg!("can't find crate")); |
| diag |
| } |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("extern location for {$crate_name} is of an unknown type: {$path}")] |
| pub struct CrateLocationUnknownType<'a> { |
| #[primary_span] |
| pub span: Span, |
| pub path: &'a Path, |
| pub crate_name: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("file name should be lib*.rlib or {$dll_prefix}*{$dll_suffix}")] |
| pub struct LibFilenameForm<'a> { |
| #[primary_span] |
| pub span: Span, |
| pub dll_prefix: &'a str, |
| pub dll_suffix: &'a str, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "older versions of the `wasm-bindgen` crate are incompatible with current versions of Rust; please update to `wasm-bindgen` v0.2.88" |
| )] |
| pub(crate) struct WasmCAbi { |
| #[primary_span] |
| pub span: Span, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("mixing `{$flag_name_prefixed}` will cause an ABI mismatch in crate `{$local_crate}`")] |
| #[help( |
| "the `{$flag_name_prefixed}` flag modifies the ABI so Rust crates compiled with different values of this flag cannot be used together safely" |
| )] |
| #[note( |
| "`{$flag_name_prefixed}={$local_value}` in this crate is incompatible with `{$flag_name_prefixed}={$extern_value}` in dependency `{$extern_crate}`" |
| )] |
| #[help( |
| "set `{$flag_name_prefixed}={$extern_value}` in this crate or `{$flag_name_prefixed}={$local_value}` in `{$extern_crate}`" |
| )] |
| #[help( |
| "if you are sure this will not cause problems, you may use `-Cunsafe-allow-abi-mismatch={$flag_name}` to silence this error" |
| )] |
| pub struct IncompatibleTargetModifiers { |
| #[primary_span] |
| pub span: Span, |
| pub extern_crate: Symbol, |
| pub local_crate: Symbol, |
| pub flag_name: String, |
| pub flag_name_prefixed: String, |
| pub local_value: String, |
| pub extern_value: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("mixing `{$flag_name_prefixed}` will cause an ABI mismatch in crate `{$local_crate}`")] |
| #[help( |
| "the `{$flag_name_prefixed}` flag modifies the ABI so Rust crates compiled with different values of this flag cannot be used together safely" |
| )] |
| #[note( |
| "unset `{$flag_name_prefixed}` in this crate is incompatible with `{$flag_name_prefixed}={$extern_value}` in dependency `{$extern_crate}`" |
| )] |
| #[help( |
| "set `{$flag_name_prefixed}={$extern_value}` in this crate or unset `{$flag_name_prefixed}` in `{$extern_crate}`" |
| )] |
| #[help( |
| "if you are sure this will not cause problems, you may use `-Cunsafe-allow-abi-mismatch={$flag_name}` to silence this error" |
| )] |
| pub struct IncompatibleTargetModifiersLMissed { |
| #[primary_span] |
| pub span: Span, |
| pub extern_crate: Symbol, |
| pub local_crate: Symbol, |
| pub flag_name: String, |
| pub flag_name_prefixed: String, |
| pub extern_value: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("mixing `{$flag_name_prefixed}` will cause an ABI mismatch in crate `{$local_crate}`")] |
| #[help( |
| "the `{$flag_name_prefixed}` flag modifies the ABI so Rust crates compiled with different values of this flag cannot be used together safely" |
| )] |
| #[note( |
| "`{$flag_name_prefixed}={$local_value}` in this crate is incompatible with unset `{$flag_name_prefixed}` in dependency `{$extern_crate}`" |
| )] |
| #[help( |
| "unset `{$flag_name_prefixed}` in this crate or set `{$flag_name_prefixed}={$local_value}` in `{$extern_crate}`" |
| )] |
| #[help( |
| "if you are sure this will not cause problems, you may use `-Cunsafe-allow-abi-mismatch={$flag_name}` to silence this error" |
| )] |
| pub struct IncompatibleTargetModifiersRMissed { |
| #[primary_span] |
| pub span: Span, |
| pub extern_crate: Symbol, |
| pub local_crate: Symbol, |
| pub flag_name: String, |
| pub flag_name_prefixed: String, |
| pub local_value: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "unknown target modifier `{$flag_name}`, requested by `-Cunsafe-allow-abi-mismatch={$flag_name}`" |
| )] |
| pub struct UnknownTargetModifierUnsafeAllowed { |
| #[primary_span] |
| pub span: Span, |
| pub flag_name: String, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag( |
| "found async drop types in dependency `{$extern_crate}`, but async_drop feature is disabled for `{$local_crate}`" |
| )] |
| #[help( |
| "if async drop type will be dropped in a crate without `feature(async_drop)`, sync Drop will be used" |
| )] |
| pub struct AsyncDropTypesInDependency { |
| #[primary_span] |
| pub span: Span, |
| pub extern_crate: Symbol, |
| pub local_crate: Symbol, |
| } |
| |
| #[derive(Diagnostic)] |
| #[diag("link name must be well-formed if link kind is `raw-dylib`")] |
| pub struct RawDylibMalformed { |
| #[primary_span] |
| pub span: Span, |
| } |