diff options
author | John Hodge <tpg@mutabah.net> | 2017-01-29 21:54:31 +1100 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2017-01-29 21:54:31 +1100 |
commit | 2aa3519cdabf82b1db7cc1f4e8298b09f46ef95f (patch) | |
tree | 40c7ed0b4be2b55f8d054346a63a4271601b6909 /src/trans/codegen_c.cpp | |
parent | b1af572476b452c35bb6dbe9ea0fccd526156f0a (diff) | |
download | mrust-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.cpp | 12 |
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; |