@@ -135,25 +135,24 @@ pub fn parse_asm_args<'a>(
135
135
None
136
136
} ;
137
137
138
- let mut explicit_reg = false ;
139
138
let op = if eat_operand_keyword ( p, exp ! ( In ) , asm_macro) ? {
140
- let reg = parse_reg ( p, & mut explicit_reg ) ?;
139
+ let reg = parse_reg ( p) ?;
141
140
if p. eat_keyword ( exp ! ( Underscore ) ) {
142
141
let err = dcx. create_err ( errors:: AsmUnderscoreInput { span : p. token . span } ) ;
143
142
return Err ( err) ;
144
143
}
145
144
let expr = p. parse_expr ( ) ?;
146
145
ast:: InlineAsmOperand :: In { reg, expr }
147
146
} else if eat_operand_keyword ( p, exp ! ( Out ) , asm_macro) ? {
148
- let reg = parse_reg ( p, & mut explicit_reg ) ?;
147
+ let reg = parse_reg ( p) ?;
149
148
let expr = if p. eat_keyword ( exp ! ( Underscore ) ) { None } else { Some ( p. parse_expr ( ) ?) } ;
150
149
ast:: InlineAsmOperand :: Out { reg, expr, late : false }
151
150
} else if eat_operand_keyword ( p, exp ! ( Lateout ) , asm_macro) ? {
152
- let reg = parse_reg ( p, & mut explicit_reg ) ?;
151
+ let reg = parse_reg ( p) ?;
153
152
let expr = if p. eat_keyword ( exp ! ( Underscore ) ) { None } else { Some ( p. parse_expr ( ) ?) } ;
154
153
ast:: InlineAsmOperand :: Out { reg, expr, late : true }
155
154
} else if eat_operand_keyword ( p, exp ! ( Inout ) , asm_macro) ? {
156
- let reg = parse_reg ( p, & mut explicit_reg ) ?;
155
+ let reg = parse_reg ( p) ?;
157
156
if p. eat_keyword ( exp ! ( Underscore ) ) {
158
157
let err = dcx. create_err ( errors:: AsmUnderscoreInput { span : p. token . span } ) ;
159
158
return Err ( err) ;
@@ -167,7 +166,7 @@ pub fn parse_asm_args<'a>(
167
166
ast:: InlineAsmOperand :: InOut { reg, expr, late : false }
168
167
}
169
168
} else if eat_operand_keyword ( p, exp ! ( Inlateout ) , asm_macro) ? {
170
- let reg = parse_reg ( p, & mut explicit_reg ) ?;
169
+ let reg = parse_reg ( p) ?;
171
170
if p. eat_keyword ( exp ! ( Underscore ) ) {
172
171
let err = dcx. create_err ( errors:: AsmUnderscoreInput { span : p. token . span } ) ;
173
172
return Err ( err) ;
@@ -223,6 +222,8 @@ pub fn parse_asm_args<'a>(
223
222
p. unexpected_any ( ) ?
224
223
} ;
225
224
225
+ let explicit_reg = matches ! ( op. reg( ) , Some ( ast:: InlineAsmRegOrRegClass :: Reg ( _) ) ) ;
226
+
226
227
allow_templates = false ;
227
228
let span = span_start. to ( p. prev_token . span ) ;
228
229
let slot = args. operands . len ( ) ;
@@ -231,6 +232,7 @@ pub fn parse_asm_args<'a>(
231
232
// Validate the order of named, positional & explicit register operands and
232
233
// clobber_abi/options. We do this at the end once we have the full span
233
234
// of the argument available.
235
+
234
236
if explicit_reg {
235
237
if name. is_some ( ) {
236
238
dcx. emit_err ( errors:: AsmExplicitRegisterName { span } ) ;
@@ -478,15 +480,11 @@ fn parse_clobber_abi<'a>(p: &mut Parser<'a>, args: &mut AsmArgs) -> PResult<'a,
478
480
Ok ( ( ) )
479
481
}
480
482
481
- fn parse_reg < ' a > (
482
- p : & mut Parser < ' a > ,
483
- explicit_reg : & mut bool ,
484
- ) -> PResult < ' a , ast:: InlineAsmRegOrRegClass > {
483
+ fn parse_reg < ' a > ( p : & mut Parser < ' a > ) -> PResult < ' a , ast:: InlineAsmRegOrRegClass > {
485
484
p. expect ( exp ! ( OpenParen ) ) ?;
486
485
let result = match p. token . uninterpolate ( ) . kind {
487
486
token:: Ident ( name, IdentIsRaw :: No ) => ast:: InlineAsmRegOrRegClass :: RegClass ( name) ,
488
487
token:: Literal ( token:: Lit { kind : token:: LitKind :: Str , symbol, suffix : _ } ) => {
489
- * explicit_reg = true ;
490
488
ast:: InlineAsmRegOrRegClass :: Reg ( symbol)
491
489
}
492
490
_ => {
0 commit comments