rustc_resolve/
errors.rs

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