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)]
268#[note]
269pub(crate) struct ModuleInBlock {
270    #[primary_span]
271    pub span: Span,
272    #[subdiagnostic]
273    pub name: Option<ModuleInBlockName>,
274}
275
276#[derive(Subdiagnostic)]
277#[help(expand_help)]
278pub(crate) struct ModuleInBlockName {
279    #[primary_span]
280    pub span: Span,
281    pub name: Ident,
282}
283
284#[derive(Diagnostic)]
285#[diag(expand_module_file_not_found, code = E0583)]
286#[help]
287#[note]
288pub(crate) struct ModuleFileNotFound {
289    #[primary_span]
290    pub span: Span,
291    pub name: Ident,
292    pub default_path: String,
293    pub secondary_path: String,
294}
295
296#[derive(Diagnostic)]
297#[diag(expand_module_multiple_candidates, code = E0761)]
298#[help]
299pub(crate) struct ModuleMultipleCandidates {
300    #[primary_span]
301    pub span: Span,
302    pub name: Ident,
303    pub default_path: String,
304    pub secondary_path: String,
305}
306
307#[derive(Diagnostic)]
308#[diag(expand_trace_macro)]
309pub(crate) struct TraceMacro {
310    #[primary_span]
311    pub span: Span,
312}
313
314#[derive(Diagnostic)]
315#[diag(expand_proc_macro_panicked)]
316pub(crate) struct ProcMacroPanicked {
317    #[primary_span]
318    pub span: Span,
319    #[subdiagnostic]
320    pub message: Option<ProcMacroPanickedHelp>,
321}
322
323#[derive(Subdiagnostic)]
324#[help(expand_help)]
325pub(crate) struct ProcMacroPanickedHelp {
326    pub message: String,
327}
328
329#[derive(Diagnostic)]
330#[diag(expand_proc_macro_derive_panicked)]
331pub(crate) struct ProcMacroDerivePanicked {
332    #[primary_span]
333    pub span: Span,
334    #[subdiagnostic]
335    pub message: Option<ProcMacroDerivePanickedHelp>,
336}
337
338#[derive(Subdiagnostic)]
339#[help(expand_help)]
340pub(crate) struct ProcMacroDerivePanickedHelp {
341    pub message: String,
342}
343
344#[derive(Diagnostic)]
345#[diag(expand_custom_attribute_panicked)]
346pub(crate) struct CustomAttributePanicked {
347    #[primary_span]
348    pub span: Span,
349    #[subdiagnostic]
350    pub message: Option<CustomAttributePanickedHelp>,
351}
352
353#[derive(Subdiagnostic)]
354#[help(expand_help)]
355pub(crate) struct CustomAttributePanickedHelp {
356    pub message: String,
357}
358
359#[derive(Diagnostic)]
360#[diag(expand_proc_macro_derive_tokens)]
361pub(crate) struct ProcMacroDeriveTokens {
362    #[primary_span]
363    pub span: Span,
364}
365
366#[derive(Diagnostic)]
367#[diag(expand_duplicate_matcher_binding)]
368pub(crate) struct DuplicateMatcherBinding {
369    #[primary_span]
370    #[label]
371    pub span: Span,
372    #[label(expand_label2)]
373    pub prev: Span,
374}
375
376#[derive(LintDiagnostic)]
377#[diag(expand_duplicate_matcher_binding)]
378pub(crate) struct DuplicateMatcherBindingLint {
379    #[label]
380    pub span: Span,
381    #[label(expand_label2)]
382    pub prev: Span,
383}
384
385#[derive(Diagnostic)]
386#[diag(expand_missing_fragment_specifier)]
387#[note]
388#[help(expand_valid)]
389pub(crate) struct MissingFragmentSpecifier {
390    #[primary_span]
391    pub span: Span,
392    #[suggestion(
393        expand_suggestion_add_fragspec,
394        style = "verbose",
395        code = ":spec",
396        applicability = "maybe-incorrect"
397    )]
398    pub add_span: Span,
399    pub valid: &'static str,
400}
401
402#[derive(Diagnostic)]
403#[diag(expand_invalid_fragment_specifier)]
404#[help]
405pub(crate) struct InvalidFragmentSpecifier {
406    #[primary_span]
407    pub span: Span,
408    pub fragment: Ident,
409    pub help: &'static str,
410}
411
412#[derive(Diagnostic)]
413#[diag(expand_expected_paren_or_brace)]
414pub(crate) struct ExpectedParenOrBrace<'a> {
415    #[primary_span]
416    pub span: Span,
417    pub token: Cow<'a, str>,
418}
419
420#[derive(Diagnostic)]
421#[diag(expand_empty_delegation_mac)]
422pub(crate) struct EmptyDelegationMac {
423    #[primary_span]
424    pub span: Span,
425    pub kind: String,
426}
427
428#[derive(Diagnostic)]
429#[diag(expand_glob_delegation_outside_impls)]
430pub(crate) struct GlobDelegationOutsideImpls {
431    #[primary_span]
432    pub span: Span,
433}
434
435#[derive(Diagnostic)]
436#[diag(expand_crate_name_in_cfg_attr)]
437pub(crate) struct CrateNameInCfgAttr {
438    #[primary_span]
439    pub span: Span,
440}
441
442#[derive(Diagnostic)]
443#[diag(expand_crate_type_in_cfg_attr)]
444pub(crate) struct CrateTypeInCfgAttr {
445    #[primary_span]
446    pub span: Span,
447}
448
449#[derive(Diagnostic)]
450#[diag(expand_glob_delegation_traitless_qpath)]
451pub(crate) struct GlobDelegationTraitlessQpath {
452    #[primary_span]
453    pub span: Span,
454}
455
456// This used to be the `proc_macro_back_compat` lint (#83125). It was later
457// turned into a hard error.
458#[derive(Diagnostic)]
459#[diag(expand_proc_macro_back_compat)]
460#[note]
461pub(crate) struct ProcMacroBackCompat {
462    pub crate_name: String,
463    pub fixed_version: String,
464}
465
466pub(crate) use metavar_exprs::*;
467mod metavar_exprs {
468    use super::*;
469
470    #[derive(Diagnostic, Default)]
471    #[diag(expand_mve_extra_tokens)]
472    pub(crate) struct MveExtraTokens {
473        #[primary_span]
474        #[suggestion(code = "", applicability = "machine-applicable")]
475        pub span: Span,
476        #[label]
477        pub ident_span: Span,
478        pub extra_count: usize,
479
480        // The rest is only used for specific diagnostics and can be default if neither
481        // `note` is `Some`.
482        #[note(expand_exact)]
483        pub exact_args_note: Option<()>,
484        #[note(expand_range)]
485        pub range_args_note: Option<()>,
486        pub min_or_exact_args: usize,
487        pub max_args: usize,
488        pub name: String,
489    }
490
491    #[derive(Diagnostic)]
492    #[note]
493    #[diag(expand_mve_missing_paren)]
494    pub(crate) struct MveMissingParen {
495        #[primary_span]
496        #[label]
497        pub ident_span: Span,
498        #[label(expand_unexpected)]
499        pub unexpected_span: Option<Span>,
500        #[suggestion(code = "( /* ... */ )", applicability = "has-placeholders")]
501        pub insert_span: Option<Span>,
502    }
503
504    #[derive(Diagnostic)]
505    #[note]
506    #[diag(expand_mve_unrecognized_expr)]
507    pub(crate) struct MveUnrecognizedExpr {
508        #[primary_span]
509        #[label]
510        pub span: Span,
511        pub valid_expr_list: &'static str,
512    }
513
514    #[derive(Diagnostic)]
515    #[diag(expand_mve_unrecognized_var)]
516    pub(crate) struct MveUnrecognizedVar {
517        #[primary_span]
518        pub span: Span,
519        pub key: MacroRulesNormalizedIdent,
520    }
521}
522
523#[derive(Diagnostic)]
524#[diag(expand_macro_args_bad_delim)]
525pub(crate) struct MacroArgsBadDelim {
526    #[primary_span]
527    pub span: Span,
528    #[subdiagnostic]
529    pub sugg: MacroArgsBadDelimSugg,
530    pub rule_kw: Symbol,
531}
532
533#[derive(Subdiagnostic)]
534#[multipart_suggestion(expand_macro_args_bad_delim_sugg, applicability = "machine-applicable")]
535pub(crate) struct MacroArgsBadDelimSugg {
536    #[suggestion_part(code = "(")]
537    pub open: Span,
538    #[suggestion_part(code = ")")]
539    pub close: Span,
540}
541
542#[derive(LintDiagnostic)]
543#[diag(expand_macro_call_unused_doc_comment)]
544#[help]
545pub(crate) struct MacroCallUnusedDocComment {
546    #[label]
547    pub span: Span,
548}
549
550#[derive(LintDiagnostic)]
551#[diag(expand_or_patterns_back_compat)]
552pub(crate) struct OrPatternsBackCompat {
553    #[suggestion(code = "{suggestion}", applicability = "machine-applicable")]
554    pub span: Span,
555    pub suggestion: String,
556}
557
558#[derive(LintDiagnostic)]
559#[diag(expand_trailing_semi_macro)]
560pub(crate) struct TrailingMacro {
561    #[note(expand_note1)]
562    #[note(expand_note2)]
563    pub is_trailing: bool,
564    pub name: Ident,
565}
566
567#[derive(LintDiagnostic)]
568#[diag(expand_unused_builtin_attribute)]
569pub(crate) struct UnusedBuiltinAttribute {
570    #[note]
571    pub invoc_span: Span,
572    pub attr_name: Symbol,
573    pub macro_name: String,
574    #[suggestion(code = "", applicability = "machine-applicable", style = "tool-only")]
575    pub attr_span: Span,
576}