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