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_attr_no_arguments)]
83pub(crate) struct AttrNoArguments {
84    #[primary_span]
85    pub span: Span,
86}
87
88#[derive(Diagnostic)]
89#[diag(expand_not_a_meta_item)]
90pub(crate) struct NotAMetaItem {
91    #[primary_span]
92    pub span: Span,
93}
94
95#[derive(Diagnostic)]
96#[diag(expand_only_one_word)]
97pub(crate) struct OnlyOneWord {
98    #[primary_span]
99    pub span: Span,
100}
101
102#[derive(Diagnostic)]
103#[diag(expand_cannot_be_name_of_macro)]
104pub(crate) struct CannotBeNameOfMacro<'a> {
105    #[primary_span]
106    pub span: Span,
107    pub trait_ident: Ident,
108    pub macro_type: &'a str,
109}
110
111#[derive(Diagnostic)]
112#[diag(expand_arg_not_attributes)]
113pub(crate) struct ArgumentNotAttributes {
114    #[primary_span]
115    pub span: Span,
116}
117
118#[derive(Diagnostic)]
119#[diag(expand_attributes_wrong_form)]
120pub(crate) struct AttributesWrongForm {
121    #[primary_span]
122    pub span: Span,
123}
124
125#[derive(Diagnostic)]
126#[diag(expand_attribute_meta_item)]
127pub(crate) struct AttributeMetaItem {
128    #[primary_span]
129    pub span: Span,
130}
131
132#[derive(Diagnostic)]
133#[diag(expand_attribute_single_word)]
134pub(crate) struct AttributeSingleWord {
135    #[primary_span]
136    pub span: Span,
137}
138
139#[derive(Diagnostic)]
140#[diag(expand_helper_attribute_name_invalid)]
141pub(crate) struct HelperAttributeNameInvalid {
142    #[primary_span]
143    pub span: Span,
144    pub name: Ident,
145}
146
147#[derive(Diagnostic)]
148#[diag(expand_feature_removed, code = E0557)]
149#[note]
150pub(crate) struct FeatureRemoved<'a> {
151    #[primary_span]
152    #[label]
153    pub span: Span,
154    #[subdiagnostic]
155    pub reason: Option<FeatureRemovedReason<'a>>,
156    pub removed_rustc_version: &'a str,
157    pub pull_note: String,
158}
159
160#[derive(Subdiagnostic)]
161#[note(expand_reason)]
162pub(crate) struct FeatureRemovedReason<'a> {
163    pub reason: &'a str,
164}
165
166#[derive(Diagnostic)]
167#[diag(expand_feature_not_allowed, code = E0725)]
168pub(crate) struct FeatureNotAllowed {
169    #[primary_span]
170    pub span: Span,
171    pub name: Symbol,
172}
173
174#[derive(Diagnostic)]
175#[diag(expand_recursion_limit_reached)]
176#[help]
177pub(crate) struct RecursionLimitReached {
178    #[primary_span]
179    pub span: Span,
180    pub descr: String,
181    pub suggested_limit: Limit,
182    pub crate_name: Symbol,
183}
184
185#[derive(Diagnostic)]
186#[diag(expand_malformed_feature_attribute, code = E0556)]
187pub(crate) struct MalformedFeatureAttribute {
188    #[primary_span]
189    pub span: Span,
190    #[subdiagnostic]
191    pub help: MalformedFeatureAttributeHelp,
192}
193
194#[derive(Subdiagnostic)]
195pub(crate) enum MalformedFeatureAttributeHelp {
196    #[label(expand_expected)]
197    Label {
198        #[primary_span]
199        span: Span,
200    },
201    #[suggestion(expand_expected, code = "{suggestion}", applicability = "maybe-incorrect")]
202    Suggestion {
203        #[primary_span]
204        span: Span,
205        suggestion: Symbol,
206    },
207}
208
209#[derive(Diagnostic)]
210#[diag(expand_remove_expr_not_supported)]
211pub(crate) struct RemoveExprNotSupported {
212    #[primary_span]
213    pub span: Span,
214}
215
216#[derive(Diagnostic)]
217pub(crate) enum InvalidCfg {
218    #[diag(expand_invalid_cfg_no_parens)]
219    NotFollowedByParens {
220        #[primary_span]
221        #[suggestion(
222            expand_invalid_cfg_expected_syntax,
223            code = "cfg(/* predicate */)",
224            applicability = "has-placeholders"
225        )]
226        span: Span,
227    },
228    #[diag(expand_invalid_cfg_no_predicate)]
229    NoPredicate {
230        #[primary_span]
231        #[suggestion(
232            expand_invalid_cfg_expected_syntax,
233            code = "cfg(/* predicate */)",
234            applicability = "has-placeholders"
235        )]
236        span: Span,
237    },
238    #[diag(expand_invalid_cfg_multiple_predicates)]
239    MultiplePredicates {
240        #[primary_span]
241        span: Span,
242    },
243    #[diag(expand_invalid_cfg_predicate_literal)]
244    PredicateLiteral {
245        #[primary_span]
246        span: Span,
247    },
248}
249
250#[derive(Diagnostic)]
251#[diag(expand_wrong_fragment_kind)]
252pub(crate) struct WrongFragmentKind<'a> {
253    #[primary_span]
254    pub span: Span,
255    pub kind: &'a str,
256    pub name: &'a ast::Path,
257}
258
259#[derive(Diagnostic)]
260#[diag(expand_unsupported_key_value)]
261pub(crate) struct UnsupportedKeyValue {
262    #[primary_span]
263    pub span: Span,
264}
265
266#[derive(Diagnostic)]
267#[diag(expand_incomplete_parse)]
268#[note]
269pub(crate) struct IncompleteParse<'a> {
270    #[primary_span]
271    pub span: Span,
272    pub descr: String,
273    #[label]
274    pub label_span: Span,
275    pub macro_path: &'a ast::Path,
276    pub kind_name: &'a str,
277    #[note(expand_macro_expands_to_match_arm)]
278    pub expands_to_match_arm: bool,
279
280    #[suggestion(
281        expand_suggestion_add_semi,
282        style = "verbose",
283        code = ";",
284        applicability = "maybe-incorrect"
285    )]
286    pub add_semicolon: Option<Span>,
287}
288
289#[derive(Diagnostic)]
290#[diag(expand_remove_node_not_supported)]
291pub(crate) struct RemoveNodeNotSupported {
292    #[primary_span]
293    pub span: Span,
294    pub descr: &'static str,
295}
296
297#[derive(Diagnostic)]
298#[diag(expand_module_circular)]
299pub(crate) struct ModuleCircular {
300    #[primary_span]
301    pub span: Span,
302    pub modules: String,
303}
304
305#[derive(Diagnostic)]
306#[diag(expand_module_in_block)]
307pub(crate) struct ModuleInBlock {
308    #[primary_span]
309    pub span: Span,
310    #[subdiagnostic]
311    pub name: Option<ModuleInBlockName>,
312}
313
314#[derive(Subdiagnostic)]
315#[note(expand_note)]
316pub(crate) struct ModuleInBlockName {
317    #[primary_span]
318    pub span: Span,
319    pub name: Ident,
320}
321
322#[derive(Diagnostic)]
323#[diag(expand_module_file_not_found, code = E0583)]
324#[help]
325#[note]
326pub(crate) struct ModuleFileNotFound {
327    #[primary_span]
328    pub span: Span,
329    pub name: Ident,
330    pub default_path: String,
331    pub secondary_path: String,
332}
333
334#[derive(Diagnostic)]
335#[diag(expand_module_multiple_candidates, code = E0761)]
336#[help]
337pub(crate) struct ModuleMultipleCandidates {
338    #[primary_span]
339    pub span: Span,
340    pub name: Ident,
341    pub default_path: String,
342    pub secondary_path: String,
343}
344
345#[derive(Diagnostic)]
346#[diag(expand_trace_macro)]
347pub(crate) struct TraceMacro {
348    #[primary_span]
349    pub span: Span,
350}
351
352#[derive(Diagnostic)]
353#[diag(expand_proc_macro_panicked)]
354pub(crate) struct ProcMacroPanicked {
355    #[primary_span]
356    pub span: Span,
357    #[subdiagnostic]
358    pub message: Option<ProcMacroPanickedHelp>,
359}
360
361#[derive(Subdiagnostic)]
362#[help(expand_help)]
363pub(crate) struct ProcMacroPanickedHelp {
364    pub message: String,
365}
366
367#[derive(Diagnostic)]
368#[diag(expand_proc_macro_derive_panicked)]
369pub(crate) struct ProcMacroDerivePanicked {
370    #[primary_span]
371    pub span: Span,
372    #[subdiagnostic]
373    pub message: Option<ProcMacroDerivePanickedHelp>,
374}
375
376#[derive(Subdiagnostic)]
377#[help(expand_help)]
378pub(crate) struct ProcMacroDerivePanickedHelp {
379    pub message: String,
380}
381
382#[derive(Diagnostic)]
383#[diag(expand_custom_attribute_panicked)]
384pub(crate) struct CustomAttributePanicked {
385    #[primary_span]
386    pub span: Span,
387    #[subdiagnostic]
388    pub message: Option<CustomAttributePanickedHelp>,
389}
390
391#[derive(Subdiagnostic)]
392#[help(expand_help)]
393pub(crate) struct CustomAttributePanickedHelp {
394    pub message: String,
395}
396
397#[derive(Diagnostic)]
398#[diag(expand_proc_macro_derive_tokens)]
399pub(crate) struct ProcMacroDeriveTokens {
400    #[primary_span]
401    pub span: Span,
402}
403
404#[derive(Diagnostic)]
405#[diag(expand_duplicate_matcher_binding)]
406pub(crate) struct DuplicateMatcherBinding {
407    #[primary_span]
408    #[label]
409    pub span: Span,
410    #[label(expand_label2)]
411    pub prev: Span,
412}
413
414#[derive(Diagnostic)]
415#[diag(expand_missing_fragment_specifier)]
416#[note]
417#[help(expand_valid)]
418pub(crate) struct MissingFragmentSpecifier {
419    #[primary_span]
420    pub span: Span,
421    #[suggestion(
422        expand_suggestion_add_fragspec,
423        style = "verbose",
424        code = ":spec",
425        applicability = "maybe-incorrect"
426    )]
427    pub add_span: Span,
428    pub valid: &'static str,
429}
430
431#[derive(Diagnostic)]
432#[diag(expand_invalid_fragment_specifier)]
433#[help]
434pub(crate) struct InvalidFragmentSpecifier {
435    #[primary_span]
436    pub span: Span,
437    pub fragment: Ident,
438    pub help: &'static str,
439}
440
441#[derive(Diagnostic)]
442#[diag(expand_expected_paren_or_brace)]
443pub(crate) struct ExpectedParenOrBrace<'a> {
444    #[primary_span]
445    pub span: Span,
446    pub token: Cow<'a, str>,
447}
448
449#[derive(Diagnostic)]
450#[diag(expand_empty_delegation_mac)]
451pub(crate) struct EmptyDelegationMac {
452    #[primary_span]
453    pub span: Span,
454    pub kind: String,
455}
456
457#[derive(Diagnostic)]
458#[diag(expand_glob_delegation_outside_impls)]
459pub(crate) struct GlobDelegationOutsideImpls {
460    #[primary_span]
461    pub span: Span,
462}
463
464#[derive(Diagnostic)]
465#[diag(expand_crate_name_in_cfg_attr)]
466pub(crate) struct CrateNameInCfgAttr {
467    #[primary_span]
468    pub span: Span,
469}
470
471#[derive(Diagnostic)]
472#[diag(expand_crate_type_in_cfg_attr)]
473pub(crate) struct CrateTypeInCfgAttr {
474    #[primary_span]
475    pub span: Span,
476}
477
478#[derive(Diagnostic)]
479#[diag(expand_glob_delegation_traitless_qpath)]
480pub(crate) struct GlobDelegationTraitlessQpath {
481    #[primary_span]
482    pub span: Span,
483}
484
485// This used to be the `proc_macro_back_compat` lint (#83125). It was later
486// turned into a hard error.
487#[derive(Diagnostic)]
488#[diag(expand_proc_macro_back_compat)]
489#[note]
490pub(crate) struct ProcMacroBackCompat {
491    pub crate_name: String,
492    pub fixed_version: String,
493}
494
495pub(crate) use metavar_exprs::*;
496mod metavar_exprs {
497    use super::*;
498
499    #[derive(Diagnostic)]
500    #[diag(expand_mve_unrecognized_var)]
501    pub(crate) struct MveUnrecognizedVar {
502        #[primary_span]
503        pub span: Span,
504        pub key: MacroRulesNormalizedIdent,
505    }
506}