diff options
-rw-r--r-- | src/ast/expr.cpp | 2 | ||||
-rw-r--r-- | src/ast/expr.hpp | 2 | ||||
-rw-r--r-- | src/dump_as_rust.cpp | 1 | ||||
-rw-r--r-- | src/parse/expr.cpp | 10 |
4 files changed, 15 insertions, 0 deletions
diff --git a/src/ast/expr.cpp b/src/ast/expr.cpp index dc0eb59f..104c6094 100644 --- a/src/ast/expr.cpp +++ b/src/ast/expr.cpp @@ -392,6 +392,7 @@ void operator%(::Serialiser& s, const ExprNode_BinOp::Type t) { _(MODULO); _(ADD); _(SUB); + _(PLACE_IN); #undef _ } } @@ -450,6 +451,7 @@ NODE(ExprNode_BinOp, { case ADD: os << "+"; break; case SUB: os << "-"; break; case RANGE: os << ".."; break; + case PLACE_IN: os << "<-"; break; } os << " " << *m_right << ")"; }) diff --git a/src/ast/expr.hpp b/src/ast/expr.hpp index 2b2a89f5..2d6016d7 100644 --- a/src/ast/expr.hpp +++ b/src/ast/expr.hpp @@ -527,6 +527,8 @@ struct ExprNode_BinOp: MODULO, ADD, SUB, + + PLACE_IN, // `in PLACE { expr }` or `PLACE <- expr` }; Type m_type; diff --git a/src/dump_as_rust.cpp b/src/dump_as_rust.cpp index 86439115..fc338267 100644 --- a/src/dump_as_rust.cpp +++ b/src/dump_as_rust.cpp @@ -485,6 +485,7 @@ public: case AST::ExprNode_BinOp::ADD: m_os << "+"; break; case AST::ExprNode_BinOp::SUB: m_os << "-"; break; case AST::ExprNode_BinOp::RANGE: m_os << ".."; break; + case AST::ExprNode_BinOp::PLACE_IN: m_os << "<-"; break; } m_os << " "; if( IS(*n.m_right, AST::ExprNode_BinOp) ) diff --git a/src/parse/expr.cpp b/src/parse/expr.cpp index 152946bc..9330d925 100644 --- a/src/parse/expr.cpp +++ b/src/parse/expr.cpp @@ -629,6 +629,7 @@ bool Parse_IsTokValue(eTokenType tok_type) case TOK_RWORD_SELF:
case TOK_RWORD_SUPER:
case TOK_RWORD_BOX:
+ case TOK_RWORD_IN:
case TOK_PAREN_OPEN:
case TOK_MACRO:
@@ -781,6 +782,15 @@ ExprNodeP Parse_Expr12(TokenStream& lex) return NEWNODE( AST::ExprNode_Deref, Parse_Expr12(lex) );
case TOK_RWORD_BOX:
return NEWNODE( AST::ExprNode_UniOp, AST::ExprNode_UniOp::BOX, Parse_Expr12(lex) );
+ case TOK_RWORD_IN: {
+ ExprNodeP dest;
+ {
+ SET_PARSE_FLAG(lex, disallow_struct_literal);
+ dest = Parse_Expr1(lex);
+ }
+ auto val = Parse_ExprBlockNode(lex);
+ return NEWNODE( AST::ExprNode_BinOp, AST::ExprNode_BinOp::PLACE_IN, mv$(dest), mv$(val));
+ }
case TOK_DOUBLE_AMP:
// HACK: Split && into & &
lex.putback( Token(TOK_AMP) );
|