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}