@@ -19,7 +19,7 @@ struct AsmArgs {
1919    operands :  Vec < ( ast:: InlineAsmOperand ,  Span ) > , 
2020    named_args :  FxHashMap < Symbol ,  usize > , 
2121    reg_args :  FxHashSet < usize > , 
22-     clobber_abi :   Option < ( Symbol ,  Span ) > , 
22+     clobber_abis :   Vec < ( Symbol ,  Span ) > , 
2323    options :  ast:: InlineAsmOptions , 
2424    options_spans :  Vec < Span > , 
2525} 
@@ -64,7 +64,7 @@ fn parse_args<'a>(
6464        operands :  vec ! [ ] , 
6565        named_args :  FxHashMap :: default ( ) , 
6666        reg_args :  FxHashSet :: default ( ) , 
67-         clobber_abi :   None , 
67+         clobber_abis :   Vec :: new ( ) , 
6868        options :  ast:: InlineAsmOptions :: empty ( ) , 
6969        options_spans :  vec ! [ ] , 
7070    } ; 
@@ -210,7 +210,7 @@ fn parse_args<'a>(
210210                . span_labels ( args. options_spans . clone ( ) ,  "previous options" ) 
211211                . span_label ( span,  "argument" ) 
212212                . emit ( ) ; 
213-         }  else  if  let  Some ( ( _,  abi_span) )  = args. clobber_abi  { 
213+         }  else  if  let  Some ( & ( _,  abi_span) )  = args. clobber_abis . last ( )  { 
214214            ecx. struct_span_err ( span,  "arguments are not allowed after clobber_abi" ) 
215215                . span_label ( abi_span,  "clobber_abi" ) 
216216                . span_label ( span,  "argument" ) 
@@ -322,7 +322,7 @@ fn parse_args<'a>(
322322        // Bail out now since this is likely to confuse MIR 
323323        return  Err ( err) ; 
324324    } 
325-     if  let  Some ( ( _,  abi_span) )  = args. clobber_abi  { 
325+     if  let  Some ( & ( _,  abi_span) )  = args. clobber_abis . last ( )  { 
326326        if  is_global_asm { 
327327            let  err =
328328                ecx. struct_span_err ( abi_span,  "`clobber_abi` cannot be used with `global_asm!`" ) ; 
@@ -453,14 +453,7 @@ fn parse_clobber_abi<'a>(
453453
454454    let  new_span = span_start. to ( p. prev_token . span ) ; 
455455
456-     if  let  Some ( ( _,  prev_span) )  = args. clobber_abi  { 
457-         let  mut  err = p
458-             . sess 
459-             . span_diagnostic 
460-             . struct_span_err ( new_span,  "clobber_abi specified multiple times" ) ; 
461-         err. span_label ( prev_span,  "clobber_abi previously specified here" ) ; 
462-         return  Err ( err) ; 
463-     }  else  if  !args. options_spans . is_empty ( )  { 
456+     if  !args. options_spans . is_empty ( )  { 
464457        let  mut  err = p
465458            . sess 
466459            . span_diagnostic 
@@ -469,7 +462,7 @@ fn parse_clobber_abi<'a>(
469462        return  Err ( err) ; 
470463    } 
471464
472-     args. clobber_abi  =  Some ( ( clobber_abi,  new_span) ) ; 
465+     args. clobber_abis . push ( ( clobber_abi,  new_span) ) ; 
473466
474467    Ok ( ( ) ) 
475468} 
@@ -770,7 +763,7 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, args: AsmArgs) -> Option<ast::Inl
770763        template, 
771764        template_strs :  template_strs. into_boxed_slice ( ) , 
772765        operands :  args. operands , 
773-         clobber_abi :  args. clobber_abi , 
766+         clobber_abis :  args. clobber_abis , 
774767        options :  args. options , 
775768        line_spans, 
776769    } ) 
0 commit comments