summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-07 14:25:19 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-07 14:25:19 +0800
commita552db72d08fa2b65444210765ab980933efd82e (patch)
tree218340997fe430aa910e84770b78bc970b173090 /src
parent4cc6a2e6c83a9578fbee858affaf4932bfa13cd5 (diff)
downloadmrust-a552db72d08fa2b65444210765ab980933efd82e.tar.gz
MIR From HIR - Enum variant _PathValue support hacked in
Diffstat (limited to 'src')
-rw-r--r--src/mir/from_hir.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/src/mir/from_hir.cpp b/src/mir/from_hir.cpp
index 94df9164..8ff72d50 100644
--- a/src/mir/from_hir.cpp
+++ b/src/mir/from_hir.cpp
@@ -1348,6 +1348,23 @@ namespace {
TRACE_FUNCTION_F("_PathValue - " << node.m_path);
TU_MATCH( ::HIR::Path::Data, (node.m_path.m_data), (pe),
(Generic,
+ if( node.m_target == ::HIR::ExprNode_PathValue::ENUM_VAR_CONSTR ) {
+ auto enum_path = pe.m_path;
+ enum_path.m_components.pop_back();
+ const auto& var_name = pe.m_path.m_components.back();
+
+ const auto& enm = m_builder.crate().get_enum_by_path(sp, enum_path);
+ auto var_it = ::std::find_if(enm.m_variants.begin(), enm.m_variants.end(), [&](const auto& x){ return x.first == var_name; });
+ ASSERT_BUG(sp, var_it != enm.m_variants.end(), "Variant " << pe.m_path << " isn't present");
+ const auto& var = var_it->second;
+ ASSERT_BUG(sp, var.is_Tuple(), "Variant " << pe.m_path << " isn't a tuple variant");
+
+ // TODO: Ideally, the creation of the wrapper function would happen somewhere before this?
+ auto tmp = m_builder.new_temporary( node.m_res_type );
+ m_builder.push_stmt_assign( sp, tmp.clone(), ::MIR::Constant::make_ItemAddr(node.m_path.clone()) );
+ m_builder.set_result( sp, mv$(tmp) );
+ return ;
+ }
const auto& vi = m_builder.crate().get_valitem_by_path(node.span(), pe.m_path);
TU_MATCHA( (vi), (e),
(Import,
@@ -1370,6 +1387,7 @@ namespace {
),
(Function,
// TODO: Why not use the result type?
+ //auto monomorph_cb = monomorphise_type_get_cb(sp, nullptr, nullptr, &pe.m_params);
auto monomorph_cb = [&](const auto& gt)->const auto& {
const auto& e = gt.m_data.as_Generic();
if( e.binding == 0xFFFF ) {