rustc_ast_lowering/
errors.rs

1use rustc_errors::DiagArgFromDisplay;
2use rustc_errors::codes::*;
3use rustc_macros::{Diagnostic, Subdiagnostic};
4use rustc_span::{Ident, Span, Symbol};
5
6#[derive(Diagnostic)]
7#[diag(ast_lowering_generic_type_with_parentheses, code = E0214)]
8pub(crate) struct GenericTypeWithParentheses {
9    #[primary_span]
10    #[label]
11    pub span: Span,
12    #[subdiagnostic]
13    pub sub: Option<UseAngleBrackets>,
14}
15
16#[derive(Subdiagnostic)]
17#[multipart_suggestion(ast_lowering_use_angle_brackets, applicability = "maybe-incorrect")]
18pub(crate) struct UseAngleBrackets {
19    #[suggestion_part(code = "<")]
20    pub open_param: Span,
21    #[suggestion_part(code = ">")]
22    pub close_param: Span,
23}
24
25#[derive(Diagnostic)]
26#[diag(ast_lowering_invalid_abi, code = E0703)]
27#[note]
28pub(crate) struct InvalidAbi {
29    #[primary_span]
30    #[label]
31    pub span: Span,
32    pub abi: Symbol,
33    pub command: String,
34    #[subdiagnostic]
35    pub suggestion: Option<InvalidAbiSuggestion>,
36}
37
38#[derive(Diagnostic)]
39#[diag(ast_lowering_default_field_in_tuple)]
40pub(crate) struct TupleStructWithDefault {
41    #[primary_span]
42    #[label]
43    pub span: Span,
44}
45
46#[derive(Subdiagnostic)]
47#[suggestion(
48    ast_lowering_invalid_abi_suggestion,
49    code = "{suggestion}",
50    applicability = "maybe-incorrect"
51)]
52pub(crate) struct InvalidAbiSuggestion {
53    #[primary_span]
54    pub span: Span,
55    pub suggestion: String,
56}
57
58#[derive(Diagnostic)]
59#[diag(ast_lowering_assoc_ty_parentheses)]
60pub(crate) struct AssocTyParentheses {
61    #[primary_span]
62    pub span: Span,
63    #[subdiagnostic]
64    pub sub: AssocTyParenthesesSub,
65}
66
67#[derive(Subdiagnostic)]
68pub(crate) enum AssocTyParenthesesSub {
69    #[multipart_suggestion(ast_lowering_remove_parentheses)]
70    Empty {
71        #[suggestion_part(code = "")]
72        parentheses_span: Span,
73    },
74    #[multipart_suggestion(ast_lowering_use_angle_brackets)]
75    NotEmpty {
76        #[suggestion_part(code = "<")]
77        open_param: Span,
78        #[suggestion_part(code = ">")]
79        close_param: Span,
80    },
81}
82
83#[derive(Diagnostic)]
84#[diag(ast_lowering_misplaced_impl_trait, code = E0562)]
85#[note]
86pub(crate) struct MisplacedImplTrait<'a> {
87    #[primary_span]
88    pub span: Span,
89    pub position: DiagArgFromDisplay<'a>,
90}
91
92#[derive(Diagnostic)]
93#[diag(ast_lowering_assoc_ty_binding_in_dyn)]
94pub(crate) struct MisplacedAssocTyBinding {
95    #[primary_span]
96    pub span: Span,
97    #[suggestion(code = " = impl", applicability = "maybe-incorrect", style = "verbose")]
98    pub suggestion: Option<Span>,
99}
100
101#[derive(Diagnostic)]
102#[diag(ast_lowering_underscore_expr_lhs_assign)]
103pub(crate) struct UnderscoreExprLhsAssign {
104    #[primary_span]
105    #[label]
106    pub span: Span,
107}
108
109#[derive(Diagnostic)]
110#[diag(ast_lowering_await_only_in_async_fn_and_blocks, code = E0728)]
111pub(crate) struct AwaitOnlyInAsyncFnAndBlocks {
112    #[primary_span]
113    #[label]
114    pub await_kw_span: Span,
115    #[label(ast_lowering_this_not_async)]
116    pub item_span: Option<Span>,
117}
118
119#[derive(Diagnostic)]
120#[diag(ast_lowering_coroutine_too_many_parameters, code = E0628)]
121pub(crate) struct CoroutineTooManyParameters {
122    #[primary_span]
123    pub fn_decl_span: Span,
124}
125
126#[derive(Diagnostic)]
127#[diag(ast_lowering_closure_cannot_be_static, code = E0697)]
128pub(crate) struct ClosureCannotBeStatic {
129    #[primary_span]
130    pub fn_decl_span: Span,
131}
132
133#[derive(Diagnostic)]
134#[diag(ast_lowering_functional_record_update_destructuring_assignment)]
135pub(crate) struct FunctionalRecordUpdateDestructuringAssignment {
136    #[primary_span]
137    #[suggestion(code = "", applicability = "machine-applicable")]
138    pub span: Span,
139}
140
141#[derive(Diagnostic)]
142#[diag(ast_lowering_async_coroutines_not_supported, code = E0727)]
143pub(crate) struct AsyncCoroutinesNotSupported {
144    #[primary_span]
145    pub span: Span,
146}
147
148#[derive(Diagnostic)]
149#[diag(ast_lowering_inline_asm_unsupported_target, code = E0472)]
150pub(crate) struct InlineAsmUnsupportedTarget {
151    #[primary_span]
152    pub span: Span,
153}
154
155#[derive(Diagnostic)]
156#[diag(ast_lowering_att_syntax_only_x86)]
157pub(crate) struct AttSyntaxOnlyX86 {
158    #[primary_span]
159    pub span: Span,
160}
161
162#[derive(Diagnostic)]
163#[diag(ast_lowering_abi_specified_multiple_times)]
164pub(crate) struct AbiSpecifiedMultipleTimes {
165    #[primary_span]
166    pub abi_span: Span,
167    pub prev_name: Symbol,
168    #[label]
169    pub prev_span: Span,
170    #[note]
171    pub equivalent: bool,
172}
173
174#[derive(Diagnostic)]
175#[diag(ast_lowering_clobber_abi_not_supported)]
176pub(crate) struct ClobberAbiNotSupported {
177    #[primary_span]
178    pub abi_span: Span,
179}
180
181#[derive(Diagnostic)]
182#[note]
183#[diag(ast_lowering_invalid_abi_clobber_abi)]
184pub(crate) struct InvalidAbiClobberAbi {
185    #[primary_span]
186    pub abi_span: Span,
187    pub supported_abis: String,
188}
189
190#[derive(Diagnostic)]
191#[diag(ast_lowering_invalid_register)]
192pub(crate) struct InvalidRegister<'a> {
193    #[primary_span]
194    pub op_span: Span,
195    pub reg: Symbol,
196    pub error: &'a str,
197}
198
199#[derive(Diagnostic)]
200#[note]
201#[diag(ast_lowering_invalid_register_class)]
202pub(crate) struct InvalidRegisterClass {
203    #[primary_span]
204    pub op_span: Span,
205    pub reg_class: Symbol,
206    pub supported_register_classes: String,
207}
208
209#[derive(Diagnostic)]
210#[diag(ast_lowering_invalid_asm_template_modifier_reg_class)]
211pub(crate) struct InvalidAsmTemplateModifierRegClass {
212    #[primary_span]
213    #[label(ast_lowering_template_modifier)]
214    pub placeholder_span: Span,
215    #[label(ast_lowering_argument)]
216    pub op_span: Span,
217    #[subdiagnostic]
218    pub sub: InvalidAsmTemplateModifierRegClassSub,
219}
220
221#[derive(Subdiagnostic)]
222pub(crate) enum InvalidAsmTemplateModifierRegClassSub {
223    #[note(ast_lowering_support_modifiers)]
224    SupportModifier { class_name: Symbol, modifiers: String },
225    #[note(ast_lowering_does_not_support_modifiers)]
226    DoesNotSupportModifier { class_name: Symbol },
227}
228
229#[derive(Diagnostic)]
230#[diag(ast_lowering_invalid_asm_template_modifier_const)]
231pub(crate) struct InvalidAsmTemplateModifierConst {
232    #[primary_span]
233    #[label(ast_lowering_template_modifier)]
234    pub placeholder_span: Span,
235    #[label(ast_lowering_argument)]
236    pub op_span: Span,
237}
238
239#[derive(Diagnostic)]
240#[diag(ast_lowering_invalid_asm_template_modifier_sym)]
241pub(crate) struct InvalidAsmTemplateModifierSym {
242    #[primary_span]
243    #[label(ast_lowering_template_modifier)]
244    pub placeholder_span: Span,
245    #[label(ast_lowering_argument)]
246    pub op_span: Span,
247}
248
249#[derive(Diagnostic)]
250#[diag(ast_lowering_invalid_asm_template_modifier_label)]
251pub(crate) struct InvalidAsmTemplateModifierLabel {
252    #[primary_span]
253    #[label(ast_lowering_template_modifier)]
254    pub placeholder_span: Span,
255    #[label(ast_lowering_argument)]
256    pub op_span: Span,
257}
258
259#[derive(Diagnostic)]
260#[diag(ast_lowering_register_class_only_clobber)]
261pub(crate) struct RegisterClassOnlyClobber {
262    #[primary_span]
263    pub op_span: Span,
264    pub reg_class_name: Symbol,
265}
266
267#[derive(Diagnostic)]
268#[diag(ast_lowering_register_class_only_clobber_stable)]
269pub(crate) struct RegisterClassOnlyClobberStable {
270    #[primary_span]
271    pub op_span: Span,
272    pub reg_class_name: Symbol,
273}
274
275#[derive(Diagnostic)]
276#[diag(ast_lowering_register_conflict)]
277pub(crate) struct RegisterConflict<'a> {
278    #[primary_span]
279    #[label(ast_lowering_register1)]
280    pub op_span1: Span,
281    #[label(ast_lowering_register2)]
282    pub op_span2: Span,
283    pub reg1_name: &'a str,
284    pub reg2_name: &'a str,
285    #[help]
286    pub in_out: Option<Span>,
287}
288
289#[derive(Diagnostic)]
290#[help]
291#[diag(ast_lowering_sub_tuple_binding)]
292pub(crate) struct SubTupleBinding<'a> {
293    #[primary_span]
294    #[label]
295    #[suggestion(
296        ast_lowering_sub_tuple_binding_suggestion,
297        style = "verbose",
298        code = "..",
299        applicability = "maybe-incorrect"
300    )]
301    pub span: Span,
302    pub ident: Ident,
303    pub ident_name: Symbol,
304    pub ctx: &'a str,
305}
306
307#[derive(Diagnostic)]
308#[diag(ast_lowering_extra_double_dot)]
309pub(crate) struct ExtraDoubleDot<'a> {
310    #[primary_span]
311    #[label]
312    pub span: Span,
313    #[label(ast_lowering_previously_used_here)]
314    pub prev_span: Span,
315    pub ctx: &'a str,
316}
317
318#[derive(Diagnostic)]
319#[note]
320#[diag(ast_lowering_misplaced_double_dot)]
321pub(crate) struct MisplacedDoubleDot {
322    #[primary_span]
323    pub span: Span,
324}
325
326#[derive(Diagnostic)]
327#[diag(ast_lowering_misplaced_relax_trait_bound)]
328pub(crate) struct MisplacedRelaxTraitBound {
329    #[primary_span]
330    pub span: Span,
331}
332
333#[derive(Diagnostic)]
334#[diag(ast_lowering_match_arm_with_no_body)]
335pub(crate) struct MatchArmWithNoBody {
336    #[primary_span]
337    pub span: Span,
338    #[suggestion(code = " => todo!(),", applicability = "has-placeholders")]
339    pub suggestion: Span,
340}
341
342#[derive(Diagnostic)]
343#[diag(ast_lowering_never_pattern_with_body)]
344pub(crate) struct NeverPatternWithBody {
345    #[primary_span]
346    #[label]
347    #[suggestion(code = "", applicability = "maybe-incorrect")]
348    pub span: Span,
349}
350
351#[derive(Diagnostic)]
352#[diag(ast_lowering_never_pattern_with_guard)]
353pub(crate) struct NeverPatternWithGuard {
354    #[primary_span]
355    #[suggestion(code = "", applicability = "maybe-incorrect")]
356    pub span: Span,
357}
358
359#[derive(Diagnostic)]
360#[diag(ast_lowering_arbitrary_expression_in_pattern)]
361pub(crate) struct ArbitraryExpressionInPattern {
362    #[primary_span]
363    pub span: Span,
364    #[note(ast_lowering_pattern_from_macro_note)]
365    pub pattern_from_macro_note: bool,
366}
367
368#[derive(Diagnostic)]
369#[diag(ast_lowering_inclusive_range_with_no_end)]
370pub(crate) struct InclusiveRangeWithNoEnd {
371    #[primary_span]
372    pub span: Span,
373}
374
375#[derive(Diagnostic)]
376pub(crate) enum BadReturnTypeNotation {
377    #[diag(ast_lowering_bad_return_type_notation_inputs)]
378    Inputs {
379        #[primary_span]
380        #[suggestion(code = "()", applicability = "maybe-incorrect")]
381        span: Span,
382    },
383    #[diag(ast_lowering_bad_return_type_notation_output)]
384    Output {
385        #[primary_span]
386        #[suggestion(code = "", applicability = "maybe-incorrect")]
387        span: Span,
388    },
389    #[diag(ast_lowering_bad_return_type_notation_needs_dots)]
390    NeedsDots {
391        #[primary_span]
392        #[suggestion(code = "(..)", applicability = "maybe-incorrect")]
393        span: Span,
394    },
395    #[diag(ast_lowering_bad_return_type_notation_position)]
396    Position {
397        #[primary_span]
398        span: Span,
399    },
400}
401
402#[derive(Diagnostic)]
403#[diag(ast_lowering_generic_param_default_in_binder)]
404pub(crate) struct GenericParamDefaultInBinder {
405    #[primary_span]
406    pub span: Span,
407}
408
409#[derive(Diagnostic)]
410#[diag(ast_lowering_async_bound_not_on_trait)]
411pub(crate) struct AsyncBoundNotOnTrait {
412    #[primary_span]
413    pub span: Span,
414    pub descr: &'static str,
415}
416
417#[derive(Diagnostic)]
418#[diag(ast_lowering_async_bound_only_for_fn_traits)]
419pub(crate) struct AsyncBoundOnlyForFnTraits {
420    #[primary_span]
421    pub span: Span,
422}
423
424#[derive(Diagnostic)]
425#[diag(ast_lowering_no_precise_captures_on_apit)]
426pub(crate) struct NoPreciseCapturesOnApit {
427    #[primary_span]
428    pub span: Span,
429}
430
431#[derive(Diagnostic)]
432#[diag(ast_lowering_no_precise_captures_on_rpitit)]
433#[note]
434pub(crate) struct NoPreciseCapturesOnRpitit {
435    #[primary_span]
436    pub span: Span,
437}
438
439#[derive(Diagnostic)]
440#[diag(ast_lowering_yield_in_closure)]
441pub(crate) struct YieldInClosure {
442    #[primary_span]
443    pub span: Span,
444    #[suggestion(code = "#[coroutine] ", applicability = "maybe-incorrect", style = "verbose")]
445    pub suggestion: Option<Span>,
446}
447
448#[derive(Diagnostic)]
449#[diag(ast_lowering_invalid_legacy_const_generic_arg)]
450pub(crate) struct InvalidLegacyConstGenericArg {
451    #[primary_span]
452    pub span: Span,
453    #[subdiagnostic]
454    pub suggestion: UseConstGenericArg,
455}
456
457#[derive(Subdiagnostic)]
458#[multipart_suggestion(
459    ast_lowering_invalid_legacy_const_generic_arg_suggestion,
460    applicability = "maybe-incorrect"
461)]
462pub(crate) struct UseConstGenericArg {
463    #[suggestion_part(code = "::<{const_args}>")]
464    pub end_of_fn: Span,
465    pub const_args: String,
466    pub other_args: String,
467    #[suggestion_part(code = "{other_args}")]
468    pub call_args: Span,
469}