diff options
author | John Hodge <tpg@ucc.asn.au> | 2017-05-15 16:20:13 +0800 |
---|---|---|
committer | John Hodge <tpg@ucc.asn.au> | 2017-05-15 16:20:13 +0800 |
commit | 0355ff324f85f3f312c1d0204f6a95164541bbc4 (patch) | |
tree | e40295889220713ef7bcc852b06a3cfae06303cf /src/mir | |
parent | 08c7a7e2cb1b8b137a252edf0c615cd81477adf8 (diff) | |
download | mrust-0355ff324f85f3f312c1d0204f6a95164541bbc4.tar.gz |
MIR Gen - Don't emit drop for union values
Diffstat (limited to 'src/mir')
-rw-r--r-- | src/mir/mir_builder.cpp | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/src/mir/mir_builder.cpp b/src/mir/mir_builder.cpp index 89039dd5..625731cc 100644 --- a/src/mir/mir_builder.cpp +++ b/src/mir/mir_builder.cpp @@ -1672,6 +1672,7 @@ void MirBuilder::with_val_type(const Span& sp, const ::MIR::LValue& val, ::std:: } else if( const auto* tep = te.binding.opt_Union() ) { + BUG(sp, "Field access on a union isn't valid, use Downcast instead - " << ty); const auto& unm = **tep; auto maybe_monomorph = [&](const ::HIR::TypeRef& t)->const ::HIR::TypeRef& { if( monomorphise_type_needed(t) ) { @@ -2215,8 +2216,10 @@ void MirBuilder::drop_value_from_state(const Span& sp, const VarState& vs, ::MIR ), (Partial, bool is_enum = false; + bool is_union = false; with_val_type(sp, lv, [&](const auto& ty){ is_enum = ty.m_data.is_Path() && ty.m_data.as_Path().binding.is_Enum(); + is_union = ty.m_data.is_Path() && ty.m_data.as_Path().binding.is_Union(); }); if(is_enum) { @@ -2226,6 +2229,10 @@ void MirBuilder::drop_value_from_state(const Span& sp, const VarState& vs, ::MIR // drop_value_from_state(sp, vse.inner_states[i], ::MIR::LValue::make_Downcast({ box$(lv.clone()), static_cast<unsigned int>(i) })); //} } + else if( is_union ) + { + // NOTE: Unions don't drop inner items. + } else { for(size_t i = 0; i < vse.inner_states.size(); i ++) |