rustc_expand/
errors.rs

1use std::borrow::Cow;
2
3use rustc_ast::ast;
4use rustc_errors::codes::*;
5use rustc_hir::limit::Limit;
6use rustc_macros::{Diagnostic, LintDiagnostic, Subdiagnostic};
7use rustc_span::{Ident, MacroRulesNormalizedIdent, Span, Symbol};
8
9#[derive(LintDiagnostic)]
10#[diag(expand_cfg_attr_no_attributes)]
11pub(crate) struct CfgAttrNoAttributes;
12
13#[derive(Diagnostic)]
14#[diag(expand_expr_repeat_no_syntax_vars)]
15pub(crate) struct NoSyntaxVarsExprRepeat {
16    #[primary_span]
17    pub span: Span,
18}
19
20#[derive(Diagnostic)]
21#[diag(expand_must_repeat_once)]
22pub(crate) struct MustRepeatOnce {
23    #[primary_span]
24    pub span: Span,
25}
26
27#[derive(Diagnostic)]
28#[diag(expand_count_repetition_misplaced)]
29pub(crate) struct CountRepetitionMisplaced {
30    #[primary_span]
31    pub span: Span,
32}
33
34#[derive(Diagnostic)]
35#[diag(expand_metavar_still_repeating)]
36pub(crate) struct MacroVarStillRepeating {
37    #[primary_span]
38    pub span: Span,
39    pub ident: MacroRulesNormalizedIdent,
40}
41
42#[derive(LintDiagnostic)]
43#[diag(expand_metavar_still_repeating)]
44pub(crate) struct MetaVarStillRepeatingLint {
45    #[label]
46    pub label: Span,
47    pub ident: MacroRulesNormalizedIdent,
48}
49
50#[derive(LintDiagnostic)]
51#[diag(expand_metavariable_wrong_operator)]
52pub(crate) struct MetaVariableWrongOperator {
53    #[label(expand_binder_label)]
54    pub binder: Span,
55    #[label(expand_occurrence_label)]
56    pub occurrence: Span,
57}
58
59#[derive(Diagnostic)]
60#[diag(expand_meta_var_dif_seq_matchers)]
61pub(crate) struct MetaVarsDifSeqMatchers {
62    #[primary_span]
63    pub span: Span,
64    pub msg: String,
65}
66
67#[derive(LintDiagnostic)]
68#[diag(expand_unknown_macro_variable)]
69pub(crate) struct UnknownMacroVariable {
70    pub name: MacroRulesNormalizedIdent,
71}
72
73#[derive(Diagnostic)]
74#[diag(expand_resolve_relative_path)]
75pub(crate) struct ResolveRelativePath {
76    #[primary_span]
77    pub span: Span,
78    pub path: String,
79}
80
81#[derive(Diagnostic)]
82#[diag(expand_collapse_debuginfo_illegal)]
83pub(crate) struct CollapseMacroDebuginfoIllegal {
84    #[primary_span]
85    pub span: Span,
86}
87
88#[derive(Diagnostic)]
89#[diag(expand_macro_const_stability)]
90pub(crate) struct MacroConstStability {
91    #[primary_span]
92    #[label]
93    pub span: Span,
94    #[label(expand_label2)]
95    pub head_span: Span,
96}
97
98#[derive(Diagnostic)]
99#[diag(expand_macro_body_stability)]
100pub(crate) struct MacroBodyStability {
101    #[primary_span]
102    #[label]
103    pub span: Span,
104    #[label(expand_label2)]
105    pub head_span: Span,
106}
107
108#[derive(Diagnostic)]
109#[diag(expand_feature_removed, code = E0557)]
110#[note]
111pub(crate) struct FeatureRemoved<'a> {
112    #[primary_span]
113    #[label]
114    pub span: Span,
115    #[subdiagnostic]
116    pub reason: Option<FeatureRemovedReason<'a>>,
117    pub removed_rustc_version: &'a str,
118    pub pull_note: String,
119}
120
121#[derive(Subdiagnostic)]
122#[note(expand_reason)]
123pub(crate) struct FeatureRemovedReason<'a> {
124    pub reason: &'a str,
125}
126
127#[derive(Diagnostic)]
128#[diag(expand_feature_not_allowed, code = E0725)]
129pub(crate) struct FeatureNotAllowed {
130    #[primary_span]
131    pub span: Span,
132    pub name: Symbol,
133}
134
135#[derive(Diagnostic)]
136#[diag(expand_recursion_limit_reached)]
137#[help]
138pub(crate) struct RecursionLimitReached {
139    #[primary_span]
140    pub span: Span,
141    pub descr: String,
142    pub suggested_limit: Limit,
143    pub crate_name: Symbol,
144}
145
146#[derive(Diagnostic)]
147#[diag(expand_malformed_feature_attribute, code = E0556)]
148pub(crate) struct MalformedFeatureAttribute {
149    #[primary_span]
150    pub span: Span,
151    #[subdiagnostic]
152    pub help: MalformedFeatureAttributeHelp,
153}
154
155#[derive(Subdiagnostic)]
156pub(crate) enum MalformedFeatureAttributeHelp {
157    #[label(expand_expected)]
158    Label {
159        #[primary_span]
160        span: Span,
161    },
162    #[suggestion(expand_expected, code = "{suggestion}", applicability = "maybe-incorrect")]
163    Suggestion {
164        #[primary_span]
165        span: Span,
166        suggestion: Symbol,
167    },
168}
169
170#[derive(Diagnostic)]
171#[diag(expand_remove_expr_not_supported)]
172pub(crate) struct RemoveExprNotSupported {
173    #[primary_span]
174    pub span: Span,
175}
176
177#[derive(Diagnostic)]
178pub(crate) enum InvalidCfg {
179    #[diag(expand_invalid_cfg_no_parens)]
180    NotFollowedByParens {
181        #[primary_span]
182        #[suggestion(
183            expand_invalid_cfg_expected_syntax,
184            code = "cfg(/* predicate */)",
185            applicability = "has-placeholders"
186        )]
187        span: Span,
188    },
189    #[diag(expand_invalid_cfg_no_predicate)]
190    NoPredicate {
191        #[primary_span]
192        #[suggestion(
193            expand_invalid_cfg_expected_syntax,
194            code = "cfg(/* predicate */)",
195            applicability = "has-placeholders"
196        )]
197        span: Span,
198    },
199    #[diag(expand_invalid_cfg_multiple_predicates)]
200    MultiplePredicates {
201        #[primary_span]
202        span: Span,
203    },
204    #[diag(expand_invalid_cfg_predicate_literal)]
205    PredicateLiteral {
206        #[primary_span]
207        span: Span,
208    },
209}
210
211#[derive(Diagnostic)]
212#[diag(expand_wrong_fragment_kind)]
213pub(crate) struct WrongFragmentKind<'a> {
214    #[primary_span]
215    pub span: Span,
216    pub kind: &'a str,
217    pub name: &'a ast::Path,
218}
219
220#[derive(Diagnostic)]
221#[diag(expand_unsupported_key_value)]
222pub(crate) struct UnsupportedKeyValue {
223    #[primary_span]
224    pub span: Span,
225}
226
227#[derive(Diagnostic)]
228#[diag(expand_incomplete_parse)]
229#[note]
230pub(crate) struct IncompleteParse<'a> {
231    #[primary_span]
232    pub span: Span,
233    pub descr: String,
234    #[label]
235    pub label_span: Span,
236    pub macro_path: &'a ast::Path,
237    pub kind_name: &'a str,
238    #[note(expand_macro_expands_to_match_arm)]
239    pub expands_to_match_arm: bool,
240
241    #[suggestion(
242        expand_suggestion_add_semi,
243        style = "verbose",
244        code = ";",
245        applicability = "maybe-incorrect"
246    )]
247    pub add_semicolon: Option<Span>,
248}
249
250#[derive(Diagnostic)]
251#[diag(expand_remove_node_not_supported)]
252pub(crate) struct RemoveNodeNotSupported {
253    #[primary_span]
254    pub span: Span,
255    pub descr: &'static str,
256}
257
258#[derive(Diagnostic)]
259#[diag(expand_module_circular)]
260pub(crate) struct ModuleCircular {
261    #[primary_span]
262    pub span: Span,
263    pub modules: String,
264}
265
266#[derive(Diagnostic)]
267#[diag(expand_module_in_block)]
268pub(crate) struct ModuleInBlock {
269    #[primary_span]
270    pub span: Span,
271    #[subdiagnostic]
272    pub name: Option<ModuleInBlockName>,
273}
274
275#[derive(Subdiagnostic)]
276#[note(expand_note)]
277pub(crate) struct ModuleInBlockName {
278    #[primary_span]
279    pub span: Span,
280    pub name: Ident,
281}
282
283#[derive(Diagnostic)]
284#[diag(expand_module_file_not_found, code = E0583)]
285#[help]
286#[note]
287pub(crate) struct ModuleFileNotFound {
288    #[primary_span]
289    pub span: Span,
290    pub name: Ident,
291    pub default_path: String,
292    pub secondary_path: String,
293}
294
295#[derive(Diagnostic)]
296#[diag(expand_module_multiple_candidates, code = E0761)]
297#[help]
298pub(crate) struct ModuleMultipleCandidates {
299    #[primary_span]
300    pub span: Span,
301    pub name: Ident,
302    pub default_path: String,
303    pub secondary_path: String,
304}
305
306#[derive(Diagnostic)]
307#[diag(expand_trace_macro)]
308pub(crate) struct TraceMacro {
309    #[primary_span]
310    pub span: Span,
311}
312
313#[derive(Diagnostic)]
314#[diag(expand_proc_macro_panicked)]
315pub(crate) struct ProcMacroPanicked {
316    #[primary_span]
317    pub span: Span,
318    #[subdiagnostic]
319    pub message: Option<ProcMacroPanickedHelp>,
320}
321
322#[derive(Subdiagnostic)]
323#[help(expand_help)]
324pub(crate) struct ProcMacroPanickedHelp {
325    pub message: String,
326}
327
328#[derive(Diagnostic)]
329#[diag(expand_proc_macro_derive_panicked)]
330pub(crate) struct ProcMacroDerivePanicked {
331    #[primary_span]
332    pub span: Span,
333    #[subdiagnostic]
334    pub message: Option<ProcMacroDerivePanickedHelp>,
335}
336
337#[derive(Subdiagnostic)]
338#[help(expand_help)]
339pub(crate) struct ProcMacroDerivePanickedHelp {
340    pub message: String,
341}
342
343#[derive(Diagnostic)]
344#[diag(expand_custom_attribute_panicked)]
345pub(crate) struct CustomAttributePanicked {
346    #[primary_span]
347    pub span: Span,
348    #[subdiagnostic]
349    pub message: Option<CustomAttributePanickedHelp>,
350}
351
352#[derive(Subdiagnostic)]
353#[help(expand_help)]
354pub(crate) struct CustomAttributePanickedHelp {
355    pub message: String,
356}
357
358#[derive(Diagnostic)]
359#[diag(expand_proc_macro_derive_tokens)]
360pub(crate) struct ProcMacroDeriveTokens {
361    #[primary_span]
362    pub span: Span,
363}
364
365#[derive(Diagnostic)]
366#[diag(expand_duplicate_matcher_binding)]
367pub(crate) struct DuplicateMatcherBinding {
368    #[primary_span]
369    #[label]
370    pub span: Span,
371    #[label(expand_label2)]
372    pub prev: Span,
373}
374
375#[derive(LintDiagnostic)]
376#[diag(expand_duplicate_matcher_binding)]
377pub(crate) struct DuplicateMatcherBindingLint {
378    #[label]
379    pub span: Span,
380    #[label(expand_label2)]
381    pub prev: Span,
382}
383
384#[derive(Diagnostic)]
385#[diag(expand_missing_fragment_specifier)]
386#[note]
387#[help(expand_valid)]
388pub(crate) struct MissingFragmentSpecifier {
389    #[primary_span]
390    pub span: Span,
391    #[suggestion(
392        expand_suggestion_add_fragspec,
393        style = "verbose",
394        code = ":spec",
395        applicability = "maybe-incorrect"
396    )]
397    pub add_span: Span,
398    pub valid: &'static str,
399}
400
401#[derive(Diagnostic)]
402#[diag(expand_invalid_fragment_specifier)]
403#[help]
404pub(crate) struct InvalidFragmentSpecifier {
405    #[primary_span]
406    pub span: Span,
407    pub fragment: Ident,
408    pub help: &'static str,
409}
410
411#[derive(Diagnostic)]
412#[diag(expand_expected_paren_or_brace)]
413pub(crate) struct ExpectedParenOrBrace<'a> {
414    #[primary_span]
415    pub span: Span,
416    pub token: Cow<'a, str>,
417}
418
419#[derive(Diagnostic)]
420#[diag(expand_empty_delegation_mac)]
421pub(crate) struct EmptyDelegationMac {
422    #[primary_span]
423    pub span: Span,
424    pub kind: String,
425}
426
427#[derive(Diagnostic)]
428#[diag(expand_glob_delegation_outside_impls)]
429pub(crate) struct GlobDelegationOutsideImpls {
430    #[primary_span]
431    pub span: Span,
432}
433
434#[derive(Diagnostic)]
435#[diag(expand_crate_name_in_cfg_attr)]
436pub(crate) struct CrateNameInCfgAttr {
437    #[primary_span]
438    pub span: Span,
439}
440
441#[derive(Diagnostic)]
442#[diag(expand_crate_type_in_cfg_attr)]
443pub(crate) struct CrateTypeInCfgAttr {
444    #[primary_span]
445    pub span: Span,
446}
447
448#[derive(Diagnostic)]
449#[diag(expand_glob_delegation_traitless_qpath)]
450pub(crate) struct GlobDelegationTraitlessQpath {
451    #[primary_span]
452    pub span: Span,
453}
454
455// This used to be the `proc_macro_back_compat` lint (#83125). It was later
456// turned into a hard error.
457#[derive(Diagnostic)]
458#[diag(expand_proc_macro_back_compat)]
459#[note]
460pub(crate) struct ProcMacroBackCompat {
461    pub crate_name: String,
462    pub fixed_version: String,
463}
464
465pub(crate) use metavar_exprs::*;
466mod metavar_exprs {
467    use super::*;
468
469    #[derive(Diagnostic, Default)]
470    #[diag(expand_mve_extra_tokens)]
471    pub(crate) struct MveExtraTokens {
472        #[primary_span]
473        #[suggestion(code = "", applicability = "machine-applicable")]
474        pub span: Span,
475        #[label]
476        pub ident_span: Span,
477        pub extra_count: usize,
478
479        // The rest is only used for specific diagnostics and can be default if neither
480        // `note` is `Some`.
481        #[note(expand_exact)]
482        pub exact_args_note: Option<()>,
483        #[note(expand_range)]
484        pub range_args_note: Option<()>,
485        pub min_or_exact_args: usize,
486        pub max_args: usize,
487        pub name: String,
488    }
489
490    #[derive(Diagnostic)]
491    #[note]
492    #[diag(expand_mve_missing_paren)]
493    pub(crate) struct MveMissingParen {
494        #[primary_span]
495        #[label]
496        pub ident_span: Span,
497        #[label(expand_unexpected)]
498        pub unexpected_span: Option<Span>,
499        #[suggestion(code = "( /* ... */ )", applicability = "has-placeholders")]
500        pub insert_span: Option<Span>,
501    }
502
503    #[derive(Diagnostic)]
504    #[note]
505    #[diag(expand_mve_unrecognized_expr)]
506    pub(crate) struct MveUnrecognizedExpr {
507        #[primary_span]
508        #[label]
509        pub span: Span,
510        pub valid_expr_list: &'static str,
511    }
512
513    #[derive(Diagnostic)]
514    #[diag(expand_mve_unrecognized_var)]
515    pub(crate) struct MveUnrecognizedVar {
516        #[primary_span]
517        pub span: Span,
518        pub key: MacroRulesNormalizedIdent,
519    }
520}
521
522#[derive(Diagnostic)]
523#[diag(expand_macro_args_bad_delim)]
524pub(crate) struct MacroArgsBadDelim {
525    #[primary_span]
526    pub span: Span,
527    #[subdiagnostic]
528    pub sugg: MacroArgsBadDelimSugg,
529    pub rule_kw: Symbol,
530}
531
532#[derive(Subdiagnostic)]
533#[multipart_suggestion(expand_macro_args_bad_delim_sugg, applicability = "machine-applicable")]
534pub(crate) struct MacroArgsBadDelimSugg {
535    #[suggestion_part(code = "(")]
536    pub open: Span,
537    #[suggestion_part(code = ")")]
538    pub close: Span,
539}
540
541#[derive(LintDiagnostic)]
542#[diag(expand_macro_call_unused_doc_comment)]
543#[help]
544pub(crate) struct MacroCallUnusedDocComment {
545    #[label]
546    pub span: Span,
547}
548
549#[derive(LintDiagnostic)]
550#[diag(expand_or_patterns_back_compat)]
551pub(crate) struct OrPatternsBackCompat {
552    #[suggestion(code = "{suggestion}", applicability = "machine-applicable")]
553    pub span: Span,
554    pub suggestion: String,
555}
556
557#[derive(LintDiagnostic)]
558#[diag(expand_trailing_semi_macro)]
559pub(crate) struct TrailingMacro {
560    #[note(expand_note1)]
561    #[note(expand_note2)]
562    pub is_trailing: bool,
563    pub name: Ident,
564}
565
566#[derive(LintDiagnostic)]
567#[diag(expand_unused_builtin_attribute)]
568pub(crate) struct UnusedBuiltinAttribute {
569    #[note]
570    pub invoc_span: Span,
571    pub attr_name: Symbol,
572    pub macro_name: String,
573    #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
574    pub attr_span: Span,
575}