rustc_resolve/
errors.rs

1use rustc_errors::codes::*;
2use rustc_errors::{
3    Applicability, Diag, ElidedLifetimeInPathSubdiag, EmissionGuarantee, IntoDiagArg, MultiSpan,
4    Subdiagnostic,
5};
6use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
7use rustc_span::{Ident, Span, Symbol};
8
9use crate::late::PatternSource;
10use crate::{Res, fluent_generated as fluent};
11
12#[derive(Diagnostic)]
13#[diag(resolve_generic_params_from_outer_item, code = E0401)]
14#[note]
15pub(crate) struct GenericParamsFromOuterItem {
16    #[primary_span]
17    #[label]
18    pub(crate) span: Span,
19    #[subdiagnostic]
20    pub(crate) label: Option<GenericParamsFromOuterItemLabel>,
21    #[subdiagnostic]
22    pub(crate) refer_to_type_directly: Option<UseTypeDirectly>,
23    #[subdiagnostic]
24    pub(crate) sugg: Option<GenericParamsFromOuterItemSugg>,
25    #[subdiagnostic]
26    pub(crate) static_or_const: Option<GenericParamsFromOuterItemStaticOrConst>,
27    pub(crate) is_self: bool,
28    #[subdiagnostic]
29    pub(crate) item: Option<GenericParamsFromOuterItemInnerItem>,
30}
31
32#[derive(Subdiagnostic)]
33#[label(resolve_generic_params_from_outer_item_inner_item)]
34pub(crate) struct GenericParamsFromOuterItemInnerItem {
35    #[primary_span]
36    pub(crate) span: Span,
37    pub(crate) descr: String,
38}
39
40#[derive(Subdiagnostic)]
41pub(crate) enum GenericParamsFromOuterItemStaticOrConst {
42    #[note(resolve_generic_params_from_outer_item_static)]
43    Static,
44    #[note(resolve_generic_params_from_outer_item_const)]
45    Const,
46}
47
48#[derive(Subdiagnostic)]
49pub(crate) enum GenericParamsFromOuterItemLabel {
50    #[label(resolve_generic_params_from_outer_item_self_ty_param)]
51    SelfTyParam(#[primary_span] Span),
52    #[label(resolve_generic_params_from_outer_item_self_ty_alias)]
53    SelfTyAlias(#[primary_span] Span),
54    #[label(resolve_generic_params_from_outer_item_ty_param)]
55    TyParam(#[primary_span] Span),
56    #[label(resolve_generic_params_from_outer_item_const_param)]
57    ConstParam(#[primary_span] Span),
58}
59
60#[derive(Subdiagnostic)]
61#[suggestion(
62    resolve_suggestion,
63    code = "{snippet}",
64    applicability = "maybe-incorrect",
65    style = "verbose"
66)]
67pub(crate) struct GenericParamsFromOuterItemSugg {
68    #[primary_span]
69    pub(crate) span: Span,
70    pub(crate) snippet: String,
71}
72#[derive(Subdiagnostic)]
73#[suggestion(
74    resolve_refer_to_type_directly,
75    code = "{snippet}",
76    applicability = "maybe-incorrect",
77    style = "verbose"
78)]
79pub(crate) struct UseTypeDirectly {
80    #[primary_span]
81    pub(crate) span: Span,
82    pub(crate) snippet: String,
83}
84
85#[derive(Diagnostic)]
86#[diag(resolve_name_is_already_used_as_generic_parameter, code = E0403)]
87pub(crate) struct NameAlreadyUsedInParameterList {
88    #[primary_span]
89    #[label]
90    pub(crate) span: Span,
91    #[label(resolve_first_use_of_name)]
92    pub(crate) first_use_span: Span,
93    pub(crate) name: Ident,
94}
95
96#[derive(Diagnostic)]
97#[diag(resolve_method_not_member_of_trait, code = E0407)]
98pub(crate) struct MethodNotMemberOfTrait {
99    #[primary_span]
100    #[label]
101    pub(crate) span: Span,
102    pub(crate) method: Ident,
103    pub(crate) trait_: String,
104    #[subdiagnostic]
105    pub(crate) sub: Option<AssociatedFnWithSimilarNameExists>,
106}
107
108#[derive(Subdiagnostic)]
109#[suggestion(
110    resolve_associated_fn_with_similar_name_exists,
111    code = "{candidate}",
112    applicability = "maybe-incorrect"
113)]
114pub(crate) struct AssociatedFnWithSimilarNameExists {
115    #[primary_span]
116    pub(crate) span: Span,
117    pub(crate) candidate: Symbol,
118}
119
120#[derive(Diagnostic)]
121#[diag(resolve_type_not_member_of_trait, code = E0437)]
122pub(crate) struct TypeNotMemberOfTrait {
123    #[primary_span]
124    #[label]
125    pub(crate) span: Span,
126    pub(crate) type_: Ident,
127    pub(crate) trait_: String,
128    #[subdiagnostic]
129    pub(crate) sub: Option<AssociatedTypeWithSimilarNameExists>,
130}
131
132#[derive(Subdiagnostic)]
133#[suggestion(
134    resolve_associated_type_with_similar_name_exists,
135    code = "{candidate}",
136    applicability = "maybe-incorrect"
137)]
138pub(crate) struct AssociatedTypeWithSimilarNameExists {
139    #[primary_span]
140    pub(crate) span: Span,
141    pub(crate) candidate: Symbol,
142}
143
144#[derive(Diagnostic)]
145#[diag(resolve_const_not_member_of_trait, code = E0438)]
146pub(crate) struct ConstNotMemberOfTrait {
147    #[primary_span]
148    #[label]
149    pub(crate) span: Span,
150    pub(crate) const_: Ident,
151    pub(crate) trait_: String,
152    #[subdiagnostic]
153    pub(crate) sub: Option<AssociatedConstWithSimilarNameExists>,
154}
155
156#[derive(Subdiagnostic)]
157#[suggestion(
158    resolve_associated_const_with_similar_name_exists,
159    code = "{candidate}",
160    applicability = "maybe-incorrect"
161)]
162pub(crate) struct AssociatedConstWithSimilarNameExists {
163    #[primary_span]
164    pub(crate) span: Span,
165    pub(crate) candidate: Symbol,
166}
167
168#[derive(Diagnostic)]
169#[diag(resolve_variable_bound_with_different_mode, code = E0409)]
170pub(crate) struct VariableBoundWithDifferentMode {
171    #[primary_span]
172    #[label]
173    pub(crate) span: Span,
174    #[label(resolve_first_binding_span)]
175    pub(crate) first_binding_span: Span,
176    pub(crate) variable_name: Ident,
177}
178
179#[derive(Diagnostic)]
180#[diag(resolve_ident_bound_more_than_once_in_parameter_list, code = E0415)]
181pub(crate) struct IdentifierBoundMoreThanOnceInParameterList {
182    #[primary_span]
183    #[label]
184    pub(crate) span: Span,
185    pub(crate) identifier: Ident,
186}
187
188#[derive(Diagnostic)]
189#[diag(resolve_ident_bound_more_than_once_in_same_pattern, code = E0416)]
190pub(crate) struct IdentifierBoundMoreThanOnceInSamePattern {
191    #[primary_span]
192    #[label]
193    pub(crate) span: Span,
194    pub(crate) identifier: Ident,
195}
196
197#[derive(Diagnostic)]
198#[diag(resolve_undeclared_label, code = E0426)]
199pub(crate) struct UndeclaredLabel {
200    #[primary_span]
201    #[label]
202    pub(crate) span: Span,
203    pub(crate) name: Symbol,
204    #[subdiagnostic]
205    pub(crate) sub_reachable: Option<LabelWithSimilarNameReachable>,
206    #[subdiagnostic]
207    pub(crate) sub_reachable_suggestion: Option<TryUsingSimilarlyNamedLabel>,
208    #[subdiagnostic]
209    pub(crate) sub_unreachable: Option<UnreachableLabelWithSimilarNameExists>,
210}
211
212#[derive(Subdiagnostic)]
213#[label(resolve_label_with_similar_name_reachable)]
214pub(crate) struct LabelWithSimilarNameReachable(#[primary_span] pub(crate) Span);
215
216#[derive(Subdiagnostic)]
217#[suggestion(
218    resolve_try_using_similarly_named_label,
219    code = "{ident_name}",
220    applicability = "maybe-incorrect"
221)]
222pub(crate) struct TryUsingSimilarlyNamedLabel {
223    #[primary_span]
224    pub(crate) span: Span,
225    pub(crate) ident_name: Symbol,
226}
227
228#[derive(Subdiagnostic)]
229#[label(resolve_unreachable_label_with_similar_name_exists)]
230pub(crate) struct UnreachableLabelWithSimilarNameExists {
231    #[primary_span]
232    pub(crate) ident_span: Span,
233}
234
235#[derive(Diagnostic)]
236#[diag(resolve_self_import_can_only_appear_once_in_the_list, code = E0430)]
237pub(crate) struct SelfImportCanOnlyAppearOnceInTheList {
238    #[primary_span]
239    #[label]
240    pub(crate) span: Span,
241}
242
243#[derive(Diagnostic)]
244#[diag(resolve_self_import_only_in_import_list_with_non_empty_prefix, code = E0431)]
245pub(crate) struct SelfImportOnlyInImportListWithNonEmptyPrefix {
246    #[primary_span]
247    #[label]
248    pub(crate) span: Span,
249}
250
251#[derive(Diagnostic)]
252#[diag(resolve_cannot_capture_dynamic_environment_in_fn_item, code = E0434)]
253#[help]
254pub(crate) struct CannotCaptureDynamicEnvironmentInFnItem {
255    #[primary_span]
256    pub(crate) span: Span,
257}
258
259#[derive(Diagnostic)]
260#[diag(resolve_attempt_to_use_non_constant_value_in_constant, code = E0435)]
261pub(crate) struct AttemptToUseNonConstantValueInConstant<'a> {
262    #[primary_span]
263    pub(crate) span: Span,
264    #[subdiagnostic]
265    pub(crate) with: Option<AttemptToUseNonConstantValueInConstantWithSuggestion<'a>>,
266    #[subdiagnostic]
267    pub(crate) with_label: Option<AttemptToUseNonConstantValueInConstantLabelWithSuggestion>,
268    #[subdiagnostic]
269    pub(crate) without: Option<AttemptToUseNonConstantValueInConstantWithoutSuggestion<'a>>,
270}
271
272#[derive(Subdiagnostic)]
273#[multipart_suggestion(
274    resolve_attempt_to_use_non_constant_value_in_constant_with_suggestion,
275    style = "verbose",
276    applicability = "has-placeholders"
277)]
278pub(crate) struct AttemptToUseNonConstantValueInConstantWithSuggestion<'a> {
279    // #[primary_span]
280    #[suggestion_part(code = "{suggestion} ")]
281    pub(crate) span: Span,
282    pub(crate) suggestion: &'a str,
283    #[suggestion_part(code = ": /* Type */")]
284    pub(crate) type_span: Option<Span>,
285    pub(crate) current: &'a str,
286}
287
288#[derive(Subdiagnostic)]
289#[label(resolve_attempt_to_use_non_constant_value_in_constant_label_with_suggestion)]
290pub(crate) struct AttemptToUseNonConstantValueInConstantLabelWithSuggestion {
291    #[primary_span]
292    pub(crate) span: Span,
293}
294
295#[derive(Subdiagnostic)]
296#[label(resolve_attempt_to_use_non_constant_value_in_constant_without_suggestion)]
297pub(crate) struct AttemptToUseNonConstantValueInConstantWithoutSuggestion<'a> {
298    #[primary_span]
299    pub(crate) ident_span: Span,
300    pub(crate) suggestion: &'a str,
301}
302
303#[derive(Diagnostic)]
304#[diag(resolve_self_imports_only_allowed_within, code = E0429)]
305pub(crate) struct SelfImportsOnlyAllowedWithin {
306    #[primary_span]
307    pub(crate) span: Span,
308    #[subdiagnostic]
309    pub(crate) suggestion: Option<SelfImportsOnlyAllowedWithinSuggestion>,
310    #[subdiagnostic]
311    pub(crate) mpart_suggestion: Option<SelfImportsOnlyAllowedWithinMultipartSuggestion>,
312}
313
314#[derive(Subdiagnostic)]
315#[suggestion(
316    resolve_self_imports_only_allowed_within_suggestion,
317    code = "",
318    applicability = "machine-applicable"
319)]
320pub(crate) struct SelfImportsOnlyAllowedWithinSuggestion {
321    #[primary_span]
322    pub(crate) span: Span,
323}
324
325#[derive(Subdiagnostic)]
326#[multipart_suggestion(
327    resolve_self_imports_only_allowed_within_multipart_suggestion,
328    applicability = "machine-applicable"
329)]
330pub(crate) struct SelfImportsOnlyAllowedWithinMultipartSuggestion {
331    #[suggestion_part(code = "{{")]
332    pub(crate) multipart_start: Span,
333    #[suggestion_part(code = "}}")]
334    pub(crate) multipart_end: Span,
335}
336
337#[derive(Diagnostic)]
338#[diag(resolve_binding_shadows_something_unacceptable, code = E0530)]
339pub(crate) struct BindingShadowsSomethingUnacceptable<'a> {
340    #[primary_span]
341    #[label]
342    pub(crate) span: Span,
343    pub(crate) shadowing_binding: PatternSource,
344    pub(crate) shadowed_binding: Res,
345    pub(crate) article: &'a str,
346    #[subdiagnostic]
347    pub(crate) sub_suggestion: Option<BindingShadowsSomethingUnacceptableSuggestion>,
348    #[label(resolve_label_shadowed_binding)]
349    pub(crate) shadowed_binding_span: Span,
350    pub(crate) participle: &'a str,
351    pub(crate) name: Symbol,
352}
353
354#[derive(Subdiagnostic)]
355#[suggestion(
356    resolve_binding_shadows_something_unacceptable_suggestion,
357    code = "{name}(..)",
358    applicability = "unspecified"
359)]
360pub(crate) struct BindingShadowsSomethingUnacceptableSuggestion {
361    #[primary_span]
362    pub(crate) span: Span,
363    pub(crate) name: Symbol,
364}
365
366#[derive(Diagnostic)]
367#[diag(resolve_forward_declared_generic_param, code = E0128)]
368pub(crate) struct ForwardDeclaredGenericParam {
369    #[primary_span]
370    #[label]
371    pub(crate) span: Span,
372    pub(crate) param: Symbol,
373}
374
375#[derive(Diagnostic)]
376#[diag(resolve_forward_declared_generic_in_const_param_ty)]
377pub(crate) struct ForwardDeclaredGenericInConstParamTy {
378    #[primary_span]
379    #[label]
380    pub(crate) span: Span,
381    pub(crate) param: Symbol,
382}
383
384#[derive(Diagnostic)]
385#[diag(resolve_param_in_ty_of_const_param, code = E0770)]
386pub(crate) struct ParamInTyOfConstParam {
387    #[primary_span]
388    #[label]
389    pub(crate) span: Span,
390    pub(crate) name: Symbol,
391}
392
393#[derive(Diagnostic)]
394#[diag(resolve_self_in_generic_param_default, code = E0735)]
395pub(crate) struct SelfInGenericParamDefault {
396    #[primary_span]
397    pub(crate) span: Span,
398}
399
400#[derive(Diagnostic)]
401#[diag(resolve_self_in_const_generic_ty)]
402pub(crate) struct SelfInConstGenericTy {
403    #[primary_span]
404    pub(crate) span: Span,
405}
406
407#[derive(Diagnostic)]
408#[diag(resolve_param_in_non_trivial_anon_const)]
409pub(crate) struct ParamInNonTrivialAnonConst {
410    #[primary_span]
411    #[label]
412    pub(crate) span: Span,
413    pub(crate) name: Symbol,
414    #[subdiagnostic]
415    pub(crate) param_kind: ParamKindInNonTrivialAnonConst,
416    #[subdiagnostic]
417    pub(crate) help: Option<ParamInNonTrivialAnonConstHelp>,
418}
419
420#[derive(Subdiagnostic)]
421#[help(resolve_param_in_non_trivial_anon_const_help)]
422pub(crate) struct ParamInNonTrivialAnonConstHelp;
423
424#[derive(Debug)]
425#[derive(Subdiagnostic)]
426pub(crate) enum ParamKindInNonTrivialAnonConst {
427    #[note(resolve_type_param_in_non_trivial_anon_const)]
428    Type,
429    #[help(resolve_const_param_in_non_trivial_anon_const)]
430    Const { name: Symbol },
431    #[note(resolve_lifetime_param_in_non_trivial_anon_const)]
432    Lifetime,
433}
434
435#[derive(Diagnostic)]
436#[diag(resolve_unreachable_label, code = E0767)]
437#[note]
438pub(crate) struct UnreachableLabel {
439    #[primary_span]
440    #[label]
441    pub(crate) span: Span,
442    pub(crate) name: Symbol,
443    #[label(resolve_label_definition_span)]
444    pub(crate) definition_span: Span,
445    #[subdiagnostic]
446    pub(crate) sub_suggestion: Option<UnreachableLabelSubSuggestion>,
447    #[subdiagnostic]
448    pub(crate) sub_suggestion_label: Option<UnreachableLabelSubLabel>,
449    #[subdiagnostic]
450    pub(crate) sub_unreachable_label: Option<UnreachableLabelSubLabelUnreachable>,
451}
452
453#[derive(Subdiagnostic)]
454#[suggestion(
455    resolve_unreachable_label_suggestion_use_similarly_named,
456    code = "{ident_name}",
457    applicability = "maybe-incorrect"
458)]
459pub(crate) struct UnreachableLabelSubSuggestion {
460    #[primary_span]
461    pub(crate) span: Span,
462    pub(crate) ident_name: Symbol,
463}
464
465#[derive(Subdiagnostic)]
466#[label(resolve_unreachable_label_similar_name_reachable)]
467pub(crate) struct UnreachableLabelSubLabel {
468    #[primary_span]
469    pub(crate) ident_span: Span,
470}
471
472#[derive(Subdiagnostic)]
473#[label(resolve_unreachable_label_similar_name_unreachable)]
474pub(crate) struct UnreachableLabelSubLabelUnreachable {
475    #[primary_span]
476    pub(crate) ident_span: Span,
477}
478
479#[derive(Diagnostic)]
480#[diag(resolve_invalid_asm_sym)]
481#[help]
482pub(crate) struct InvalidAsmSym {
483    #[primary_span]
484    #[label]
485    pub(crate) span: Span,
486}
487
488#[derive(Diagnostic)]
489#[diag(resolve_lowercase_self)]
490pub(crate) struct LowercaseSelf {
491    #[primary_span]
492    #[suggestion(code = "Self", applicability = "maybe-incorrect", style = "short")]
493    pub(crate) span: Span,
494}
495
496#[derive(Debug)]
497#[derive(Diagnostic)]
498#[diag(resolve_binding_in_never_pattern)]
499pub(crate) struct BindingInNeverPattern {
500    #[primary_span]
501    #[suggestion(code = "_", applicability = "machine-applicable", style = "short")]
502    pub(crate) span: Span,
503}
504
505#[derive(Diagnostic)]
506#[diag(resolve_trait_impl_duplicate, code = E0201)]
507pub(crate) struct TraitImplDuplicate {
508    #[primary_span]
509    #[label]
510    pub(crate) span: Span,
511    #[label(resolve_old_span_label)]
512    pub(crate) old_span: Span,
513    #[label(resolve_trait_item_span)]
514    pub(crate) trait_item_span: Span,
515    pub(crate) name: Ident,
516}
517
518#[derive(Diagnostic)]
519#[diag(resolve_relative_2018)]
520pub(crate) struct Relative2018 {
521    #[primary_span]
522    pub(crate) span: Span,
523    #[suggestion(code = "crate::{path_str}", applicability = "maybe-incorrect")]
524    pub(crate) path_span: Span,
525    pub(crate) path_str: String,
526}
527
528#[derive(Diagnostic)]
529#[diag(resolve_ancestor_only, code = E0742)]
530pub(crate) struct AncestorOnly(#[primary_span] pub(crate) Span);
531
532#[derive(Diagnostic)]
533#[diag(resolve_expected_module_found, code = E0577)]
534pub(crate) struct ExpectedModuleFound {
535    #[primary_span]
536    #[label]
537    pub(crate) span: Span,
538    pub(crate) res: Res,
539    pub(crate) path_str: String,
540}
541
542#[derive(Diagnostic)]
543#[diag(resolve_indeterminate, code = E0578)]
544pub(crate) struct Indeterminate(#[primary_span] pub(crate) Span);
545
546#[derive(Diagnostic)]
547#[diag(resolve_tool_module_imported)]
548pub(crate) struct ToolModuleImported {
549    #[primary_span]
550    pub(crate) span: Span,
551    #[note]
552    pub(crate) import: Span,
553}
554
555#[derive(Diagnostic)]
556#[diag(resolve_module_only)]
557pub(crate) struct ModuleOnly(#[primary_span] pub(crate) Span);
558
559#[derive(Diagnostic)]
560#[diag(resolve_macro_expected_found)]
561pub(crate) struct MacroExpectedFound<'a> {
562    #[primary_span]
563    #[label]
564    pub(crate) span: Span,
565    pub(crate) found: &'a str,
566    pub(crate) article: &'static str,
567    pub(crate) expected: &'a str,
568    pub(crate) macro_path: &'a str,
569    #[subdiagnostic]
570    pub(crate) remove_surrounding_derive: Option<RemoveSurroundingDerive>,
571    #[subdiagnostic]
572    pub(crate) add_as_non_derive: Option<AddAsNonDerive<'a>>,
573}
574
575#[derive(Subdiagnostic)]
576#[help(resolve_remove_surrounding_derive)]
577pub(crate) struct RemoveSurroundingDerive {
578    #[primary_span]
579    pub(crate) span: Span,
580}
581
582#[derive(Subdiagnostic)]
583#[help(resolve_add_as_non_derive)]
584pub(crate) struct AddAsNonDerive<'a> {
585    pub(crate) macro_path: &'a str,
586}
587
588#[derive(Diagnostic)]
589#[diag(resolve_proc_macro_same_crate)]
590pub(crate) struct ProcMacroSameCrate {
591    #[primary_span]
592    pub(crate) span: Span,
593    #[help]
594    pub(crate) is_test: bool,
595}
596
597#[derive(LintDiagnostic)]
598#[diag(resolve_proc_macro_derive_resolution_fallback)]
599pub(crate) struct ProcMacroDeriveResolutionFallback {
600    #[label]
601    pub span: Span,
602    pub ns_descr: &'static str,
603    pub ident: Ident,
604}
605
606#[derive(LintDiagnostic)]
607#[diag(resolve_macro_expanded_macro_exports_accessed_by_absolute_paths)]
608pub(crate) struct MacroExpandedMacroExportsAccessedByAbsolutePaths {
609    #[note]
610    pub definition: Span,
611}
612
613#[derive(Diagnostic)]
614#[diag(resolve_imported_crate)]
615pub(crate) struct CrateImported {
616    #[primary_span]
617    pub(crate) span: Span,
618}
619
620#[derive(Diagnostic)]
621#[diag(resolve_macro_use_extern_crate_self)]
622pub(crate) struct MacroUseExternCrateSelf {
623    #[primary_span]
624    pub(crate) span: Span,
625}
626
627#[derive(Diagnostic)]
628#[diag(resolve_accessible_unsure)]
629#[note]
630pub(crate) struct CfgAccessibleUnsure {
631    #[primary_span]
632    pub(crate) span: Span,
633}
634
635#[derive(Debug)]
636#[derive(Diagnostic)]
637#[diag(resolve_param_in_enum_discriminant)]
638pub(crate) struct ParamInEnumDiscriminant {
639    #[primary_span]
640    #[label]
641    pub(crate) span: Span,
642    pub(crate) name: Symbol,
643    #[subdiagnostic]
644    pub(crate) param_kind: ParamKindInEnumDiscriminant,
645}
646
647#[derive(Debug)]
648#[derive(Subdiagnostic)]
649pub(crate) enum ParamKindInEnumDiscriminant {
650    #[note(resolve_type_param_in_enum_discriminant)]
651    Type,
652    #[note(resolve_const_param_in_enum_discriminant)]
653    Const,
654    #[note(resolve_lifetime_param_in_enum_discriminant)]
655    Lifetime,
656}
657
658#[derive(Subdiagnostic)]
659#[label(resolve_change_import_binding)]
660pub(crate) struct ChangeImportBinding {
661    #[primary_span]
662    pub(crate) span: Span,
663}
664
665#[derive(Subdiagnostic)]
666#[suggestion(
667    resolve_change_import_binding,
668    code = "{suggestion}",
669    applicability = "maybe-incorrect"
670)]
671pub(crate) struct ChangeImportBindingSuggestion {
672    #[primary_span]
673    pub(crate) span: Span,
674    pub(crate) suggestion: String,
675}
676
677#[derive(Diagnostic)]
678#[diag(resolve_imports_cannot_refer_to)]
679pub(crate) struct ImportsCannotReferTo<'a> {
680    #[primary_span]
681    pub(crate) span: Span,
682    pub(crate) what: &'a str,
683}
684
685#[derive(Diagnostic)]
686#[diag(resolve_cannot_find_ident_in_this_scope)]
687pub(crate) struct CannotFindIdentInThisScope<'a> {
688    #[primary_span]
689    pub(crate) span: Span,
690    pub(crate) expected: &'a str,
691    pub(crate) ident: Ident,
692}
693
694#[derive(Subdiagnostic)]
695#[note(resolve_explicit_unsafe_traits)]
696pub(crate) struct ExplicitUnsafeTraits {
697    #[primary_span]
698    pub(crate) span: Span,
699    pub(crate) ident: Ident,
700}
701
702#[derive(Subdiagnostic)]
703#[note(resolve_macro_defined_later)]
704pub(crate) struct MacroDefinedLater {
705    #[primary_span]
706    pub(crate) span: Span,
707}
708
709#[derive(Subdiagnostic)]
710#[label(resolve_consider_move_macro_position)]
711pub(crate) struct MacroSuggMovePosition {
712    #[primary_span]
713    pub(crate) span: Span,
714    pub(crate) ident: Ident,
715}
716
717#[derive(Subdiagnostic)]
718pub(crate) enum MacroRulesNot {
719    #[label(resolve_macro_cannot_use_as_fn_like)]
720    Func {
721        #[primary_span]
722        span: Span,
723        ident: Ident,
724    },
725    #[label(resolve_macro_cannot_use_as_attr)]
726    Attr {
727        #[primary_span]
728        span: Span,
729        ident: Ident,
730    },
731    #[label(resolve_macro_cannot_use_as_derive)]
732    Derive {
733        #[primary_span]
734        span: Span,
735        ident: Ident,
736    },
737}
738
739#[derive(Subdiagnostic)]
740#[note(resolve_missing_macro_rules_name)]
741pub(crate) struct MaybeMissingMacroRulesName {
742    #[primary_span]
743    pub(crate) spans: MultiSpan,
744}
745
746#[derive(Subdiagnostic)]
747#[help(resolve_added_macro_use)]
748pub(crate) struct AddedMacroUse;
749
750#[derive(Subdiagnostic)]
751#[suggestion(
752    resolve_consider_adding_a_derive,
753    code = "{suggestion}",
754    applicability = "maybe-incorrect"
755)]
756pub(crate) struct ConsiderAddingADerive {
757    #[primary_span]
758    pub(crate) span: Span,
759    pub(crate) suggestion: String,
760}
761
762#[derive(Diagnostic)]
763#[diag(resolve_cannot_determine_import_resolution)]
764pub(crate) struct CannotDetermineImportResolution {
765    #[primary_span]
766    pub(crate) span: Span,
767}
768
769#[derive(Diagnostic)]
770#[diag(resolve_cannot_determine_macro_resolution)]
771#[note]
772pub(crate) struct CannotDetermineMacroResolution {
773    #[primary_span]
774    pub(crate) span: Span,
775    pub(crate) kind: &'static str,
776    pub(crate) path: String,
777}
778
779#[derive(Diagnostic)]
780#[diag(resolve_cannot_be_reexported_private, code = E0364)]
781pub(crate) struct CannotBeReexportedPrivate {
782    #[primary_span]
783    pub(crate) span: Span,
784    pub(crate) ident: Ident,
785}
786
787#[derive(Diagnostic)]
788#[diag(resolve_cannot_be_reexported_crate_public, code = E0364)]
789pub(crate) struct CannotBeReexportedCratePublic {
790    #[primary_span]
791    pub(crate) span: Span,
792    pub(crate) ident: Ident,
793}
794
795#[derive(Diagnostic)]
796#[diag(resolve_cannot_be_reexported_private, code = E0365)]
797#[note(resolve_consider_declaring_with_pub)]
798pub(crate) struct CannotBeReexportedPrivateNS {
799    #[primary_span]
800    #[label(resolve_reexport_of_private)]
801    pub(crate) span: Span,
802    pub(crate) ident: Ident,
803}
804
805#[derive(Diagnostic)]
806#[diag(resolve_cannot_be_reexported_crate_public, code = E0365)]
807#[note(resolve_consider_declaring_with_pub)]
808pub(crate) struct CannotBeReexportedCratePublicNS {
809    #[primary_span]
810    #[label(resolve_reexport_of_crate_public)]
811    pub(crate) span: Span,
812    pub(crate) ident: Ident,
813}
814
815#[derive(Subdiagnostic)]
816#[help(resolve_consider_adding_macro_export)]
817pub(crate) struct ConsiderAddingMacroExport {
818    #[primary_span]
819    pub(crate) span: Span,
820}
821
822#[derive(Subdiagnostic)]
823#[suggestion(
824    resolve_consider_marking_as_pub_crate,
825    code = "pub(crate)",
826    applicability = "maybe-incorrect"
827)]
828pub(crate) struct ConsiderMarkingAsPubCrate {
829    #[primary_span]
830    pub(crate) vis_span: Span,
831}
832
833#[derive(Subdiagnostic)]
834#[note(resolve_consider_marking_as_pub)]
835pub(crate) struct ConsiderMarkingAsPub {
836    #[primary_span]
837    pub(crate) span: Span,
838    pub(crate) ident: Ident,
839}
840
841#[derive(Diagnostic)]
842#[diag(resolve_cannot_glob_import_possible_crates)]
843pub(crate) struct CannotGlobImportAllCrates {
844    #[primary_span]
845    pub(crate) span: Span,
846}
847
848#[derive(Subdiagnostic)]
849#[suggestion(
850    resolve_unexpected_res_change_ty_to_const_param_sugg,
851    code = "const ",
852    style = "verbose"
853)]
854pub(crate) struct UnexpectedResChangeTyToConstParamSugg {
855    #[primary_span]
856    pub span: Span,
857    #[applicability]
858    pub applicability: Applicability,
859}
860
861#[derive(Subdiagnostic)]
862#[suggestion(
863    resolve_unexpected_res_use_at_op_in_slice_pat_with_range_sugg,
864    code = "{snippet}",
865    applicability = "maybe-incorrect",
866    style = "verbose"
867)]
868pub(crate) struct UnexpectedResUseAtOpInSlicePatWithRangeSugg {
869    #[primary_span]
870    pub span: Span,
871    pub ident: Ident,
872    pub snippet: String,
873}
874
875#[derive(Diagnostic)]
876#[diag(resolve_extern_crate_loading_macro_not_at_crate_root, code = E0468)]
877pub(crate) struct ExternCrateLoadingMacroNotAtCrateRoot {
878    #[primary_span]
879    pub(crate) span: Span,
880}
881
882#[derive(Diagnostic)]
883#[diag(resolve_extern_crate_self_requires_renaming)]
884pub(crate) struct ExternCrateSelfRequiresRenaming {
885    #[primary_span]
886    #[suggestion(code = "extern crate self as name;", applicability = "has-placeholders")]
887    pub(crate) span: Span,
888}
889
890#[derive(Diagnostic)]
891#[diag(resolve_macro_use_name_already_in_use)]
892#[note]
893pub(crate) struct MacroUseNameAlreadyInUse {
894    #[primary_span]
895    pub(crate) span: Span,
896    pub(crate) name: Symbol,
897}
898
899#[derive(Diagnostic)]
900#[diag(resolve_imported_macro_not_found, code = E0469)]
901pub(crate) struct ImportedMacroNotFound {
902    #[primary_span]
903    pub(crate) span: Span,
904}
905
906#[derive(Diagnostic)]
907#[diag(resolve_macro_extern_deprecated)]
908pub(crate) struct MacroExternDeprecated {
909    #[primary_span]
910    pub(crate) span: Span,
911    #[help]
912    pub inner_attribute: bool,
913}
914
915#[derive(Diagnostic)]
916#[diag(resolve_arguments_macro_use_not_allowed)]
917pub(crate) struct ArgumentsMacroUseNotAllowed {
918    #[primary_span]
919    pub(crate) span: Span,
920}
921
922#[derive(Diagnostic)]
923#[diag(resolve_unnamed_crate_root_import)]
924pub(crate) struct UnnamedCrateRootImport {
925    #[primary_span]
926    pub(crate) span: Span,
927}
928
929#[derive(Diagnostic)]
930#[diag(resolve_macro_expanded_extern_crate_cannot_shadow_extern_arguments)]
931pub(crate) struct MacroExpandedExternCrateCannotShadowExternArguments {
932    #[primary_span]
933    pub(crate) span: Span,
934}
935
936#[derive(Diagnostic)]
937#[diag(resolve_elided_anonymous_lifetime_report_error, code = E0637)]
938pub(crate) struct ElidedAnonymousLifetimeReportError {
939    #[primary_span]
940    #[label]
941    pub(crate) span: Span,
942    #[subdiagnostic]
943    pub(crate) suggestion: Option<ElidedAnonymousLifetimeReportErrorSuggestion>,
944}
945
946#[derive(Diagnostic)]
947#[diag(resolve_lending_iterator_report_error)]
948pub(crate) struct LendingIteratorReportError {
949    #[primary_span]
950    pub(crate) lifetime: Span,
951    #[note]
952    pub(crate) ty: Span,
953}
954
955#[derive(Diagnostic)]
956#[diag(resolve_anonymous_lifetime_non_gat_report_error)]
957pub(crate) struct AnonymousLifetimeNonGatReportError {
958    #[primary_span]
959    #[label]
960    pub(crate) lifetime: Span,
961    #[note]
962    pub(crate) decl: MultiSpan,
963}
964
965#[derive(Subdiagnostic)]
966#[multipart_suggestion(
967    resolve_elided_anonymous_lifetime_report_error_suggestion,
968    applicability = "machine-applicable"
969)]
970pub(crate) struct ElidedAnonymousLifetimeReportErrorSuggestion {
971    #[suggestion_part(code = "for<'a> ")]
972    pub(crate) lo: Span,
973    #[suggestion_part(code = "'a ")]
974    pub(crate) hi: Span,
975}
976
977#[derive(Diagnostic)]
978#[diag(resolve_explicit_anonymous_lifetime_report_error, code = E0637)]
979pub(crate) struct ExplicitAnonymousLifetimeReportError {
980    #[primary_span]
981    #[label]
982    pub(crate) span: Span,
983}
984
985#[derive(Diagnostic)]
986#[diag(resolve_implicit_elided_lifetimes_not_allowed_here, code = E0726)]
987pub(crate) struct ImplicitElidedLifetimeNotAllowedHere {
988    #[primary_span]
989    pub(crate) span: Span,
990    #[subdiagnostic]
991    pub(crate) subdiag: ElidedLifetimeInPathSubdiag,
992}
993
994#[derive(Diagnostic)]
995#[diag(resolve_underscore_lifetime_is_reserved, code = E0637)]
996#[help]
997pub(crate) struct UnderscoreLifetimeIsReserved {
998    #[primary_span]
999    #[label]
1000    pub(crate) span: Span,
1001}
1002
1003#[derive(Diagnostic)]
1004#[diag(resolve_static_lifetime_is_reserved, code = E0262)]
1005pub(crate) struct StaticLifetimeIsReserved {
1006    #[primary_span]
1007    #[label]
1008    pub(crate) span: Span,
1009    pub(crate) lifetime: Ident,
1010}
1011
1012#[derive(Diagnostic)]
1013#[diag(resolve_variable_is_not_bound_in_all_patterns, code = E0408)]
1014pub(crate) struct VariableIsNotBoundInAllPatterns {
1015    #[primary_span]
1016    pub(crate) multispan: MultiSpan,
1017    pub(crate) name: Ident,
1018}
1019
1020#[derive(Subdiagnostic, Debug, Clone)]
1021#[label(resolve_pattern_doesnt_bind_name)]
1022pub(crate) struct PatternDoesntBindName {
1023    #[primary_span]
1024    pub(crate) span: Span,
1025    pub(crate) name: Ident,
1026}
1027
1028#[derive(Subdiagnostic, Debug, Clone)]
1029#[label(resolve_variable_not_in_all_patterns)]
1030pub(crate) struct VariableNotInAllPatterns {
1031    #[primary_span]
1032    pub(crate) span: Span,
1033}
1034
1035#[derive(Subdiagnostic)]
1036#[multipart_suggestion(
1037    resolve_variable_is_a_typo,
1038    applicability = "maybe-incorrect",
1039    style = "verbose"
1040)]
1041pub(crate) struct PatternBindingTypo {
1042    #[suggestion_part(code = "{typo}")]
1043    pub(crate) spans: Vec<Span>,
1044    pub(crate) typo: Symbol,
1045}
1046
1047#[derive(Diagnostic)]
1048#[diag(resolve_name_defined_multiple_time)]
1049#[note]
1050pub(crate) struct NameDefinedMultipleTime {
1051    #[primary_span]
1052    pub(crate) span: Span,
1053    pub(crate) name: Symbol,
1054    pub(crate) descr: &'static str,
1055    pub(crate) container: &'static str,
1056    #[subdiagnostic]
1057    pub(crate) label: NameDefinedMultipleTimeLabel,
1058    #[subdiagnostic]
1059    pub(crate) old_binding_label: Option<NameDefinedMultipleTimeOldBindingLabel>,
1060}
1061
1062#[derive(Subdiagnostic)]
1063pub(crate) enum NameDefinedMultipleTimeLabel {
1064    #[label(resolve_name_defined_multiple_time_reimported)]
1065    Reimported {
1066        #[primary_span]
1067        span: Span,
1068    },
1069    #[label(resolve_name_defined_multiple_time_redefined)]
1070    Redefined {
1071        #[primary_span]
1072        span: Span,
1073    },
1074}
1075
1076#[derive(Subdiagnostic)]
1077pub(crate) enum NameDefinedMultipleTimeOldBindingLabel {
1078    #[label(resolve_name_defined_multiple_time_old_binding_import)]
1079    Import {
1080        #[primary_span]
1081        span: Span,
1082        old_kind: &'static str,
1083    },
1084    #[label(resolve_name_defined_multiple_time_old_binding_definition)]
1085    Definition {
1086        #[primary_span]
1087        span: Span,
1088        old_kind: &'static str,
1089    },
1090}
1091
1092#[derive(Diagnostic)]
1093#[diag(resolve_is_private, code = E0603)]
1094pub(crate) struct IsPrivate<'a> {
1095    #[primary_span]
1096    #[label]
1097    pub(crate) span: Span,
1098    pub(crate) ident_descr: &'a str,
1099    pub(crate) ident: Ident,
1100}
1101
1102#[derive(Diagnostic)]
1103#[diag(resolve_generic_arguments_in_macro_path)]
1104pub(crate) struct GenericArgumentsInMacroPath {
1105    #[primary_span]
1106    pub(crate) span: Span,
1107}
1108
1109#[derive(Diagnostic)]
1110#[diag(resolve_attributes_starting_with_rustc_are_reserved)]
1111pub(crate) struct AttributesStartingWithRustcAreReserved {
1112    #[primary_span]
1113    pub(crate) span: Span,
1114}
1115
1116#[derive(Diagnostic)]
1117#[diag(resolve_cannot_use_through_an_import)]
1118pub(crate) struct CannotUseThroughAnImport {
1119    #[primary_span]
1120    pub(crate) span: Span,
1121    pub(crate) article: &'static str,
1122    pub(crate) descr: &'static str,
1123    #[note]
1124    pub(crate) binding_span: Option<Span>,
1125}
1126
1127#[derive(Diagnostic)]
1128#[diag(resolve_name_reserved_in_attribute_namespace)]
1129pub(crate) struct NameReservedInAttributeNamespace {
1130    #[primary_span]
1131    pub(crate) span: Span,
1132    pub(crate) ident: Ident,
1133}
1134
1135#[derive(Diagnostic)]
1136#[diag(resolve_cannot_find_builtin_macro_with_name)]
1137pub(crate) struct CannotFindBuiltinMacroWithName {
1138    #[primary_span]
1139    pub(crate) span: Span,
1140    pub(crate) ident: Ident,
1141}
1142
1143#[derive(Diagnostic)]
1144#[diag(resolve_tool_was_already_registered)]
1145pub(crate) struct ToolWasAlreadyRegistered {
1146    #[primary_span]
1147    pub(crate) span: Span,
1148    pub(crate) tool: Ident,
1149    #[label]
1150    pub(crate) old_ident_span: Span,
1151}
1152
1153#[derive(Diagnostic)]
1154#[diag(resolve_tool_only_accepts_identifiers)]
1155pub(crate) struct ToolOnlyAcceptsIdentifiers {
1156    #[primary_span]
1157    #[label]
1158    pub(crate) span: Span,
1159    pub(crate) tool: Symbol,
1160}
1161
1162#[derive(Subdiagnostic)]
1163pub(crate) enum DefinedHere {
1164    #[label(resolve_similarly_named_defined_here)]
1165    SimilarlyNamed {
1166        #[primary_span]
1167        span: Span,
1168        candidate_descr: &'static str,
1169        candidate: Symbol,
1170    },
1171    #[label(resolve_single_item_defined_here)]
1172    SingleItem {
1173        #[primary_span]
1174        span: Span,
1175        candidate_descr: &'static str,
1176        candidate: Symbol,
1177    },
1178}
1179
1180#[derive(Subdiagnostic)]
1181#[label(resolve_outer_ident_is_not_publicly_reexported)]
1182pub(crate) struct OuterIdentIsNotPubliclyReexported {
1183    #[primary_span]
1184    pub(crate) span: Span,
1185    pub(crate) outer_ident_descr: &'static str,
1186    pub(crate) outer_ident: Ident,
1187}
1188
1189#[derive(Subdiagnostic)]
1190#[label(resolve_constructor_private_if_any_field_private)]
1191pub(crate) struct ConstructorPrivateIfAnyFieldPrivate {
1192    #[primary_span]
1193    pub(crate) span: Span,
1194}
1195
1196#[derive(Subdiagnostic)]
1197#[multipart_suggestion(
1198    resolve_consider_making_the_field_public,
1199    applicability = "maybe-incorrect",
1200    style = "verbose"
1201)]
1202pub(crate) struct ConsiderMakingTheFieldPublic {
1203    #[suggestion_part(code = "pub ")]
1204    pub(crate) spans: Vec<Span>,
1205    pub(crate) number_of_fields: usize,
1206}
1207
1208#[derive(Subdiagnostic)]
1209pub(crate) enum ImportIdent {
1210    #[suggestion(
1211        resolve_suggestion_import_ident_through_reexport,
1212        code = "{path}",
1213        applicability = "machine-applicable",
1214        style = "verbose"
1215    )]
1216    ThroughReExport {
1217        #[primary_span]
1218        span: Span,
1219        ident: Ident,
1220        path: String,
1221    },
1222    #[suggestion(
1223        resolve_suggestion_import_ident_directly,
1224        code = "{path}",
1225        applicability = "machine-applicable",
1226        style = "verbose"
1227    )]
1228    Directly {
1229        #[primary_span]
1230        span: Span,
1231        ident: Ident,
1232        path: String,
1233    },
1234}
1235
1236#[derive(Subdiagnostic)]
1237#[note(resolve_note_and_refers_to_the_item_defined_here)]
1238pub(crate) struct NoteAndRefersToTheItemDefinedHere<'a> {
1239    #[primary_span]
1240    pub(crate) span: MultiSpan,
1241    pub(crate) binding_descr: &'a str,
1242    pub(crate) binding_name: Ident,
1243    pub(crate) first: bool,
1244    pub(crate) dots: bool,
1245}
1246
1247#[derive(Subdiagnostic)]
1248#[suggestion(resolve_remove_unnecessary_import, code = "", applicability = "maybe-incorrect")]
1249pub(crate) struct RemoveUnnecessaryImport {
1250    #[primary_span]
1251    pub(crate) span: Span,
1252}
1253
1254#[derive(Subdiagnostic)]
1255#[suggestion(
1256    resolve_remove_unnecessary_import,
1257    code = "",
1258    applicability = "maybe-incorrect",
1259    style = "tool-only"
1260)]
1261pub(crate) struct ToolOnlyRemoveUnnecessaryImport {
1262    #[primary_span]
1263    pub(crate) span: Span,
1264}
1265
1266#[derive(Subdiagnostic)]
1267#[note(resolve_ident_imported_here_but_it_is_desc)]
1268pub(crate) struct IdentImporterHereButItIsDesc<'a> {
1269    #[primary_span]
1270    pub(crate) span: Span,
1271    pub(crate) imported_ident: Ident,
1272    pub(crate) imported_ident_desc: &'a str,
1273}
1274
1275#[derive(Subdiagnostic)]
1276#[note(resolve_ident_in_scope_but_it_is_desc)]
1277pub(crate) struct IdentInScopeButItIsDesc<'a> {
1278    pub(crate) imported_ident: Ident,
1279    pub(crate) imported_ident_desc: &'a str,
1280}
1281
1282pub(crate) struct FoundItemConfigureOut {
1283    pub(crate) span: Span,
1284    pub(crate) item_was: ItemWas,
1285}
1286
1287pub(crate) enum ItemWas {
1288    BehindFeature { feature: Symbol, span: Span },
1289    CfgOut { span: Span },
1290}
1291
1292impl Subdiagnostic for FoundItemConfigureOut {
1293    fn add_to_diag<G: EmissionGuarantee>(self, diag: &mut Diag<'_, G>) {
1294        let mut multispan: MultiSpan = self.span.into();
1295        match self.item_was {
1296            ItemWas::BehindFeature { feature, span } => {
1297                let key = "feature".into();
1298                let value = feature.into_diag_arg(&mut None);
1299                let msg = diag.dcx.eagerly_translate_to_string(
1300                    fluent::resolve_item_was_behind_feature,
1301                    [(&key, &value)].into_iter(),
1302                );
1303                multispan.push_span_label(span, msg);
1304            }
1305            ItemWas::CfgOut { span } => {
1306                multispan.push_span_label(span, fluent::resolve_item_was_cfg_out);
1307            }
1308        }
1309        diag.span_note(multispan, fluent::resolve_found_an_item_configured_out);
1310    }
1311}
1312
1313#[derive(Diagnostic)]
1314#[diag(resolve_trait_impl_mismatch)]
1315pub(crate) struct TraitImplMismatch {
1316    #[primary_span]
1317    #[label]
1318    pub(crate) span: Span,
1319    pub(crate) name: Ident,
1320    pub(crate) kind: &'static str,
1321    pub(crate) trait_path: String,
1322    #[label(resolve_trait_impl_mismatch_label_item)]
1323    pub(crate) trait_item_span: Span,
1324}
1325
1326#[derive(LintDiagnostic)]
1327#[diag(resolve_legacy_derive_helpers)]
1328pub(crate) struct LegacyDeriveHelpers {
1329    #[label]
1330    pub span: Span,
1331}
1332
1333#[derive(LintDiagnostic)]
1334#[diag(resolve_unused_extern_crate)]
1335pub(crate) struct UnusedExternCrate {
1336    #[label]
1337    pub span: Span,
1338    #[suggestion(code = "", applicability = "machine-applicable", style = "verbose")]
1339    pub removal_span: Span,
1340}
1341
1342#[derive(LintDiagnostic)]
1343#[diag(resolve_reexport_private_dependency)]
1344pub(crate) struct ReexportPrivateDependency {
1345    pub name: Symbol,
1346    pub kind: &'static str,
1347    pub krate: Symbol,
1348}
1349
1350#[derive(LintDiagnostic)]
1351#[diag(resolve_unused_label)]
1352pub(crate) struct UnusedLabel;
1353
1354#[derive(LintDiagnostic)]
1355#[diag(resolve_unused_macro_use)]
1356pub(crate) struct UnusedMacroUse;
1357
1358#[derive(LintDiagnostic)]
1359#[diag(resolve_macro_use_deprecated)]
1360#[help]
1361pub(crate) struct MacroUseDeprecated;