summaryrefslogtreecommitdiff
path: root/src/trans/codegen_c.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2017-01-29 21:54:31 +1100
committerJohn Hodge <tpg@mutabah.net>2017-01-29 21:54:31 +1100
commit2aa3519cdabf82b1db7cc1f4e8298b09f46ef95f (patch)
tree40c7ed0b4be2b55f8d054346a63a4271601b6909 /src/trans/codegen_c.cpp
parentb1af572476b452c35bb6dbe9ea0fccd526156f0a (diff)
downloadmrust-2aa3519cdabf82b1db7cc1f4e8298b09f46ef95f.tar.gz
Trans Codegen - Fix emision of enum literals
Diffstat (limited to 'src/trans/codegen_c.cpp')
-rw-r--r--src/trans/codegen_c.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 12c80a88..4ea2e54d 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -894,6 +894,7 @@ namespace {
(Variant,
MIR_ASSERT(*m_mir_res, ty.m_data.is_Path(), "");
MIR_ASSERT(*m_mir_res, ty.m_data.as_Path().binding.is_Enum(), "");
+ const auto& enm = *ty.m_data.as_Path().binding.as_Enum();
auto it = m_enum_repr_cache.find(ty.m_data.as_Path().path.m_data.as_Generic());
if( it != m_enum_repr_cache.end() )
{
@@ -906,6 +907,11 @@ namespace {
m_of << "}";
}
}
+ else if( enm.m_repr != ::HIR::Enum::Repr::Rust || ::std::all_of(enm.m_variants.begin(), enm.m_variants.end(), [](const auto& x){return x.second.is_Unit() || x.second.is_Value();}) )
+ {
+ MIR_ASSERT(*m_mir_res, e.vals.empty(), "Value-only enum with fields");
+ m_of << "{" << e.idx << "}";
+ }
else
{
m_of << "{" << e.idx << ", { .var_" << e.idx << " = {";
@@ -2631,6 +2637,7 @@ namespace {
(Variant,
MIR_ASSERT(*m_mir_res, ty.m_data.is_Path(), "");
MIR_ASSERT(*m_mir_res, ty.m_data.as_Path().binding.is_Enum(), "");
+ const auto& enm = *ty.m_data.as_Path().binding.as_Enum();
auto it = m_enum_repr_cache.find(ty.m_data.as_Path().path.m_data.as_Generic());
if( it != m_enum_repr_cache.end() )
{
@@ -2642,6 +2649,11 @@ namespace {
assign_from_literal([&](){ emit_dst(); m_of << "._0"; }, get_inner_type(e.idx, 0), e.vals[0]);
}
}
+ else if( enm.m_repr != ::HIR::Enum::Repr::Rust || ::std::all_of(enm.m_variants.begin(), enm.m_variants.end(), [](const auto& x){return x.second.is_Unit() || x.second.is_Value();}) )
+ {
+ MIR_ASSERT(*m_mir_res, e.vals.empty(), "Value-only enum with fields");
+ emit_dst(); m_of << ".TAG = " << e.idx;
+ }
else
{
emit_dst(); m_of << ".TAG = " << e.idx;