6 use rustc_errors::{error_code, ErrorGuaranteed, IntoDiagnostic};
7 use rustc_macros::Diagnostic;
8 use rustc_session::config;
9 use rustc_span::{sym, Span, Symbol};
10 use rustc_target::spec::{PanicStrategy, TargetTriple};
12 use crate::locator::CrateFlavor;
15 #[diag(metadata_rlib_required)]
16 pub struct RlibRequired {
17 pub crate_name: Symbol,
21 #[diag(metadata_lib_required)]
22 pub struct LibRequired<'a> {
23 pub crate_name: Symbol,
28 #[diag(metadata_crate_dep_multiple)]
30 pub struct CrateDepMultiple {
31 pub crate_name: Symbol,
35 #[diag(metadata_two_panic_runtimes)]
36 pub struct TwoPanicRuntimes {
37 pub prev_name: Symbol,
42 #[diag(metadata_bad_panic_strategy)]
43 pub struct BadPanicStrategy {
45 pub strategy: PanicStrategy,
49 #[diag(metadata_required_panic_strategy)]
50 pub struct RequiredPanicStrategy {
51 pub crate_name: Symbol,
52 pub found_strategy: PanicStrategy,
53 pub desired_strategy: PanicStrategy,
57 #[diag(metadata_incompatible_panic_in_drop_strategy)]
58 pub struct IncompatiblePanicInDropStrategy {
59 pub crate_name: Symbol,
60 pub found_strategy: PanicStrategy,
61 pub desired_strategy: PanicStrategy,
65 #[diag(metadata_multiple_names_in_link)]
66 pub struct MultipleNamesInLink {
72 #[diag(metadata_multiple_kinds_in_link)]
73 pub struct MultipleKindsInLink {
79 #[diag(metadata_link_name_form)]
80 pub struct LinkNameForm {
86 #[diag(metadata_link_kind_form)]
87 pub struct LinkKindForm {
93 #[diag(metadata_link_modifiers_form)]
94 pub struct LinkModifiersForm {
100 #[diag(metadata_link_cfg_form)]
101 pub struct LinkCfgForm {
106 #[derive(Diagnostic)]
107 #[diag(metadata_wasm_import_form)]
108 pub struct WasmImportForm {
113 #[derive(Diagnostic)]
114 #[diag(metadata_empty_link_name, code = "E0454")]
115 pub struct EmptyLinkName {
121 #[derive(Diagnostic)]
122 #[diag(metadata_link_framework_apple, code = "E0455")]
123 pub struct LinkFrameworkApple {
128 #[derive(Diagnostic)]
129 #[diag(metadata_framework_only_windows, code = "E0455")]
130 pub struct FrameworkOnlyWindows {
135 #[derive(Diagnostic)]
136 #[diag(metadata_unknown_link_kind, code = "E0458")]
137 pub struct UnknownLinkKind<'a> {
144 #[derive(Diagnostic)]
145 #[diag(metadata_multiple_link_modifiers)]
146 pub struct MultipleLinkModifiers {
151 #[derive(Diagnostic)]
152 #[diag(metadata_multiple_cfgs)]
153 pub struct MultipleCfgs {
158 #[derive(Diagnostic)]
159 #[diag(metadata_link_cfg_single_predicate)]
160 pub struct LinkCfgSinglePredicate {
165 #[derive(Diagnostic)]
166 #[diag(metadata_multiple_wasm_import)]
167 pub struct MultipleWasmImport {
172 #[derive(Diagnostic)]
173 #[diag(metadata_unexpected_link_arg)]
174 pub struct UnexpectedLinkArg {
179 #[derive(Diagnostic)]
180 #[diag(metadata_invalid_link_modifier)]
181 pub struct InvalidLinkModifier {
186 #[derive(Diagnostic)]
187 #[diag(metadata_multiple_modifiers)]
188 pub struct MultipleModifiers<'a> {
191 pub modifier: &'a str,
194 #[derive(Diagnostic)]
195 #[diag(metadata_bundle_needs_static)]
196 pub struct BundleNeedsStatic {
201 #[derive(Diagnostic)]
202 #[diag(metadata_whole_archive_needs_static)]
203 pub struct WholeArchiveNeedsStatic {
208 #[derive(Diagnostic)]
209 #[diag(metadata_as_needed_compatibility)]
210 pub struct AsNeededCompatibility {
215 #[derive(Diagnostic)]
216 #[diag(metadata_unknown_link_modifier)]
217 pub struct UnknownLinkModifier<'a> {
220 pub modifier: &'a str,
223 #[derive(Diagnostic)]
224 #[diag(metadata_incompatible_wasm_link)]
225 pub struct IncompatibleWasmLink {
230 #[derive(Diagnostic)]
231 #[diag(metadata_link_requires_name, code = "E0459")]
232 pub struct LinkRequiresName {
238 #[derive(Diagnostic)]
239 #[diag(metadata_raw_dylib_no_nul)]
240 pub struct RawDylibNoNul {
245 #[derive(Diagnostic)]
246 #[diag(metadata_link_ordinal_raw_dylib)]
247 pub struct LinkOrdinalRawDylib {
252 #[derive(Diagnostic)]
253 #[diag(metadata_lib_framework_apple)]
254 pub struct LibFrameworkApple;
256 #[derive(Diagnostic)]
257 #[diag(metadata_empty_renaming_target)]
258 pub struct EmptyRenamingTarget<'a> {
259 pub lib_name: &'a str,
262 #[derive(Diagnostic)]
263 #[diag(metadata_renaming_no_link)]
264 pub struct RenamingNoLink<'a> {
265 pub lib_name: &'a str,
268 #[derive(Diagnostic)]
269 #[diag(metadata_multiple_renamings)]
270 pub struct MultipleRenamings<'a> {
271 pub lib_name: &'a str,
274 #[derive(Diagnostic)]
275 #[diag(metadata_no_link_mod_override)]
276 pub struct NoLinkModOverride {
278 pub span: Option<Span>,
281 #[derive(Diagnostic)]
282 #[diag(metadata_unsupported_abi_i686)]
283 pub struct UnsupportedAbiI686 {
288 #[derive(Diagnostic)]
289 #[diag(metadata_unsupported_abi)]
290 pub struct UnsupportedAbi {
295 #[derive(Diagnostic)]
296 #[diag(metadata_fail_create_file_encoder)]
297 pub struct FailCreateFileEncoder {
301 #[derive(Diagnostic)]
302 #[diag(metadata_fail_seek_file)]
303 pub struct FailSeekFile {
307 #[derive(Diagnostic)]
308 #[diag(metadata_fail_write_file)]
309 pub struct FailWriteFile {
313 #[derive(Diagnostic)]
314 #[diag(metadata_crate_not_panic_runtime)]
315 pub struct CrateNotPanicRuntime {
316 pub crate_name: Symbol,
319 #[derive(Diagnostic)]
320 #[diag(metadata_no_panic_strategy)]
321 pub struct NoPanicStrategy {
322 pub crate_name: Symbol,
323 pub strategy: PanicStrategy,
326 #[derive(Diagnostic)]
327 #[diag(metadata_profiler_builtins_needs_core)]
328 pub struct ProfilerBuiltinsNeedsCore;
330 #[derive(Diagnostic)]
331 #[diag(metadata_not_profiler_runtime)]
332 pub struct NotProfilerRuntime {
333 pub crate_name: Symbol,
336 #[derive(Diagnostic)]
337 #[diag(metadata_no_multiple_global_alloc)]
338 pub struct NoMultipleGlobalAlloc {
342 #[label(metadata_prev_global_alloc)]
346 #[derive(Diagnostic)]
347 #[diag(metadata_no_multiple_alloc_error_handler)]
348 pub struct NoMultipleAllocErrorHandler {
352 #[label(metadata_prev_alloc_error_handler)]
356 #[derive(Diagnostic)]
357 #[diag(metadata_conflicting_global_alloc)]
358 pub struct ConflictingGlobalAlloc {
359 pub crate_name: Symbol,
360 pub other_crate_name: Symbol,
363 #[derive(Diagnostic)]
364 #[diag(metadata_conflicting_alloc_error_handler)]
365 pub struct ConflictingAllocErrorHandler {
366 pub crate_name: Symbol,
367 pub other_crate_name: Symbol,
370 #[derive(Diagnostic)]
371 #[diag(metadata_global_alloc_required)]
372 pub struct GlobalAllocRequired;
374 #[derive(Diagnostic)]
375 #[diag(metadata_no_transitive_needs_dep)]
376 pub struct NoTransitiveNeedsDep<'a> {
377 pub crate_name: Symbol,
378 pub needs_crate_name: &'a str,
379 pub deps_crate_name: Symbol,
382 #[derive(Diagnostic)]
383 #[diag(metadata_failed_write_error)]
384 pub struct FailedWriteError {
385 pub filename: PathBuf,
389 #[derive(Diagnostic)]
390 #[diag(metadata_missing_native_library)]
391 pub struct MissingNativeLibrary<'a> {
394 suggest_name: Option<SuggestLibraryName<'a>>,
397 impl<'a> MissingNativeLibrary<'a> {
398 pub fn new(libname: &'a str, verbatim: bool) -> Self {
399 // if it looks like the user has provided a complete filename rather just the bare lib name,
400 // then provide a note that they might want to try trimming the name
401 let suggested_name = if !verbatim {
402 if let Some(libname) = libname.strip_prefix("lib") && let Some(libname) = libname.strip_suffix(".a") {
403 // this is a unix style filename so trim prefix & suffix
405 } else if let Some(libname) = libname.strip_suffix(".lib") {
406 // this is a Windows style filename so just trim the suffix
417 suggest_name: suggested_name
418 .map(|suggested_name| SuggestLibraryName { suggested_name }),
423 #[derive(Subdiagnostic)]
424 #[help(metadata_only_provide_library_name)]
425 pub struct SuggestLibraryName<'a> {
426 suggested_name: &'a str,
429 #[derive(Diagnostic)]
430 #[diag(metadata_failed_create_tempdir)]
431 pub struct FailedCreateTempdir {
435 #[derive(Diagnostic)]
436 #[diag(metadata_failed_create_file)]
437 pub struct FailedCreateFile<'a> {
438 pub filename: &'a Path,
442 #[derive(Diagnostic)]
443 #[diag(metadata_failed_create_encoded_metadata)]
444 pub struct FailedCreateEncodedMetadata {
448 #[derive(Diagnostic)]
449 #[diag(metadata_non_ascii_name)]
450 pub struct NonAsciiName {
453 pub crate_name: Symbol,
456 #[derive(Diagnostic)]
457 #[diag(metadata_extern_location_not_exist)]
458 pub struct ExternLocationNotExist<'a> {
461 pub crate_name: Symbol,
462 pub location: &'a Path,
465 #[derive(Diagnostic)]
466 #[diag(metadata_extern_location_not_file)]
467 pub struct ExternLocationNotFile<'a> {
470 pub crate_name: Symbol,
471 pub location: &'a Path,
474 pub(crate) struct MultipleCandidates {
476 pub flavor: CrateFlavor,
477 pub crate_name: Symbol,
478 pub candidates: Vec<PathBuf>,
481 impl IntoDiagnostic<'_> for MultipleCandidates {
484 handler: &'_ rustc_errors::Handler,
485 ) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
486 let mut diag = handler.struct_err(rustc_errors::fluent::metadata_multiple_candidates);
487 diag.set_arg("crate_name", self.crate_name);
488 diag.set_arg("flavor", self.flavor);
489 diag.code(error_code!(E0465));
490 diag.set_span(self.span);
491 for (i, candidate) in self.candidates.iter().enumerate() {
492 diag.span_note(self.span, &format!("candidate #{}: {}", i + 1, candidate.display()));
498 #[derive(Diagnostic)]
499 #[diag(metadata_multiple_matching_crates, code = "E0464")]
501 pub struct MultipleMatchingCrates {
504 pub crate_name: Symbol,
505 pub candidates: String,
508 #[derive(Diagnostic)]
509 #[diag(metadata_symbol_conflicts_current, code = "E0519")]
510 pub struct SymbolConflictsCurrent {
513 pub crate_name: Symbol,
516 #[derive(Diagnostic)]
517 #[diag(metadata_symbol_conflicts_others, code = "E0523")]
518 pub struct SymbolConflictsOthers {
521 pub crate_name: Symbol,
524 #[derive(Diagnostic)]
525 #[diag(metadata_stable_crate_id_collision)]
526 pub struct StableCrateIdCollision {
529 pub crate_name0: Symbol,
530 pub crate_name1: Symbol,
533 #[derive(Diagnostic)]
534 #[diag(metadata_dl_error)]
541 #[derive(Diagnostic)]
542 #[diag(metadata_newer_crate_version, code = "E0460")]
544 #[note(metadata_found_crate_versions)]
545 pub struct NewerCrateVersion {
548 pub crate_name: Symbol,
549 pub add_info: String,
550 pub found_crates: String,
553 #[derive(Diagnostic)]
554 #[diag(metadata_no_crate_with_triple, code = "E0461")]
555 #[note(metadata_found_crate_versions)]
556 pub struct NoCrateWithTriple<'a> {
559 pub crate_name: Symbol,
560 pub locator_triple: &'a str,
561 pub add_info: String,
562 pub found_crates: String,
565 #[derive(Diagnostic)]
566 #[diag(metadata_found_staticlib, code = "E0462")]
567 #[note(metadata_found_crate_versions)]
569 pub struct FoundStaticlib {
572 pub crate_name: Symbol,
573 pub add_info: String,
574 pub found_crates: String,
577 #[derive(Diagnostic)]
578 #[diag(metadata_incompatible_rustc, code = "E0514")]
579 #[note(metadata_found_crate_versions)]
581 pub struct IncompatibleRustc {
584 pub crate_name: Symbol,
585 pub add_info: String,
586 pub found_crates: String,
587 pub rustc_version: String,
590 pub struct InvalidMetadataFiles {
592 pub crate_name: Symbol,
593 pub add_info: String,
594 pub crate_rejections: Vec<String>,
597 impl IntoDiagnostic<'_> for InvalidMetadataFiles {
601 handler: &'_ rustc_errors::Handler,
602 ) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
603 let mut diag = handler.struct_err(rustc_errors::fluent::metadata_invalid_meta_files);
604 diag.set_arg("crate_name", self.crate_name);
605 diag.set_arg("add_info", self.add_info);
606 diag.code(error_code!(E0786));
607 diag.set_span(self.span);
608 for crate_rejection in self.crate_rejections {
609 diag.note(crate_rejection);
615 pub struct CannotFindCrate {
617 pub crate_name: Symbol,
618 pub add_info: String,
619 pub missing_core: bool,
620 pub current_crate: String,
621 pub is_nightly_build: bool,
622 pub profiler_runtime: Symbol,
623 pub locator_triple: TargetTriple,
626 impl IntoDiagnostic<'_> for CannotFindCrate {
630 handler: &'_ rustc_errors::Handler,
631 ) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
632 let mut diag = handler.struct_err(rustc_errors::fluent::metadata_cannot_find_crate);
633 diag.set_arg("crate_name", self.crate_name);
634 diag.set_arg("current_crate", self.current_crate);
635 diag.set_arg("add_info", self.add_info);
636 diag.set_arg("locator_triple", self.locator_triple.triple());
637 diag.code(error_code!(E0463));
638 diag.set_span(self.span);
639 if (self.crate_name == sym::std || self.crate_name == sym::core)
640 && self.locator_triple != TargetTriple::from_triple(config::host_triple())
642 if self.missing_core {
643 diag.note(rustc_errors::fluent::metadata_target_not_installed);
645 diag.note(rustc_errors::fluent::metadata_target_no_std_support);
647 // NOTE: this suggests using rustup, even though the user may not have it installed.
648 // That's because they could choose to install it; or this may give them a hint which
649 // target they need to install from their distro.
650 if self.missing_core {
651 diag.help(rustc_errors::fluent::metadata_consider_downloading_target);
653 // Suggest using #![no_std]. #[no_core] is unstable and not really supported anyway.
654 // NOTE: this is a dummy span if `extern crate std` was injected by the compiler.
655 // If it's not a dummy, that means someone added `extern crate std` explicitly and
656 // `#![no_std]` won't help.
657 if !self.missing_core && self.span.is_dummy() {
658 diag.note(rustc_errors::fluent::metadata_std_required);
660 if self.is_nightly_build {
661 diag.help(rustc_errors::fluent::metadata_consider_building_std);
663 } else if self.crate_name == self.profiler_runtime {
664 diag.note(rustc_errors::fluent::metadata_compiler_missing_profiler);
665 } else if self.crate_name.as_str().starts_with("rustc_") {
666 diag.help(rustc_errors::fluent::metadata_install_missing_components);
668 diag.span_label(self.span, rustc_errors::fluent::metadata_cant_find_crate);
673 #[derive(Diagnostic)]
674 #[diag(metadata_no_dylib_plugin, code = "E0457")]
675 pub struct NoDylibPlugin {
678 pub crate_name: Symbol,
681 #[derive(Diagnostic)]
682 #[diag(metadata_crate_location_unknown_type)]
683 pub struct CrateLocationUnknownType<'a> {
687 pub crate_name: Symbol,
690 #[derive(Diagnostic)]
691 #[diag(metadata_lib_filename_form)]
692 pub struct LibFilenameForm<'a> {
695 pub dll_prefix: &'a str,
696 pub dll_suffix: &'a str,
699 #[derive(Diagnostic)]
700 #[diag(metadata_multiple_import_name_type)]
701 pub struct MultipleImportNameType {
706 #[derive(Diagnostic)]
707 #[diag(metadata_import_name_type_form)]
708 pub struct ImportNameTypeForm {
713 #[derive(Diagnostic)]
714 #[diag(metadata_import_name_type_x86)]
715 pub struct ImportNameTypeX86 {
720 #[derive(Diagnostic)]
721 #[diag(metadata_unknown_import_name_type)]
722 pub struct UnknownImportNameType<'a> {
725 pub import_name_type: &'a str,
728 #[derive(Diagnostic)]
729 #[diag(metadata_import_name_type_raw)]
730 pub struct ImportNameTypeRaw {