diff options
author | John Hodge <tpg@mutabah.net> | 2016-09-18 09:52:28 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-09-18 09:52:28 +0800 |
commit | 95ea85ee5bf1403e3badcb9d890cf848c845ace0 (patch) | |
tree | 381e198ba0067bc993054e985326929293de6282 /src/hir/expr.hpp | |
parent | b049dd7d36b991bb95f273d862f95f0865c929c2 (diff) | |
download | mrust-95ea85ee5bf1403e3badcb9d890cf848c845ace0.tar.gz |
HIR - Rework to include a node for in/box (for better type inferrence)
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); |