// InlineAsmRegOrRegClass of reg or reg class
auto token = parser.peek_current_token ();
auto tok_id = token->get_id ();
-
- if (tok_id == IDENTIFIER)
+ AST::InlineAsmRegOrRegClass regClass;
+ if (parser.skip_token (IDENTIFIER))
{
// construct a InlineAsmRegOrRegClass
- AST::InlineAsmRegOrRegClass regClass;
regClass.type = RegType::RegClass;
regClass.regClass.Symbol = token->as_string ();
}
// construct a InlineAsmRegOrRegClass
// parse_format_string
+ regClass.type = RegType::Reg;
+ inlineAsmCtx.is_explicit = true;
+ regClass.regClass.Symbol = token->as_string ();
}
else
{
- // TODO
+ // TODO: This should emit error
+ // return
+ // Err(p.dcx().create_err(errors::ExpectedRegisterClassOrExplicitRegister
+ // {
+ // span: p.token.span,
+ // }));
}
if (!parser.skip_token (RIGHT_PAREN))
{
- // we expect a left parenthesis here, please return the correct error.
+ // TODO: we expect a left parenthesis here, please return the correct
+ // error.
return tl::nullopt;
}
- return tl::nullopt;
+ return regClass;
}
int
// };
using RegisterType = AST::InlineAsmOperand::RegisterType;
-
+ AST::InlineAsmOperand reg_operand;
auto token = parser.peek_current_token ();
auto iden_token = parser.peek_current_token ();
auto &inlineAsm = inlineAsmCtx.inlineAsm;
{}
else if (!is_global_asm && check_identifier (parser, "inlateout"))
{}
- else if (false && check_identifier (parser, "const"))
+ else if (parser.peek_current_token ()->get_id () == CONST)
{
+ rust_unreachable ();
// todo: Please handle const
}
else if (false && check_identifier (parser, "sym"))
{
return tl::nullopt;
}
- return tl::nullopt;
+ return reg_operand;
}
void
check_and_set (Parser<MacroInvocLexer> &parser, InlineAsmContext &inlineAsmCtx,
}
else
{
+ // TODO: we consumed comma, and there happens to also be a comma
+ // error should be: expected expression, found `,`
break;
}
parse_asm_arg (Parser<MacroInvocLexer> &p, TokenId last_token_id,
InlineAsmContext &inlineAsmCtx);
-tl::optional<AST::Fragment>
-parse_global_asm (location_t invoc_locus, AST::MacroInvocData &invoc);
-tl::optional<AST::Fragment>
-parse_nonglobal_asm (location_t invoc_locus, AST::MacroInvocData &invoc);
tl::optional<AST::Fragment>
parse_asm (location_t invoc_locus, AST::MacroInvocData &invoc,
bool is_global_asm);