summaryrefslogtreecommitdiff
path: root/src/hir/expr.hpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-09-18 09:52:28 +0800
committerJohn Hodge <tpg@mutabah.net>2016-09-18 09:52:28 +0800
commit95ea85ee5bf1403e3badcb9d890cf848c845ace0 (patch)
tree381e198ba0067bc993054e985326929293de6282 /src/hir/expr.hpp
parentb049dd7d36b991bb95f273d862f95f0865c929c2 (diff)
downloadmrust-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.hpp32
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);