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