rustc_expand/
errors.rs

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