diff options
Diffstat (limited to 'src/hir/expr.hpp')
-rw-r--r-- | src/hir/expr.hpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp index a912af9c..ba1066b9 100644 --- a/src/hir/expr.hpp +++ b/src/hir/expr.hpp @@ -354,6 +354,10 @@ struct ExprNode_Cast: NODE_METHODS(); }; +// Magical pointer unsizing operation: +// - `&[T; n] -> &[T]` +// - `&T -> &Trait` +// - `Box<T> -> Box<Trait>` struct ExprNode_Unsize: public ExprNode { @@ -380,6 +384,7 @@ struct ExprNode_Index: NODE_METHODS(); }; +// unary `*` struct ExprNode_Deref: public ExprNode { @@ -392,6 +397,31 @@ struct ExprNode_Deref: NODE_METHODS(); }; +/// `box` and `in`/`<-` +struct ExprNode_Emplace: + public ExprNode +{ + /// This influences the ops trait used + enum class Type { + Noop, // Hack to allow coercion - acts as a no-op node + Placer, + Boxer, + }; + + Type m_type; + ExprNodeP m_place; + ExprNodeP m_value; + + ExprNode_Emplace(Span sp, Type ty, ::HIR::ExprNodeP place, ::HIR::ExprNodeP val): + ExprNode( mv$(sp) ), + m_type(ty), + m_place( mv$(place) ), + m_value( mv$(val) ) + { + } + + NODE_METHODS(); +}; struct ExprNode_TupleVariant: public ExprNode @@ -751,6 +781,7 @@ public: NV(ExprNode_Unsize) // Coercion NV(ExprNode_Index) NV(ExprNode_Deref) + NV(ExprNode_Emplace) NV(ExprNode_TupleVariant); NV(ExprNode_CallPath); @@ -794,6 +825,7 @@ public: NV(ExprNode_Unsize) NV(ExprNode_Index) NV(ExprNode_Deref) + NV(ExprNode_Emplace) NV(ExprNode_TupleVariant); NV(ExprNode_CallPath); |