@@ -3,7 +3,7 @@ use rustc_ast::ptr::P;
3
3
use rustc_ast:: token:: { self , Delimiter } ;
4
4
use rustc_ast:: tokenstream:: TokenStream ;
5
5
use rustc_data_structures:: fx:: { FxHashMap , FxHashSet } ;
6
- use rustc_errors:: { Applicability , PResult } ;
6
+ use rustc_errors:: PResult ;
7
7
use rustc_expand:: base:: { self , * } ;
8
8
use rustc_parse:: parser:: Parser ;
9
9
use rustc_parse_format as parse;
@@ -49,7 +49,7 @@ pub fn parse_asm_args<'a>(
49
49
let diag = & sess. span_diagnostic ;
50
50
51
51
if p. token == token:: Eof {
52
- return Err ( diag. struct_span_err ( sp , "requires at least a template string argument" ) ) ;
52
+ return Err ( diag. create_err ( errors :: AsmRequiresTemplate { span : sp } ) ) ;
53
53
}
54
54
55
55
let first_template = p. parse_expr ( ) ?;
@@ -68,8 +68,7 @@ pub fn parse_asm_args<'a>(
68
68
if !p. eat ( & token:: Comma ) {
69
69
if allow_templates {
70
70
// After a template string, we always expect *only* a comma...
71
- let mut err = diag. struct_span_err ( p. token . span , "expected token: `,`" ) ;
72
- err. span_label ( p. token . span , "expected `,`" ) ;
71
+ let mut err = diag. create_err ( errors:: AsmExpectedComma { span : p. token . span } ) ;
73
72
p. maybe_annotate_with_ascription ( & mut err, false ) ;
74
73
return Err ( err) ;
75
74
} else {
@@ -112,7 +111,7 @@ pub fn parse_asm_args<'a>(
112
111
let op = if !is_global_asm && p. eat_keyword ( kw:: In ) {
113
112
let reg = parse_reg ( p, & mut explicit_reg) ?;
114
113
if p. eat_keyword ( kw:: Underscore ) {
115
- let err = diag. struct_span_err ( p. token . span , "_ cannot be used for input operands" ) ;
114
+ let err = diag. create_err ( errors :: AsmUnderscoreInput { span : p. token . span } ) ;
116
115
return Err ( err) ;
117
116
}
118
117
let expr = p. parse_expr ( ) ?;
@@ -128,7 +127,7 @@ pub fn parse_asm_args<'a>(
128
127
} else if !is_global_asm && p. eat_keyword ( sym:: inout) {
129
128
let reg = parse_reg ( p, & mut explicit_reg) ?;
130
129
if p. eat_keyword ( kw:: Underscore ) {
131
- let err = diag. struct_span_err ( p. token . span , "_ cannot be used for input operands" ) ;
130
+ let err = diag. create_err ( errors :: AsmUnderscoreInput { span : p. token . span } ) ;
132
131
return Err ( err) ;
133
132
}
134
133
let expr = p. parse_expr ( ) ?;
@@ -142,7 +141,7 @@ pub fn parse_asm_args<'a>(
142
141
} else if !is_global_asm && p. eat_keyword ( sym:: inlateout) {
143
142
let reg = parse_reg ( p, & mut explicit_reg) ?;
144
143
if p. eat_keyword ( kw:: Underscore ) {
145
- let err = diag. struct_span_err ( p. token . span , "_ cannot be used for input operands" ) ;
144
+ let err = diag. create_err ( errors :: AsmUnderscoreInput { span : p. token . span } ) ;
146
145
return Err ( err) ;
147
146
}
148
147
let expr = p. parse_expr ( ) ?;
@@ -160,7 +159,7 @@ pub fn parse_asm_args<'a>(
160
159
let expr = p. parse_expr ( ) ?;
161
160
let ast:: ExprKind :: Path ( qself, path) = & expr. kind else {
162
161
let err = diag
163
- . struct_span_err ( expr. span , "expected a path for argument to `sym`" ) ;
162
+ . create_err ( errors :: AsmSymNoPath { span : expr. span } ) ;
164
163
return Err ( err) ;
165
164
} ;
166
165
let sym = ast:: InlineAsmSym {
@@ -181,13 +180,10 @@ pub fn parse_asm_args<'a>(
181
180
) => { }
182
181
ast:: ExprKind :: MacCall ( ..) => { }
183
182
_ => {
184
- let errstr = if is_global_asm {
185
- "expected operand, options, or additional template string"
186
- } else {
187
- "expected operand, clobber_abi, options, or additional template string"
188
- } ;
189
- let mut err = diag. struct_span_err ( template. span , errstr) ;
190
- err. span_label ( template. span , errstr) ;
183
+ let err = diag. create_err ( errors:: AsmExpectedOther {
184
+ span : template. span ,
185
+ is_global_asm,
186
+ } ) ;
191
187
return Err ( err) ;
192
188
}
193
189
}
@@ -212,28 +208,16 @@ pub fn parse_asm_args<'a>(
212
208
args. reg_args . insert ( slot) ;
213
209
} else if let Some ( name) = name {
214
210
if let Some ( & prev) = args. named_args . get ( & name) {
215
- diag. struct_span_err ( span, & format ! ( "duplicate argument named `{}`" , name) )
216
- . span_label ( args. operands [ prev] . 1 , "previously here" )
217
- . span_label ( span, "duplicate argument" )
218
- . emit ( ) ;
211
+ diag. emit_err ( errors:: AsmDuplicateArg { span, name, prev : args. operands [ prev] . 1 } ) ;
219
212
continue ;
220
213
}
221
214
args. named_args . insert ( name, slot) ;
222
215
} else {
223
216
if !args. named_args . is_empty ( ) || !args. reg_args . is_empty ( ) {
224
- let mut err = diag. struct_span_err (
225
- span,
226
- "positional arguments cannot follow named arguments \
227
- or explicit register arguments",
228
- ) ;
229
- err. span_label ( span, "positional argument" ) ;
230
- for pos in args. named_args . values ( ) {
231
- err. span_label ( args. operands [ * pos] . 1 , "named argument" ) ;
232
- }
233
- for pos in & args. reg_args {
234
- err. span_label ( args. operands [ * pos] . 1 , "explicit register argument" ) ;
235
- }
236
- err. emit ( ) ;
217
+ let named = args. named_args . values ( ) . map ( |p| args. operands [ * p] . 1 ) . collect ( ) ;
218
+ let explicit = args. reg_args . iter ( ) . map ( |p| args. operands [ * p] . 1 ) . collect ( ) ;
219
+
220
+ diag. emit_err ( errors:: AsmPositionalAfter { span, named, explicit } ) ;
237
221
}
238
222
}
239
223
}
@@ -284,34 +268,25 @@ pub fn parse_asm_args<'a>(
284
268
diag. emit_err ( errors:: AsmPureNoOutput { spans : args. options_spans . clone ( ) } ) ;
285
269
}
286
270
if args. options . contains ( ast:: InlineAsmOptions :: NORETURN ) && !outputs_sp. is_empty ( ) {
287
- let err = diag
288
- . struct_span_err ( outputs_sp, "asm outputs are not allowed with the `noreturn` option" ) ;
289
-
271
+ let err = diag. create_err ( errors:: AsmNoReturn { outputs_sp } ) ;
290
272
// Bail out now since this is likely to confuse MIR
291
273
return Err ( err) ;
292
274
}
293
275
294
276
if args. clobber_abis . len ( ) > 0 {
295
277
if is_global_asm {
296
- let err = diag. struct_span_err (
297
- args. clobber_abis . iter ( ) . map ( |( _, span) | * span) . collect :: < Vec < Span > > ( ) ,
298
- "`clobber_abi` cannot be used with `global_asm!`" ,
299
- ) ;
278
+ let err = diag. create_err ( errors:: GlobalAsmClobberAbi {
279
+ spans : args. clobber_abis . iter ( ) . map ( |( _, span) | * span) . collect ( ) ,
280
+ } ) ;
300
281
301
282
// Bail out now since this is likely to confuse later stages
302
283
return Err ( err) ;
303
284
}
304
285
if !regclass_outputs. is_empty ( ) {
305
- diag. struct_span_err (
306
- regclass_outputs. clone ( ) ,
307
- "asm with `clobber_abi` must specify explicit registers for outputs" ,
308
- )
309
- . span_labels (
310
- args. clobber_abis . iter ( ) . map ( |( _, span) | * span) . collect :: < Vec < Span > > ( ) ,
311
- "clobber_abi" ,
312
- )
313
- . span_labels ( regclass_outputs, "generic outputs" )
314
- . emit ( ) ;
286
+ diag. emit_err ( errors:: AsmClobberNoReg {
287
+ spans : regclass_outputs,
288
+ clobbers : args. clobber_abis . iter ( ) . map ( |( _, span) | * span) . collect ( ) ,
289
+ } ) ;
315
290
}
316
291
}
317
292
@@ -323,25 +298,9 @@ pub fn parse_asm_args<'a>(
323
298
/// This function must be called immediately after the option token is parsed.
324
299
/// Otherwise, the suggestion will be incorrect.
325
300
fn err_duplicate_option ( p : & mut Parser < ' _ > , symbol : Symbol , span : Span ) {
326
- let mut err = p
327
- . sess
328
- . span_diagnostic
329
- . struct_span_err ( span, & format ! ( "the `{}` option was already provided" , symbol) ) ;
330
- err. span_label ( span, "this option was already provided" ) ;
331
-
332
301
// Tool-only output
333
- let mut full_span = span;
334
- if p. token . kind == token:: Comma {
335
- full_span = full_span. to ( p. token . span ) ;
336
- }
337
- err. tool_only_span_suggestion (
338
- full_span,
339
- "remove this option" ,
340
- "" ,
341
- Applicability :: MachineApplicable ,
342
- ) ;
343
-
344
- err. emit ( ) ;
302
+ let full_span = if p. token . kind == token:: Comma { span. to ( p. token . span ) } else { span } ;
303
+ p. sess . span_diagnostic . emit_err ( errors:: AsmOptAlreadyprovided { span, symbol, full_span } ) ;
345
304
}
346
305
347
306
/// Try to set the provided option in the provided `AsmArgs`.
0 commit comments