]> git.lizzy.rs Git - rust.git/blob - compiler/rustc_metadata/src/errors.rs
Rollup merge of #101435 - JakobDegen:bitwidth-tests, r=wesleywiser
[rust.git] / compiler / rustc_metadata / src / errors.rs
1 use std::{
2     io::Error,
3     path::{Path, PathBuf},
4 };
5
6 use rustc_errors::{error_code, ErrorGuaranteed};
7 use rustc_macros::SessionDiagnostic;
8 use rustc_session::{config, SessionDiagnostic};
9 use rustc_span::{sym, Span, Symbol};
10 use rustc_target::spec::{PanicStrategy, TargetTriple};
11
12 use crate::locator::CrateFlavor;
13
14 #[derive(SessionDiagnostic)]
15 #[diag(metadata::rlib_required)]
16 pub struct RlibRequired {
17     pub crate_name: Symbol,
18 }
19
20 #[derive(SessionDiagnostic)]
21 #[diag(metadata::lib_required)]
22 pub struct LibRequired<'a> {
23     pub crate_name: Symbol,
24     pub kind: &'a str,
25 }
26
27 #[derive(SessionDiagnostic)]
28 #[diag(metadata::crate_dep_multiple)]
29 #[help]
30 pub struct CrateDepMultiple {
31     pub crate_name: Symbol,
32 }
33
34 #[derive(SessionDiagnostic)]
35 #[diag(metadata::two_panic_runtimes)]
36 pub struct TwoPanicRuntimes {
37     pub prev_name: Symbol,
38     pub cur_name: Symbol,
39 }
40
41 #[derive(SessionDiagnostic)]
42 #[diag(metadata::bad_panic_strategy)]
43 pub struct BadPanicStrategy {
44     pub runtime: Symbol,
45     pub strategy: PanicStrategy,
46 }
47
48 #[derive(SessionDiagnostic)]
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,
54 }
55
56 #[derive(SessionDiagnostic)]
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,
62 }
63
64 #[derive(SessionDiagnostic)]
65 #[diag(metadata::multiple_names_in_link)]
66 pub struct MultipleNamesInLink {
67     #[primary_span]
68     pub span: Span,
69 }
70
71 #[derive(SessionDiagnostic)]
72 #[diag(metadata::multiple_kinds_in_link)]
73 pub struct MultipleKindsInLink {
74     #[primary_span]
75     pub span: Span,
76 }
77
78 #[derive(SessionDiagnostic)]
79 #[diag(metadata::link_name_form)]
80 pub struct LinkNameForm {
81     #[primary_span]
82     pub span: Span,
83 }
84
85 #[derive(SessionDiagnostic)]
86 #[diag(metadata::link_kind_form)]
87 pub struct LinkKindForm {
88     #[primary_span]
89     pub span: Span,
90 }
91
92 #[derive(SessionDiagnostic)]
93 #[diag(metadata::link_modifiers_form)]
94 pub struct LinkModifiersForm {
95     #[primary_span]
96     pub span: Span,
97 }
98
99 #[derive(SessionDiagnostic)]
100 #[diag(metadata::link_cfg_form)]
101 pub struct LinkCfgForm {
102     #[primary_span]
103     pub span: Span,
104 }
105
106 #[derive(SessionDiagnostic)]
107 #[diag(metadata::wasm_import_form)]
108 pub struct WasmImportForm {
109     #[primary_span]
110     pub span: Span,
111 }
112
113 #[derive(SessionDiagnostic)]
114 #[diag(metadata::empty_link_name, code = "E0454")]
115 pub struct EmptyLinkName {
116     #[primary_span]
117     #[label]
118     pub span: Span,
119 }
120
121 #[derive(SessionDiagnostic)]
122 #[diag(metadata::link_framework_apple, code = "E0455")]
123 pub struct LinkFrameworkApple {
124     #[primary_span]
125     pub span: Span,
126 }
127
128 #[derive(SessionDiagnostic)]
129 #[diag(metadata::framework_only_windows, code = "E0455")]
130 pub struct FrameworkOnlyWindows {
131     #[primary_span]
132     pub span: Span,
133 }
134
135 #[derive(SessionDiagnostic)]
136 #[diag(metadata::unknown_link_kind, code = "E0458")]
137 pub struct UnknownLinkKind<'a> {
138     #[primary_span]
139     #[label]
140     pub span: Span,
141     pub kind: &'a str,
142 }
143
144 #[derive(SessionDiagnostic)]
145 #[diag(metadata::multiple_link_modifiers)]
146 pub struct MultipleLinkModifiers {
147     #[primary_span]
148     pub span: Span,
149 }
150
151 #[derive(SessionDiagnostic)]
152 #[diag(metadata::multiple_cfgs)]
153 pub struct MultipleCfgs {
154     #[primary_span]
155     pub span: Span,
156 }
157
158 #[derive(SessionDiagnostic)]
159 #[diag(metadata::link_cfg_single_predicate)]
160 pub struct LinkCfgSinglePredicate {
161     #[primary_span]
162     pub span: Span,
163 }
164
165 #[derive(SessionDiagnostic)]
166 #[diag(metadata::multiple_wasm_import)]
167 pub struct MultipleWasmImport {
168     #[primary_span]
169     pub span: Span,
170 }
171
172 #[derive(SessionDiagnostic)]
173 #[diag(metadata::unexpected_link_arg)]
174 pub struct UnexpectedLinkArg {
175     #[primary_span]
176     pub span: Span,
177 }
178
179 #[derive(SessionDiagnostic)]
180 #[diag(metadata::invalid_link_modifier)]
181 pub struct InvalidLinkModifier {
182     #[primary_span]
183     pub span: Span,
184 }
185
186 #[derive(SessionDiagnostic)]
187 #[diag(metadata::multiple_modifiers)]
188 pub struct MultipleModifiers<'a> {
189     #[primary_span]
190     pub span: Span,
191     pub modifier: &'a str,
192 }
193
194 #[derive(SessionDiagnostic)]
195 #[diag(metadata::bundle_needs_static)]
196 pub struct BundleNeedsStatic {
197     #[primary_span]
198     pub span: Span,
199 }
200
201 #[derive(SessionDiagnostic)]
202 #[diag(metadata::whole_archive_needs_static)]
203 pub struct WholeArchiveNeedsStatic {
204     #[primary_span]
205     pub span: Span,
206 }
207
208 #[derive(SessionDiagnostic)]
209 #[diag(metadata::as_needed_compatibility)]
210 pub struct AsNeededCompatibility {
211     #[primary_span]
212     pub span: Span,
213 }
214
215 #[derive(SessionDiagnostic)]
216 #[diag(metadata::unknown_link_modifier)]
217 pub struct UnknownLinkModifier<'a> {
218     #[primary_span]
219     pub span: Span,
220     pub modifier: &'a str,
221 }
222
223 #[derive(SessionDiagnostic)]
224 #[diag(metadata::incompatible_wasm_link)]
225 pub struct IncompatibleWasmLink {
226     #[primary_span]
227     pub span: Span,
228 }
229
230 #[derive(SessionDiagnostic)]
231 #[diag(metadata::link_requires_name, code = "E0459")]
232 pub struct LinkRequiresName {
233     #[primary_span]
234     #[label]
235     pub span: Span,
236 }
237
238 #[derive(SessionDiagnostic)]
239 #[diag(metadata::raw_dylib_no_nul)]
240 pub struct RawDylibNoNul {
241     #[primary_span]
242     pub span: Span,
243 }
244
245 #[derive(SessionDiagnostic)]
246 #[diag(metadata::link_ordinal_raw_dylib)]
247 pub struct LinkOrdinalRawDylib {
248     #[primary_span]
249     pub span: Span,
250 }
251
252 #[derive(SessionDiagnostic)]
253 #[diag(metadata::lib_framework_apple)]
254 pub struct LibFrameworkApple;
255
256 #[derive(SessionDiagnostic)]
257 #[diag(metadata::empty_renaming_target)]
258 pub struct EmptyRenamingTarget<'a> {
259     pub lib_name: &'a str,
260 }
261
262 #[derive(SessionDiagnostic)]
263 #[diag(metadata::renaming_no_link)]
264 pub struct RenamingNoLink<'a> {
265     pub lib_name: &'a str,
266 }
267
268 #[derive(SessionDiagnostic)]
269 #[diag(metadata::multiple_renamings)]
270 pub struct MultipleRenamings<'a> {
271     pub lib_name: &'a str,
272 }
273
274 #[derive(SessionDiagnostic)]
275 #[diag(metadata::no_link_mod_override)]
276 pub struct NoLinkModOverride {
277     #[primary_span]
278     pub span: Option<Span>,
279 }
280
281 #[derive(SessionDiagnostic)]
282 #[diag(metadata::unsupported_abi_i686)]
283 pub struct UnsupportedAbiI686 {
284     #[primary_span]
285     pub span: Span,
286 }
287
288 #[derive(SessionDiagnostic)]
289 #[diag(metadata::unsupported_abi)]
290 pub struct UnsupportedAbi {
291     #[primary_span]
292     pub span: Span,
293 }
294
295 #[derive(SessionDiagnostic)]
296 #[diag(metadata::fail_create_file_encoder)]
297 pub struct FailCreateFileEncoder {
298     pub err: Error,
299 }
300
301 #[derive(SessionDiagnostic)]
302 #[diag(metadata::fail_seek_file)]
303 pub struct FailSeekFile {
304     pub err: Error,
305 }
306
307 #[derive(SessionDiagnostic)]
308 #[diag(metadata::fail_write_file)]
309 pub struct FailWriteFile {
310     pub err: Error,
311 }
312
313 #[derive(SessionDiagnostic)]
314 #[diag(metadata::crate_not_panic_runtime)]
315 pub struct CrateNotPanicRuntime {
316     pub crate_name: Symbol,
317 }
318
319 #[derive(SessionDiagnostic)]
320 #[diag(metadata::no_panic_strategy)]
321 pub struct NoPanicStrategy {
322     pub crate_name: Symbol,
323     pub strategy: PanicStrategy,
324 }
325
326 #[derive(SessionDiagnostic)]
327 #[diag(metadata::profiler_builtins_needs_core)]
328 pub struct ProfilerBuiltinsNeedsCore;
329
330 #[derive(SessionDiagnostic)]
331 #[diag(metadata::not_profiler_runtime)]
332 pub struct NotProfilerRuntime {
333     pub crate_name: Symbol,
334 }
335
336 #[derive(SessionDiagnostic)]
337 #[diag(metadata::no_multiple_global_alloc)]
338 pub struct NoMultipleGlobalAlloc {
339     #[primary_span]
340     #[label]
341     pub span2: Span,
342     #[label(metadata::prev_global_alloc)]
343     pub span1: Span,
344 }
345
346 #[derive(SessionDiagnostic)]
347 #[diag(metadata::conflicting_global_alloc)]
348 pub struct ConflictingGlobalAlloc {
349     pub crate_name: Symbol,
350     pub other_crate_name: Symbol,
351 }
352
353 #[derive(SessionDiagnostic)]
354 #[diag(metadata::global_alloc_required)]
355 pub struct GlobalAllocRequired;
356
357 #[derive(SessionDiagnostic)]
358 #[diag(metadata::no_transitive_needs_dep)]
359 pub struct NoTransitiveNeedsDep<'a> {
360     pub crate_name: Symbol,
361     pub needs_crate_name: &'a str,
362     pub deps_crate_name: Symbol,
363 }
364
365 #[derive(SessionDiagnostic)]
366 #[diag(metadata::failed_write_error)]
367 pub struct FailedWriteError {
368     pub filename: PathBuf,
369     pub err: Error,
370 }
371
372 #[derive(SessionDiagnostic)]
373 #[diag(metadata::failed_create_tempdir)]
374 pub struct FailedCreateTempdir {
375     pub err: Error,
376 }
377
378 #[derive(SessionDiagnostic)]
379 #[diag(metadata::failed_create_file)]
380 pub struct FailedCreateFile<'a> {
381     pub filename: &'a Path,
382     pub err: Error,
383 }
384
385 #[derive(SessionDiagnostic)]
386 #[diag(metadata::failed_create_encoded_metadata)]
387 pub struct FailedCreateEncodedMetadata {
388     pub err: Error,
389 }
390
391 #[derive(SessionDiagnostic)]
392 #[diag(metadata::non_ascii_name)]
393 pub struct NonAsciiName {
394     #[primary_span]
395     pub span: Span,
396     pub crate_name: Symbol,
397 }
398
399 #[derive(SessionDiagnostic)]
400 #[diag(metadata::extern_location_not_exist)]
401 pub struct ExternLocationNotExist<'a> {
402     #[primary_span]
403     pub span: Span,
404     pub crate_name: Symbol,
405     pub location: &'a Path,
406 }
407
408 #[derive(SessionDiagnostic)]
409 #[diag(metadata::extern_location_not_file)]
410 pub struct ExternLocationNotFile<'a> {
411     #[primary_span]
412     pub span: Span,
413     pub crate_name: Symbol,
414     pub location: &'a Path,
415 }
416
417 pub(crate) struct MultipleCandidates {
418     pub span: Span,
419     pub flavor: CrateFlavor,
420     pub crate_name: Symbol,
421     pub candidates: Vec<PathBuf>,
422 }
423
424 impl SessionDiagnostic<'_> for MultipleCandidates {
425     fn into_diagnostic(
426         self,
427         handler: &'_ rustc_errors::Handler,
428     ) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
429         let mut diag = handler.struct_err(rustc_errors::fluent::metadata::multiple_candidates);
430         diag.set_arg("crate_name", self.crate_name);
431         diag.set_arg("flavor", self.flavor);
432         diag.code(error_code!(E0465));
433         diag.set_span(self.span);
434         for (i, candidate) in self.candidates.iter().enumerate() {
435             diag.span_note(self.span, &format!("candidate #{}: {}", i + 1, candidate.display()));
436         }
437         diag
438     }
439 }
440
441 #[derive(SessionDiagnostic)]
442 #[diag(metadata::multiple_matching_crates, code = "E0464")]
443 #[note]
444 pub struct MultipleMatchingCrates {
445     #[primary_span]
446     pub span: Span,
447     pub crate_name: Symbol,
448     pub candidates: String,
449 }
450
451 #[derive(SessionDiagnostic)]
452 #[diag(metadata::symbol_conflicts_current, code = "E0519")]
453 pub struct SymbolConflictsCurrent {
454     #[primary_span]
455     pub span: Span,
456     pub crate_name: Symbol,
457 }
458
459 #[derive(SessionDiagnostic)]
460 #[diag(metadata::symbol_conflicts_others, code = "E0523")]
461 pub struct SymbolConflictsOthers {
462     #[primary_span]
463     pub span: Span,
464     pub crate_name: Symbol,
465 }
466
467 #[derive(SessionDiagnostic)]
468 #[diag(metadata::stable_crate_id_collision)]
469 pub struct StableCrateIdCollision {
470     #[primary_span]
471     pub span: Span,
472     pub crate_name0: Symbol,
473     pub crate_name1: Symbol,
474 }
475
476 #[derive(SessionDiagnostic)]
477 #[diag(metadata::dl_error)]
478 pub struct DlError {
479     #[primary_span]
480     pub span: Span,
481     pub err: String,
482 }
483
484 #[derive(SessionDiagnostic)]
485 #[diag(metadata::newer_crate_version, code = "E0460")]
486 #[note]
487 #[note(metadata::found_crate_versions)]
488 pub struct NewerCrateVersion {
489     #[primary_span]
490     pub span: Span,
491     pub crate_name: Symbol,
492     pub add_info: String,
493     pub found_crates: String,
494 }
495
496 #[derive(SessionDiagnostic)]
497 #[diag(metadata::no_crate_with_triple, code = "E0461")]
498 #[note(metadata::found_crate_versions)]
499 pub struct NoCrateWithTriple<'a> {
500     #[primary_span]
501     pub span: Span,
502     pub crate_name: Symbol,
503     pub locator_triple: &'a str,
504     pub add_info: String,
505     pub found_crates: String,
506 }
507
508 #[derive(SessionDiagnostic)]
509 #[diag(metadata::found_staticlib, code = "E0462")]
510 #[note(metadata::found_crate_versions)]
511 #[help]
512 pub struct FoundStaticlib {
513     #[primary_span]
514     pub span: Span,
515     pub crate_name: Symbol,
516     pub add_info: String,
517     pub found_crates: String,
518 }
519
520 #[derive(SessionDiagnostic)]
521 #[diag(metadata::incompatible_rustc, code = "E0514")]
522 #[note(metadata::found_crate_versions)]
523 #[help]
524 pub struct IncompatibleRustc {
525     #[primary_span]
526     pub span: Span,
527     pub crate_name: Symbol,
528     pub add_info: String,
529     pub found_crates: String,
530     pub rustc_version: String,
531 }
532
533 pub struct InvalidMetadataFiles {
534     pub span: Span,
535     pub crate_name: Symbol,
536     pub add_info: String,
537     pub crate_rejections: Vec<String>,
538 }
539
540 impl SessionDiagnostic<'_> for InvalidMetadataFiles {
541     fn into_diagnostic(
542         self,
543         handler: &'_ rustc_errors::Handler,
544     ) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
545         let mut diag = handler.struct_err(rustc_errors::fluent::metadata::invalid_meta_files);
546         diag.set_arg("crate_name", self.crate_name);
547         diag.set_arg("add_info", self.add_info);
548         diag.code(error_code!(E0786));
549         diag.set_span(self.span);
550         for crate_rejection in self.crate_rejections {
551             diag.note(crate_rejection);
552         }
553         diag
554     }
555 }
556
557 pub struct CannotFindCrate {
558     pub span: Span,
559     pub crate_name: Symbol,
560     pub add_info: String,
561     pub missing_core: bool,
562     pub current_crate: String,
563     pub is_nightly_build: bool,
564     pub profiler_runtime: Symbol,
565     pub locator_triple: TargetTriple,
566 }
567
568 impl SessionDiagnostic<'_> for CannotFindCrate {
569     fn into_diagnostic(
570         self,
571         handler: &'_ rustc_errors::Handler,
572     ) -> rustc_errors::DiagnosticBuilder<'_, ErrorGuaranteed> {
573         let mut diag = handler.struct_err(rustc_errors::fluent::metadata::cannot_find_crate);
574         diag.set_arg("crate_name", self.crate_name);
575         diag.set_arg("add_info", self.add_info);
576         diag.set_arg("locator_triple", self.locator_triple.triple());
577         diag.code(error_code!(E0463));
578         diag.set_span(self.span);
579         if (self.crate_name == sym::std || self.crate_name == sym::core)
580             && self.locator_triple != TargetTriple::from_triple(config::host_triple())
581         {
582             if self.missing_core {
583                 diag.note(rustc_errors::fluent::metadata::target_not_installed);
584             } else {
585                 diag.note(rustc_errors::fluent::metadata::target_no_std_support);
586             }
587             // NOTE: this suggests using rustup, even though the user may not have it installed.
588             // That's because they could choose to install it; or this may give them a hint which
589             // target they need to install from their distro.
590             if self.missing_core {
591                 diag.help(rustc_errors::fluent::metadata::consider_downloading_target);
592             }
593             // Suggest using #![no_std]. #[no_core] is unstable and not really supported anyway.
594             // NOTE: this is a dummy span if `extern crate std` was injected by the compiler.
595             // If it's not a dummy, that means someone added `extern crate std` explicitly and
596             // `#![no_std]` won't help.
597             if !self.missing_core && self.span.is_dummy() {
598                 diag.note(rustc_errors::fluent::metadata::std_required);
599             }
600             if self.is_nightly_build {
601                 diag.help(rustc_errors::fluent::metadata::consider_building_std);
602             }
603         } else if self.crate_name == self.profiler_runtime {
604             diag.note(rustc_errors::fluent::metadata::compiler_missing_profiler);
605         } else if self.crate_name.as_str().starts_with("rustc_") {
606             diag.help(rustc_errors::fluent::metadata::install_missing_components);
607         }
608         diag.span_label(self.span, rustc_errors::fluent::metadata::cant_find_crate);
609         diag
610     }
611 }
612
613 #[derive(SessionDiagnostic)]
614 #[diag(metadata::no_dylib_plugin, code = "E0457")]
615 pub struct NoDylibPlugin {
616     #[primary_span]
617     pub span: Span,
618     pub crate_name: Symbol,
619 }
620
621 #[derive(SessionDiagnostic)]
622 #[diag(metadata::crate_location_unknown_type)]
623 pub struct CrateLocationUnknownType<'a> {
624     #[primary_span]
625     pub span: Span,
626     pub path: &'a Path,
627 }
628
629 #[derive(SessionDiagnostic)]
630 #[diag(metadata::lib_filename_form)]
631 pub struct LibFilenameForm<'a> {
632     #[primary_span]
633     pub span: Span,
634     pub dll_prefix: &'a str,
635     pub dll_suffix: &'a str,
636 }
637
638 #[derive(SessionDiagnostic)]
639 #[diag(metadata::multiple_import_name_type)]
640 pub struct MultipleImportNameType {
641     #[primary_span]
642     pub span: Span,
643 }
644
645 #[derive(SessionDiagnostic)]
646 #[diag(metadata::import_name_type_form)]
647 pub struct ImportNameTypeForm {
648     #[primary_span]
649     pub span: Span,
650 }
651
652 #[derive(SessionDiagnostic)]
653 #[diag(metadata::import_name_type_x86)]
654 pub struct ImportNameTypeX86 {
655     #[primary_span]
656     pub span: Span,
657 }
658
659 #[derive(SessionDiagnostic)]
660 #[diag(metadata::unknown_import_name_type)]
661 pub struct UnknownImportNameType<'a> {
662     #[primary_span]
663     pub span: Span,
664     pub import_name_type: &'a str,
665 }
666
667 #[derive(SessionDiagnostic)]
668 #[diag(metadata::import_name_type_raw)]
669 pub struct ImportNameTypeRaw {
670     #[primary_span]
671     pub span: Span,
672 }