summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/trans/codegen_c.cpp12
-rw-r--r--src/trans/target.cpp12
2 files changed, 19 insertions, 5 deletions
diff --git a/src/trans/codegen_c.cpp b/src/trans/codegen_c.cpp
index 1bf2d923..d208c2ca 100644
--- a/src/trans/codegen_c.cpp
+++ b/src/trans/codegen_c.cpp
@@ -1437,7 +1437,11 @@ namespace {
MIR_ASSERT(*m_mir_res, ty.m_data.as_Path().binding.is_Enum(), "");
const auto* repr = Target_GetTypeRepr(sp, m_resolve, ty);
const auto& enm = *ty.m_data.as_Path().binding.as_Enum();
- if( const auto* ve = repr->variants.opt_NonZero() )
+ if( repr->variants.is_None() )
+ {
+ m_of << "{}";
+ }
+ else if( const auto* ve = repr->variants.opt_NonZero() )
{
if( e.idx == ve->zero_variant )
{
@@ -2527,7 +2531,11 @@ namespace {
const auto& ty = mir_res.get_lvalue_type(tmp, e.dst);
auto* repr = Target_GetTypeRepr(sp, m_resolve, ty);
- if( const auto* re = repr->variants.opt_NonZero() )
+ if( repr->variants.is_None() )
+ {
+ emit_lvalue(e.dst); m_of << ".TAG = "; emit_param(ve.val);
+ }
+ else if( const auto* re = repr->variants.opt_NonZero() )
{
MIR_ASSERT(*m_mir_res, ve.index < 2, "");
if( ve.index == re->zero_variant ) {
diff --git a/src/trans/target.cpp b/src/trans/target.cpp
index 09fc45b7..61789a75 100644
--- a/src/trans/target.cpp
+++ b/src/trans/target.cpp
@@ -729,7 +729,14 @@ namespace {
{
vals.push_back(i);
}
- rv.variants = TypeRepr::VariantMode::make_Values({ { mono_types.size(), tag_size, {} }, ::std::move(vals) });
+ if( vals.size() > 1 )
+ {
+ rv.variants = TypeRepr::VariantMode::make_Values({ { mono_types.size(), tag_size, {} }, ::std::move(vals) });
+ }
+ else
+ {
+ // Leave the enum with NoVariants
+ }
if( max_align > 0 )
{
rv.size = (max_size + tag_size);
@@ -755,8 +762,7 @@ namespace {
case ::HIR::Enum::Repr::Rust:
if( e.variants.size() == 0 ) {
}
- else if( e.variants.size() == 1 ) {
- }
+ // NOTE: Even with 1 variant, we need to save the value
else if( e.variants.size() <= 128 ) {
rv.fields.push_back(TypeRepr::Field { 0, ::HIR::CoreType::I8 });
}