summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ast/expr.cpp2
-rw-r--r--src/ast/expr.hpp2
-rw-r--r--src/dump_as_rust.cpp1
-rw-r--r--src/parse/expr.cpp10
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) );