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