diff options
author | John Hodge <tpg@mutabah.net> | 2016-11-19 22:46:14 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-11-19 22:46:14 +0800 |
commit | cf499efccf021db06630b76224bcb68dcf923975 (patch) | |
tree | f64e891cb31ed6f886a83b110b94fed718cb9011 /src/hir/from_ast_expr.cpp | |
parent | 5fe7fcc580db497b267ca0f820e5d3268fe8aafb (diff) | |
download | mrust-cf499efccf021db06630b76224bcb68dcf923975.tar.gz |
HIR - Union handling
Diffstat (limited to 'src/hir/from_ast_expr.cpp')
-rw-r--r-- | src/hir/from_ast_expr.cpp | 34 |
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 ) |