Change:
The : pointed me to -- cc I see that there were regressions with during that review, but not exactly like what I'm seeing here. searched nightlies: from nightly-2020-09-28 to nightly-2020-10-04 regressed nightly: nightly-2020-09-30 searched commits: from to regressed commit: <details<summarybisected with <a href=''cargo-bisect-rustc</av0.5.2</summaryHost triple: x8664-unknown-linux-gnu Reproduce with: </details
It's probably relevant that the actual token is passed as an arch-conditional parameter here:
Yes, I've missed this case, sorry. Will fix soon.
Fixed in
Works for me, thanks!

Discussion:
} // accept trailing commas // Parse options <del> if p.eat(&token::Ident(sym::options, false)) { </del> <ins> if p.eat_keyword(sym::options) { </ins> parse_options(&mut p, &mut args)?; allow_templates = false; continue;

}; let mut explicit_reg = false; <del> let op = if p.eat(&token::Ident(kw::In, false)) { </del> <ins> let op = if p.eat_keyword(kw::In) { </ins> let reg = parse_reg(&mut p, &mut explicit_reg)?; let expr = p.parse_expr()?; ast::InlineAsmOperand::In { reg, expr } <del> } else if p.eat(&token::Ident(sym::out, false)) { </del> <ins> } else if p.eat_keyword(sym::out) { </ins> let reg = parse_reg(&mut p, &mut explicit_reg)?; let expr = if p.eat_keyword(kw::Underscore) { None } else { Some(p.parse_expr()?) }; ast::InlineAsmOperand::Out { reg, expr, late: false } <del> } else if p.eat(&token::Ident(sym::lateout, false)) { </del> <ins> } else if p.eat_keyword(sym::lateout) { </ins> let reg = parse_reg(&mut p, &mut explicit_reg)?; let expr = if p.eat_keyword(kw::Underscore) { None } else { Some(p.parse_expr()?) }; ast::InlineAsmOperand::Out { reg, expr, late: true } <del> } else if p.eat(&token::Ident(sym::inout, false)) { </del> <ins> } else if p.eat_keyword(sym::inout) { </ins> let reg = parse_reg(&mut p, &mut explicit_reg)?; let expr = p.parse_expr()?; if p.eat(&token::FatArrow) {

} else { ast::InlineAsmOperand::InOut { reg, expr, late: false } } <del> } else if p.eat(&token::Ident(sym::inlateout, false)) { </del> <ins> } else if p.eat_keyword(sym::inlateout) { </ins> let reg = parse_reg(&mut p, &mut explicit_reg)?; let expr = p.parse_expr()?; if p.eat(&token::FatArrow) {

} else { ast::InlineAsmOperand::InOut { reg, expr, late: true } } <del> } else if p.eat(&token::Ident(kw::Const, false)) { </del> <ins> } else if p.eat_keyword(kw::Const) { </ins> let expr = p.parse_expr()?; ast::InlineAsmOperand::Const { expr } <del> } else if p.eat(&token::Ident(sym::sym, false)) { </del> <ins> } else if p.eat_keyword(sym::sym) { </ins> let expr = p.parse_expr()?; match expr.kind { ast::ExprKind::Path(..) => {}

args.templates.push(template); continue; } else { <del> return Err(p.expect_one_of(&[], &[]).unwrap_err()); </del> <ins> return p.unexpected(); </ins> }; allow_templates = false;

p.expect(&token::OpenDelim(token::DelimToken::Paren))?; while !p.eat(&token::CloseDelim(token::DelimToken::Paren)) { <del> if p.eat(&token::Ident(sym::pure, false)) { </del> <ins> if p.eat_keyword(sym::pure) { </ins> try_set_option(p, args, sym::pure, ast::InlineAsmOptions::PURE); <del> } else if p.eat(&token::Ident(sym::nomem, false)) { </del> <ins> } else if p.eat_keyword(sym::nomem) { </ins> try_set_option(p, args, sym::nomem, ast::InlineAsmOptions::NOMEM); <del> } else if p.eat(&token::Ident(sym::readonly, false)) { </del> <ins> } else if p.eat_keyword(sym::readonly) { </ins> try_set_option(p, args, sym::readonly, ast::InlineAsmOptions::READONLY); <del> } else if p.eat(&token::Ident(sym::preserves_flags, false)) { </del> <ins> } else if p.eat_keyword(sym::preserves_flags) { </ins> try_set_option(p, args, sym::preserves_flags, ast::InlineAsmOptions::PRESERVES_FLAGS); <del> } else if p.eat(&token::Ident(sym::noreturn, false)) { </del> <ins> } else if p.eat_keyword(sym::noreturn) { </ins> try_set_option(p, args, sym::noreturn, ast::InlineAsmOptions::NORETURN); <del> } else if p.eat(&token::Ident(sym::nostack, false)) { </del> <ins> } else if p.eat_keyword(sym::nostack) { </ins> try_set_option(p, args, sym::nostack, ast::InlineAsmOptions::NOSTACK); <del> } else { p.expect(&token::Ident(sym::att_syntax, false))?; </del> <ins> } else if p.eat_keyword(sym::att_syntax) { </ins> try_set_option(p, args, sym::att_syntax, ast::InlineAsmOptions::ATT_SYNTAX); <ins> } else { return p.unexpected(); </ins> } // Allow trailing commas

}; if parser.token != token::Eof { <del> parser.expect_one_of(&[], &[])?; unreachable!(); </del> <ins> return parser.unexpected(); </ins> } Ok(Assert { cond_expr, custom_message })

next } <del> crate fn unexpected<T>(&mut self) -> PResult<'a, T> { </del> <ins> pub fn unexpected<T>(&mut self) -> PResult<'a, T> { </ins> match self.expect_one_of(&[], &[]) { Err(e) => Err(e), // We can get `Ok(true)` from `recover_closing_delimiter`

<ins> // only-x86_64 #![feature(asm)] macro_rules! m { ($in:ident $out:ident $lateout:ident $inout:ident $inlateout:ident $const:ident $sym:ident $pure:ident $nomem:ident $readonly:ident $preserves_flags:ident $noreturn:ident $nostack:ident $att_syntax:ident $options:ident) => { unsafe { asm!("", $in(x) x, $out(x) x, $lateout(x) x, $inout(x) x, $inlateout(x) x, //~^ ERROR asm outputs are not allowed with the `noreturn` option const x, sym x, $options($pure, $nomem, $readonly, $preserves_flags, $noreturn, $nostack, $att_syntax)); //~^ ERROR the `nomem` and `readonly` options are mutually exclusive //~| ERROR the `pure` and `noreturn` options are mutually exclusive } }; } fn main() { m!(in out lateout inout inlateout const sym pure nomem readonly preserves_flags noreturn nostack att_syntax options); } </ins>

<ins> error: the `nomem` and `readonly` options are mutually exclusive --> $DIR/interpolated-idents.rs:13:13 | LL |               $options($pure, $nomem, $readonly, $preserves_flags, $noreturn, $nostack, $att_syntax)); |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... LL | /     m!(in out lateout inout inlateout const sym LL | |        pure nomem readonly preserves_flags LL | |        noreturn nostack att_syntax options); | |____________________________________________- in this macro invocation | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: the `pure` and `noreturn` options are mutually exclusive --> $DIR/interpolated-idents.rs:13:13 | LL |               $options($pure, $nomem, $readonly, $preserves_flags, $noreturn, $nostack, $att_syntax)); |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ... LL | /     m!(in out lateout inout inlateout const sym LL | |        pure nomem readonly preserves_flags LL | |        noreturn nostack att_syntax options); | |____________________________________________- in this macro invocation | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: asm outputs are not allowed with the `noreturn` option --> $DIR/interpolated-idents.rs:10:32 | LL |               asm!("", $in(x) x, $out(x) x, $lateout(x) x, $inout(x) x, $inlateout(x) x, |                                  ^^^^^^^^^  ^^^^^^^^^^^^^  ^^^^^^^^^^^  ^^^^^^^^^^^^^^^ ... LL |       m!(in out lateout inout inlateout const sym |  _____- | |_____| | |_____| | |_____| | | LL | |        pure nomem readonly preserves_flags LL | |        noreturn nostack att_syntax options); | |                                            - | |____________________________________________| | |____________________________________________in this macro invocation | |____________________________________________in this macro invocation | |____________________________________________in this macro invocation |                                              in this macro invocation | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 3 previous errors </ins>