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