summaryrefslogtreecommitdiff
path: root/src/expand/asm.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2017-09-22 18:38:25 +0800
committerJohn Hodge <tpg@mutabah.net>2017-09-22 18:38:25 +0800
commit285116d4de4a866725f3ae9c3f282f07e5fac72e (patch)
tree0cae1ff6623d7853da93ff951f25ceb4d3673b31 /src/expand/asm.cpp
parentd0c9d063a1f19b64fa11c846a98d5ce46c1912d4 (diff)
downloadmrust-285116d4de4a866725f3ae9c3f282f07e5fac72e.tar.gz
Trans - Little fixes for MSVC 32-bit
Diffstat (limited to 'src/expand/asm.cpp')
-rw-r--r--src/expand/asm.cpp42
1 files changed, 38 insertions, 4 deletions
diff --git a/src/expand/asm.cpp b/src/expand/asm.cpp
index 6ca90f3e..336321f7 100644
--- a/src/expand/asm.cpp
+++ b/src/expand/asm.cpp
@@ -49,9 +49,12 @@ class CAsmExpander:
::std::vector<::std::string> flags;
// Outputs
- if( lex.lookahead(0) == TOK_COLON )
+ if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON )
{
GET_TOK(tok, lex);
+ if( tok.type() == TOK_DOUBLE_COLON ) {
+ lex.putback(Token(TOK_COLON));
+ }
while( lex.lookahead(0) == TOK_STRING )
{
@@ -73,9 +76,12 @@ class CAsmExpander:
}
// Inputs
- if( lex.lookahead(0) == TOK_COLON )
+ if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON )
{
GET_TOK(tok, lex);
+ if( tok.type() == TOK_DOUBLE_COLON ) {
+ lex.putback(Token(TOK_COLON));
+ }
while( lex.lookahead(0) == TOK_STRING )
{
@@ -95,9 +101,12 @@ class CAsmExpander:
}
// Clobbers
- if( lex.lookahead(0) == TOK_COLON )
+ if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON )
{
GET_TOK(tok, lex);
+ if( tok.type() == TOK_DOUBLE_COLON ) {
+ lex.putback(Token(TOK_COLON));
+ }
while( lex.lookahead(0) == TOK_STRING )
{
@@ -111,9 +120,12 @@ class CAsmExpander:
}
// Flags
- if( lex.lookahead(0) == TOK_COLON )
+ if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON )
{
GET_TOK(tok, lex);
+ if( tok.type() == TOK_DOUBLE_COLON ) {
+ lex.putback(Token(TOK_COLON));
+ }
while( lex.lookahead(0) == TOK_STRING )
{
@@ -126,6 +138,28 @@ class CAsmExpander:
}
}
+ if( lex.lookahead(0) == TOK_COLON || lex.lookahead(0) == TOK_DOUBLE_COLON )
+ {
+ GET_TOK(tok, lex);
+ if( tok.type() == TOK_DOUBLE_COLON ) {
+ lex.putback(Token(TOK_COLON));
+ }
+
+ if( GET_TOK(tok, lex) == TOK_IDENT && tok.str() == "volatile" )
+ {
+ flags.push_back( "volatile" );
+ }
+ else
+ {
+ PUTBACK(tok, lex);
+ }
+ }
+
+ if( lex.lookahead(0) != TOK_EOF )
+ {
+ ERROR(sp, E0000, "Unexpected token in asm! - " << lex.getToken());
+ }
+
::AST::ExprNodeP rv = ::AST::ExprNodeP( new ::AST::ExprNode_Asm { mv$(template_text), mv$(outputs), mv$(inputs), mv$(clobbers), mv$(flags) } );
// TODO: Convert this into an AST node
return box$( TTStreamO(TokenTree(Token( InterpolatedFragment(InterpolatedFragment::EXPR, rv.release()) ))));