summaryrefslogtreecommitdiff
path: root/src/hir
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-08-01 17:19:37 +0800
committerJohn Hodge <tpg@mutabah.net>2016-08-01 17:19:37 +0800
commitc58fb6e0eb1b389faad2d706478ec15d77bfd868 (patch)
treea6e57bb49beb78b02c8dc2ce3f3b9dbcf046d313 /src/hir
parentf964995d23374ea110cf84145839bde77b824afe (diff)
downloadmrust-c58fb6e0eb1b389faad2d706478ec15d77bfd868.tar.gz
HIR - Support getting tuple struct constructors as function pointers
Diffstat (limited to 'src/hir')
-rw-r--r--src/hir/expr.hpp1
-rw-r--r--src/hir/from_ast_expr.cpp11
-rw-r--r--src/hir/type.hpp4
3 files changed, 13 insertions, 3 deletions
diff --git a/src/hir/expr.hpp b/src/hir/expr.hpp
index 300414b4..90ad27a7 100644
--- a/src/hir/expr.hpp
+++ b/src/hir/expr.hpp
@@ -548,6 +548,7 @@ struct ExprNode_PathValue:
enum Target {
UNKNOWN,
FUNCTION,
+ STRUCT_CONSTR,
STATIC,
CONSTANT,
};
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index a25fe7ae..d1f7e16e 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -555,7 +555,16 @@ struct LowerHIR_ExprNode_Visitor:
m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::UNKNOWN ) );
),
(Struct,
- m_rv.reset( new ::HIR::ExprNode_UnitVariant( v.span(), LowerHIR_GenericPath(Span(v.get_pos()), v.m_path), true ) );
+ // TODO: Check the form and emit a PathValue if not a unit
+ if( e.struct_->m_data.is_Struct() ) {
+ // ERROR.
+ }
+ else if( e.struct_->m_data.as_Tuple().ents.size() > 0 ) {
+ m_rv.reset( new ::HIR::ExprNode_PathValue( v.span(), LowerHIR_Path(Span(v.get_pos()), v.m_path), ::HIR::ExprNode_PathValue::STRUCT_CONSTR ) );
+ }
+ else {
+ m_rv.reset( new ::HIR::ExprNode_UnitVariant( v.span(), LowerHIR_GenericPath(Span(v.get_pos()), v.m_path), true ) );
+ }
),
(EnumVar,
m_rv.reset( new ::HIR::ExprNode_UnitVariant( v.span(), LowerHIR_GenericPath(Span(v.get_pos()), v.m_path), false ) );
diff --git a/src/hir/type.hpp b/src/hir/type.hpp
index 4f495fcd..549bf837 100644
--- a/src/hir/type.hpp
+++ b/src/hir/type.hpp
@@ -181,8 +181,8 @@ public:
TypeRef(::HIR::CoreType ct):
m_data( Data::make_Primitive(mv$(ct)) )
{}
- TypeRef(::HIR::Path p):
- m_data( Data::make_Path( {mv$(p), TypePathBinding()} ) )
+ TypeRef(::HIR::Path p, TypePathBinding pb=TypePathBinding()):
+ m_data( Data::make_Path( {mv$(p), mv$(pb)} ) )
{}
static TypeRef new_unit() {