@@ -289,21 +289,24 @@ fn parse_args<'a>(
289289 Ok ( args)
290290}
291291
292- fn warn_duplicate_option < ' a > ( p : & mut Parser < ' a > , span : Span ) {
293- let mut warn = if let Ok ( snippet) = p. sess . source_map ( ) . span_to_snippet ( span) {
292+ fn err_duplicate_option < ' a > ( p : & mut Parser < ' a > , span : Span ) {
293+ let mut err = if let Ok ( snippet) = p. sess . source_map ( ) . span_to_snippet ( span) {
294294 p. sess
295295 . span_diagnostic
296- . struct_span_warn ( span, & format ! ( "the `{}` option was already provided" , snippet) )
296+ . struct_span_err ( span, & format ! ( "the `{}` option was already provided" , snippet) )
297297 } else {
298- p. sess . span_diagnostic . struct_span_warn ( span, "this option was already provided" )
298+ p. sess . span_diagnostic . struct_span_err ( span, "this option was already provided" )
299299 } ;
300- warn. span_suggestion (
301- span,
302- "remove this option" ,
303- String :: new ( ) ,
304- Applicability :: MachineApplicable ,
305- ) ;
306- warn. emit ( ) ;
300+ err. span_help ( span, "remove this option" ) ;
301+ err. emit ( ) ;
302+ }
303+
304+ fn try_set_option < ' a > ( p : & mut Parser < ' a > , args : & mut AsmArgs , option : ast:: InlineAsmOptions ) {
305+ if !args. option_is_set ( option) {
306+ args. options |= option;
307+ } else {
308+ err_duplicate_option ( p, p. prev_token . span ) ;
309+ }
307310}
308311
309312fn parse_options < ' a > ( p : & mut Parser < ' a > , args : & mut AsmArgs ) -> Result < ( ) , DiagnosticBuilder < ' a > > {
@@ -313,48 +316,20 @@ fn parse_options<'a>(p: &mut Parser<'a>, args: &mut AsmArgs) -> Result<(), Diagn
313316
314317 while !p. eat ( & token:: CloseDelim ( token:: DelimToken :: Paren ) ) {
315318 if p. eat ( & token:: Ident ( sym:: pure, false ) ) {
316- if !args. option_is_set ( ast:: InlineAsmOptions :: PURE ) {
317- args. options |= ast:: InlineAsmOptions :: PURE ;
318- } else {
319- warn_duplicate_option ( p, p. prev_token . span ) ;
320- }
319+ try_set_option ( p, args, ast:: InlineAsmOptions :: PURE ) ;
321320 } else if p. eat ( & token:: Ident ( sym:: nomem, false ) ) {
322- if !args. option_is_set ( ast:: InlineAsmOptions :: NOMEM ) {
323- args. options |= ast:: InlineAsmOptions :: NOMEM ;
324- } else {
325- warn_duplicate_option ( p, p. prev_token . span ) ;
326- }
321+ try_set_option ( p, args, ast:: InlineAsmOptions :: NOMEM ) ;
327322 } else if p. eat ( & token:: Ident ( sym:: readonly, false ) ) {
328- if !args. option_is_set ( ast:: InlineAsmOptions :: READONLY ) {
329- args. options |= ast:: InlineAsmOptions :: READONLY ;
330- } else {
331- warn_duplicate_option ( p, p. prev_token . span ) ;
332- }
323+ try_set_option ( p, args, ast:: InlineAsmOptions :: READONLY ) ;
333324 } else if p. eat ( & token:: Ident ( sym:: preserves_flags, false ) ) {
334- if !args. option_is_set ( ast:: InlineAsmOptions :: PRESERVES_FLAGS ) {
335- args. options |= ast:: InlineAsmOptions :: PRESERVES_FLAGS ;
336- } else {
337- warn_duplicate_option ( p, p. prev_token . span ) ;
338- }
325+ try_set_option ( p, args, ast:: InlineAsmOptions :: PRESERVES_FLAGS ) ;
339326 } else if p. eat ( & token:: Ident ( sym:: noreturn, false ) ) {
340- if !args. option_is_set ( ast:: InlineAsmOptions :: NORETURN ) {
341- args. options |= ast:: InlineAsmOptions :: NORETURN ;
342- } else {
343- warn_duplicate_option ( p, p. prev_token . span ) ;
344- }
327+ try_set_option ( p, args, ast:: InlineAsmOptions :: NORETURN ) ;
345328 } else if p. eat ( & token:: Ident ( sym:: nostack, false ) ) {
346- if !args. option_is_set ( ast:: InlineAsmOptions :: NOSTACK ) {
347- args. options |= ast:: InlineAsmOptions :: NOSTACK ;
348- } else {
349- warn_duplicate_option ( p, p. prev_token . span ) ;
350- }
329+ try_set_option ( p, args, ast:: InlineAsmOptions :: NOSTACK ) ;
351330 } else {
352331 p. expect ( & token:: Ident ( sym:: att_syntax, false ) ) ?;
353- if !args. option_is_set ( ast:: InlineAsmOptions :: ATT_SYNTAX ) {
354- args. options |= ast:: InlineAsmOptions :: ATT_SYNTAX ;
355- } else {
356- warn_duplicate_option ( p, p. prev_token . span ) ;
357- }
332+ try_set_option ( p, args, ast:: InlineAsmOptions :: ATT_SYNTAX ) ;
358333 }
359334
360335 // Allow trailing commas
0 commit comments