summaryrefslogtreecommitdiff
path: root/src/hir/from_ast_expr.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-11-19 22:46:14 +0800
committerJohn Hodge <tpg@mutabah.net>2016-11-19 22:46:14 +0800
commitcf499efccf021db06630b76224bcb68dcf923975 (patch)
treef64e891cb31ed6f886a83b110b94fed718cb9011 /src/hir/from_ast_expr.cpp
parent5fe7fcc580db497b267ca0f820e5d3268fe8aafb (diff)
downloadmrust-cf499efccf021db06630b76224bcb68dcf923975.tar.gz
HIR - Union handling
Diffstat (limited to 'src/hir/from_ast_expr.cpp')
-rw-r--r--src/hir/from_ast_expr.cpp34
1 files changed, 25 insertions, 9 deletions
diff --git a/src/hir/from_ast_expr.cpp b/src/hir/from_ast_expr.cpp
index 21024dd7..4c10e91a 100644
--- a/src/hir/from_ast_expr.cpp
+++ b/src/hir/from_ast_expr.cpp
@@ -537,15 +537,31 @@ struct LowerHIR_ExprNode_Visitor:
) );
}
virtual void visit(::AST::ExprNode_StructLiteral& v) override {
- ::HIR::ExprNode_StructLiteral::t_values values;
- for(const auto& val : v.m_values)
- values.push_back( ::std::make_pair(val.first, LowerHIR_ExprNode_Inner(*val.second)) );
- m_rv.reset( new ::HIR::ExprNode_StructLiteral( v.span(),
- LowerHIR_GenericPath(v.get_pos(), v.m_path),
- ! v.m_path.binding().is_EnumVar(),
- LowerHIR_ExprNode_Inner_Opt(v.m_base_value.get()),
- mv$(values)
- ) );
+ if( v.m_path.binding().is_Union() )
+ {
+ if( v.m_values.size() != 1 )
+ ERROR(v.span(), E0000, "Union constructors can only specify a single field");
+ if( v.m_base_value )
+ ERROR(v.span(), E0000, "Union constructors can't take a base value");
+
+ m_rv.reset( new ::HIR::ExprNode_UnionLiteral( v.span(),
+ LowerHIR_GenericPath(v.get_pos(), v.m_path),
+ v.m_values[0].first,
+ LowerHIR_ExprNode_Inner(*v.m_values[0].second)
+ ) );
+ }
+ else
+ {
+ ::HIR::ExprNode_StructLiteral::t_values values;
+ for(const auto& val : v.m_values)
+ values.push_back( ::std::make_pair(val.first, LowerHIR_ExprNode_Inner(*val.second)) );
+ m_rv.reset( new ::HIR::ExprNode_StructLiteral( v.span(),
+ LowerHIR_GenericPath(v.get_pos(), v.m_path),
+ ! v.m_path.binding().is_EnumVar(),
+ LowerHIR_ExprNode_Inner_Opt(v.m_base_value.get()),
+ mv$(values)
+ ) );
+ }
}
virtual void visit(::AST::ExprNode_Array& v) override {
if( v.m_size )